diff --git a/dist/images b/dist/images index ad3ce9e..4118897 120000 --- a/dist/images +++ b/dist/images @@ -1 +1 @@ -./v-1520418874500/images \ No newline at end of file +./v-1521124836513/images \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index f39f8a7..6c32d83 100644 --- a/dist/index.html +++ b/dist/index.html @@ -8,8 +8,8 @@ Taiga - - + + - - + + + iocaine diff --git a/dist/v-1520418874500/js/maps/app.js.map b/dist/v-1520418874500/js/maps/app.js.map deleted file mode 100644 index f05d567..0000000 --- a/dist/v-1520418874500/js/maps/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["app.js"],"names":["configure","i18nInit","init","module","modules","pluginsModules","pluginsWithModule","taiga","this","emojis","window","taigaContribPlugins","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","blockingIntercept","decorators","defaultHeaders","loaderIntercept","originalWhen","preferedLangCode","userInfo","versionCheckHttpIntercept","classNameFilter","when","path","route","resolve","angular","extend","languageLoad","$q","$translate","deferred","defer","then","promise","projectLoaded","projectService","$route","ref","setSection","current","$$route","section","params","pslug","setProjectBySlug","cleanProject","call","templateUrl","controller","controllerAs","loader","title","description","joyride","reloadOnSearch","access","requiresLogin","template","redirectTo","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","errorHandlingService","httpResponseError","response","nextUrl","search","status","config","cancelable","closeAll","error","url","indexOf","force_next","unauthorized","next","reject","responseError","factory","interceptors","push","loaderService","request","logRequest","requestError","rejection","logResponse","$injector","data","version","element","injector","invoke","_this","$confirm","versionErrorMsg","instant","notify","redirectToBlockedPage","responseOk","block","blocked_code","debugInfoEnabled","debugInfo","localStorage","parse","lang","addPart","useLoader","urlTemplate","_version","useSanitizeValueStrategy","addInterpolation","preferredLanguage","fallbackLanguage","getDecorators","each","decorator","provider","messages","moment","locale","ljs","load","defaultMessage","type","email","urlstrict","number","digits","dateIso","alphanum","phone","notnull","notblank","required","regexp","min","max","range","minlength","maxlength","rangelength","mincheck","maxcheck","rangecheck","equalto","linewidth","pikaday","checksley","updateMessages","$log","$rootscope","$auth","$events","$analytics","appMetaService","navigationBarService","lightboxService","un","user","validators","debug","$on","refresh","val","width","lines","valid","nl2br","split","every","line","length","prettyDate","isValid","updateValidators","contribPlugins","adminPlugins","filter","userSettingsPlugins","e","ctx","language","Promise","setScheduler","cb","$evalAsync","setupConnection","isAuthenticated","getUser","initialize","event","getLightboxOpen","preventDefault","start","setAll","addMobileViewport","removeMobileViewport","enableHeader","value","plugin","concat","run","TaigaBase","TaigaController","TaigaService","child","parent","ctor","constructor","key","hasProp","prototype","__super__","hasOwnProperty","bind","fn","me","apply","arguments","superClass","onInitialDataError","xhr","notfound","permissionDenied","q","Base","Service","Controller","DEFAULT_COLOR_LIST","addClass","bindMethods","bindOnce","cancelTimeout","debounce","debounceLeading","defineImmutableProperty","getDefaulColorList","getMatches","getRandomDefaultColor","groupBy","isEmail","isImage","isPdf","joinStr","mixOf","replaceTags","scopeDefer","sizeFormat","slugify","startswith","stripTags","timeout","toString","toggleText","trim","truncate","unslugify","item","i","l","slice","el","className","classList","add","str","breakTag","replace","object","dependencies","methods","keys","forIn","isFunction","bindAll","scope","attr","continuation","delBind","$eval","$watch","Mixed","base","method","mixin","mixins","name","char","toLowerCase","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","isObject","removeKeys","chain","flatten","reduce","cartesianProduct","reduceRight","a","b","y","match","oldImmutable","newImmutable","pathObj","forEach","newValue","toJS","sample","clone","string","regex","index","matches","exec","FiltersMixin","PageMixin","UsFiltersMixin","fillUsersAndRoles","users","roles","activeUsers","computableRoles","is_active","sortBy","activeUsersById","id","usersById","project","members","uniq","includes","loadUsersAndRoles","all","rs","projects","usersList","projectId","rolesList","results","selectFilter","existing","location","compact","isInCurrentRouteParams","noreload","replaceFilter","replaceAllFilters","filters","unselectFilter","newValues","parsedValues","isEmpty","applyStoredFilters","projectSlug","getFilters","storeFilters","filtersHashSuffix","hash","ns","storage","set","formatSelectedFilters","list","urlIds","invalidAppliedTags","invalidTags","selectedFilters","selectedIds","validAppliedTags","it","find","sit","dataType","color","changeQ","filtersReloadContent","generateFilters","removeFilter","addFilter","newFilter","category","selectCustomFilter","customFilter","saveCustomFilter","urlfilters","assigned_to","owner","epic","role","filterRemoteStorageService","storeCustomFiltersName","userFilters","removeCustomFilter","isFilterDataTypeSelected","filterDataType","milestone","loadFilters","storeFiltersName","userstories","filtersData","assignedTo","customFiltersRaw","selected","statuses","tagsWithAtLeastOneElement","tag","count","full_name","owners","epics","subject","filterQ","translate","content","hideEmpty","totalTaggedElements","customFilters","forOwn","AuthService","CancelAccountDirective","ChangeEmailDirective","ChangePasswordFromRecoveryDirective","ForgotPasswordDirective","InvitationDirective","LoginDirective","LoginPage","PublicRegisterMessageDirective","RegisterDirective","currentUserService","$routeParams","decodeURIComponent","clear","removeToken","$inject","rootscope","model","http","urls","config1","currentUserService1","themeService","analytics","userModel","_currentTheme","_getUserTheme","setUserdata","userData","Immutable","fromJS","getAttrs","setUser","setUserId","theme","_setTheme","newTheme","use","_setLocales","make_model","auth","remove","setToken","token","getToken","auth_token","$broadcast","login","logout","removeUser","register","getInvitation","invitations","acceptInvitiationWithNewUser","forgotPassword","changePasswordFromRecovery","changeEmail","cancelAccount","service","$config","templates","templateFn","publicRegisterEnabled","encodeURIComponent","restrict","directive","$window","link","$scope","$el","$attrs","form","onError","onSuccess","submit","Form","trackEvent","href","onKeyUp","target","currentTarget","iscapsLockActivated","loginFormType","validate","username","password","on","prerenderReady","off","onErrorSubmit","onSuccessSubmit","onlyOneErrorElement","_error_message","setErrors","message","success","$params","tokenInParams","loginForm","onErrorSubmitLogin","onErrorSubmitRegister","onSuccessSubmitLogin","onSuccessSubmitRegister","registerForm","submitLogin","submitRegister","invitation","dataLogin","project_slug","project_name","invitation_token","dataRegister","escape","$repo","$model","email_token","queryOne","cancel_token","TaigaMainDirective","onresize","home","not-found","permission-denied","discover","discover-search","forgot-password","change-password","change-email","cancel-account","create-project","create-project-scrum","create-project-kanban","create-project-duplicate","create-project-import","create-project-import-platform","profile","user-profile","blocked-project","project-detail-ref","project-backlog","project-taskboard","project-kanban","project-issues","project-epics","project-search","project-epics-detail","project-userstories-detail","project-tasks-detail","project-issues-detail","project-wiki","project-wiki-list","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-project-values-tags","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-third-parties-gogs","project-admin-contrib","user-settings-user-profile","user-settings-user-change-password","user-settings-user-avatar","user-settings-mail-notifications","user-settings-contrib","$navurls","update","AnimationFrame","Autofocus","Capslock","CheckPermissionDirective","ClassPermissionDirective","DataPickerConfig","LightboxClose","ProjectUrl","Qqueue","QueueModelTransformation","SelectedText","Svg","Template","ToggleCommentDirective","i18n","previousMonth","nextMonth","months","weekdays","weekdaysShort","isRTL","firstDay","parseInt","format","$document","getSelection","selection","createRange","render","permission","removeClass","unObserve","unwatch","tgCheckPermission","$observe","checkPermissions","tgClassPermissionWatchAction","unbindWatcher","negation","my_permissions","classes","animationFrame","performAnimation","tail","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","time","shift","slug","is_backlog_activated","is_kanban_activated","is_wiki_activated","is_issues_activated","lastPromise","qqueue","bindAdd","args","qqueue1","repo","model1","setObject","scope1","prop","attrs","cloneDeep","_attrs","_name","getObj","save","transformation","defered","comment","modified","omit","_modifiedAttrs","assign","$templateCache","lodash","tmp","elm","onClose","svgIcon","svgTitle","svgTitleTranslate","svgTitleTranslateValues","$timeout","$parse","$element","ngShow","focus","preload","spinner","src","onLoad","image","Image","onload","transclude","show","prepend","hide","DetailController","navurls","issue","task","us","wikipage","EventsProvider","EventsService","win","liveAnnouncementService1","rootScope","liveAnnouncementService","processMessage","subscriptions","connected","pendingMessages","missedHeartbeats","heartbeatInterval","WebSocket","info","loc","scheme","stopExistingConnection","protocol","trimStart","host","ws","addEventListener","onOpen","onMessage","removeEventListener","stopHeartBeatMessages","close","notifications","subscribe","desc","$digest","startHeartBeatMessages","heartbeatIntervalTime","maxMissedHeartbeats","reconnectTryInterval","setInterval","Error","sendMessage","cmd","error1","clearInterval","processHeartBeatPongMessage","serialize","msg","send","routingKey","subscription","routing_key","callback","unsubscribe","$get","$win","$conf","$rootScope","FeedbackDirective","$loading","feedbackService","openLightbox","submitButton","currentLoading","create","feedback","finish","open","RelatedTaskAssignedToInlineEditionDirective","RelatedTaskCreateButtonDirective","RelatedTaskCreateFormDirective","RelatedTaskRowDirective","RelatedTasksDirective","$compile","$template","$emojis","templateEdit","templateView","renderEdit","renderView","saveTask","childScope","$new","$destroy","html","keyCode","$modelValue","perms","modify_task","delete_task","emojify","replaceEmojiNameByHtmlImgs","select","askOnDelete","askResponse","$emit","ngModel","require","$tgmodel","newTask","createTask","reset","default_task_status","openNewRelatedTask","$rs","_isEditable","_isVisible","loadTasks","tasks","usId","us_order","showRelatedTasks","avatarService","$ctrl","autoSave","notAutoSave","updateRelatedTask","avatar","member","getAvatar","imgurl","bg","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","user-me","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","project-contact","project-transfer-validate-token","project-transfer-accept","project-transfer-reject","project-transfer-request","project-transfer-start","epic-statuses","userstory-statuses","points","task-statuses","issue-statuses","issue-types","priorities","severities","milestones","epic-upvote","epic-downvote","epic-watch","epic-unwatch","epic-related-userstories","epic-related-userstories-bulk-create","bulk-create-us","bulk-update-us-backlog-order","bulk-update-us-milestone","bulk-update-us-miles-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","task-filters","issues","bulk-create-issues","issues-filters","issue-upvote","issue-downvote","issue-watch","issue-unwatch","wiki","wiki-restore","wiki-links","history/epic","history/us","history/issue","history/task","history/wiki","attachments/epic","attachments/us","attachments/issue","attachments/task","attachments/wiki_page","custom-attributes/epic","custom-attributes/userstory","custom-attributes/task","custom-attributes/issue","custom-attributes-values/epic","custom-attributes-values/userstory","custom-attributes-values/task","custom-attributes-values/issue","webhooks","webhooks-test","webhooklogs","webhooklogs-resend","epics-csv","userstories-csv","tasks-csv","issues-csv","timeline-profile","timeline-user","timeline-project","exporter","importer","locales","applications","application-tokens","stats-discover","importers-trello-auth-url","importers-trello-authorize","importers-trello-list-projects","importers-trello-list-users","importers-trello-import-project","importers-jira-auth-url","importers-jira-authorize","importers-jira-list-projects","importers-jira-list-users","importers-jira-import-project","importers-github-auth-url","importers-github-authorize","importers-github-list-projects","importers-github-list-users","importers-github-import-project","importers-asana-auth-url","importers-asana-authorize","importers-asana-list-projects","importers-asana-list-users","importers-asana-import-project","$urls","providers","toArray","SearchBoxDirective","SearchController","SearchDirective","navUrls","projectService1","loadSearchData","sectionName","loadInitialData","projectName","projectDescription","searchTerm","t","searchResults","term","loadProject","epicStatusById","epic_statuses","issueStatusById","issue_statuses","taskStatusById","task_statuses","severityById","priorityById","usStatusById","us_statuses","loading","_loadSearchData","_promise","abort","reload","$templatecache","$routeparams","linkTable","activeSectionName","applyAutoTab","getActiveSection","lastSearchResults","markSectionTabActive","renderFilterTabs","renderTableContent","tabsDom","maxVal","selectedSection","wikipages","oldElements","oldScope","children","parseHTML","activeSection","trackPage","sectionData","searchText","AnalyticsService","doc","conf","initialized","accountId","pageEvent","trackRoutes","ignoreFirstPageLoad","injectAnalytics","ga","getUrl","ref1","uuid","s","o","g","r","m","createElement","getElementsByTagName","async","parentNode","insertBefore","document","page","action","label","ecViewPlan","plan","plan_id","quantity","position","ecClickPlan","ecListPlans","arg","plans","ecAddToCart","plan_name","plan_price","price","ecConfirmChange","step","ecPurchase","revenue","BindScope","jQuery","CompileHtmlDirective","tgCompileHtml","oldValue","contents","AssignedToDirective","BlockButtonDirective","CreatedByDisplayDirective","DateRangeDirective","DateSelectorDirective","DeleteButtonDirective","ListItemAssignedtoDirective","ListItemEpicStatusDirective","ListItemIssueStatusDirective","ListItemPriorityDirective","ListItemSeverityDirective","ListItemTaskStatusDirective","ListItemTypeDirective","ListItemUsStatusDirective","SprintProgressBarDirective","TgMainTitleDirective","TgProgressBarDirective","UserDisplayDirective","WatchersDirective","renderRange","first","second","endDate","initDate","tgDateRange","valFirst","valSecond","datePickerConfigService","selectedDate","datePickerConfig","merge","field","picker","Pikaday","destroy","setDate","renderProgress","percentage","visual_percentage","hasClass","css","tgSprintProgressbar","sprint","closedPoints","totalPoints","closed_points","total_points","round","owner_extra_info","created_date","tgUserId","$modelTransform","deleteWatcher","isEditable","renderWatchers","requiredPerm","watchers","transform","watcherId","watcherIds","revert","pull","$currentUserService","renderAssignedTo","assignedObject","fullName","isIocaine","isUnassigned","assigned_to_extra_info","is_iocaine","fullNameVisible","ask","instance","is_blocked","onDeleteGoToUrl","onDeleteTitle","subtitle","tgListitemEpicStatus","tgListitemUsStatus","tgListitemTaskStatus","tgListitemAssignedto","tgListitemIssueStatus","issueTypeById","domNode","tgListitemType","priority","tgListitemPriority","severity","tgListitemSeverity","tgProgressBar","i18nSectionName","ConfirmService","NOTIFICATION_MSG","light-error","lightboxSelector","ok","askChoice","choices","replacement","warning","choicesField","append","icon","detailImage","svgContainer","useSVG","$","createElementNS","setAttributeNS","appendChild","spin","stop","percent","body","selector","tsem","one","CustomAttributeValueDirective","CustomAttributesValuesController","CustomAttributesValuesDirective","DATE_TYPE","MULTILINE_TYPE","RICHTEXT_TYPE","TEXT_TYPE","TYPE_CHOICES","URL_TYPE","confirm","objectId","customAttributes","customAttributesValues","loadCustomAttributesValues","getAttributeValue","attribute","attributeValue","attributes_values","updateAttributeValue","attributesValues","$templates","$storage","collapsedHash","$ctrls","collapsed","toggleCollapse","requiredEditionPerm","$selectedText","wysiwygService","setFocusAndSelectOnInputField","edit","editable","attributeHtml","getHTML","onSelect","saveCustomRichText","markdown","cancelCustomRichText","tgCustomAttributeValue","customAttributeValue","stopPropagation","EmojisService","replaceEmojiNameByImgs","replaceImgsByEmojiName","getEmojiByName","getEmojiById","searchByName","emojisById","keyBy","emojisByName","emoji","emojiId","emojiIds","regexImgs","escapeRegExp","EstimationsService","LbUsEstimationDirective","UsEstimationDirective","$tgEstimationsService","estimationProcess","onSelectedPointForRole","roleId","pointId","$setViewValue","mainTemplate","calculateTotalPoints","calculateRoles","$watchCollection","$qqueue","EstimationProcess","pointsTemplate","$el1","us1","project1","bindClickEvents","pointsById","notNullValues","values","v","k","acc","num","pointObj","renderPointsSelector","siblings","popover","horizontalList","maxPointLength","pop","point","some","horizontal","closest","offset","top","height","clientHeight","byRefFilter","darkerFilter","defaultFilter","inArray","markdownToHTML","momentFormat","momentFromNow","toMutableFilter","yesNoFilter","defaultValue","without_suffix","fromNow","memoizedMutable","toMutable","js","memoize","List","$filterFilter","cleanRef","substr","luminosity","black","c","j","newColor","white","wysiwigService","$filter","arrayFilter","listItem","AssignedToLightboxDirective","BlockLightboxDirective","BlockingMessageInputDirective","CreateBulkUserstoriesDirective","CreateEditUserstoryDirective","LightboxDirective","LightboxKeyboardNavigationService","LightboxLeaveProjectWarningDirective","LightboxService","WatchersLightboxDirective","onEsc","docEl","lightboxContent","not","firstField","activeElement","blur","code","which","$applyAsync","removeAttr","lightboxEl","dispatch","prev","trigger","$attr","visible","$tgrepo","unblock","finishCallback","blocked_note","watch","ngmodel","attachmentsService","attachmentsToAdd","attachmentsToDelete","createAttachments","deleteAttachments","resetAttachments","createEditUs","isNew","addAttachment","attachment","deleteAttachment","addTag","inserted","itemtags","projectTags","tags_colors","deleteTag","statusList","usStatusList","attachments","is_archived","createEditUsOpen","team_requirement","client_requirement","promises","upload","file","broadcastEvent","include_attachments","include_tasks","getByRef","isModified","keydown","statusId","bulk","bulkCreate","lightboxKeyboardNavigationService","closeLightbox","filterUsers","normalizeString","selectedItem","selectedUser","usersTemplate","normalizedString","toUpperCase","visibleUsers","partial","showMore","assignedToId","searchingText","usersSearch","getFilteredUsers","_filterUsers","Loader","LoaderDirective","tgLoader","onStart","onEnd","autoClose","lastResponseDate","pageLoaded","requestCount","startLoadTime","minTime","force","diff","endTime","timeoutValue","intervalAuto","auto","LoadingDirective","TgLoadingService","settings","removeClasses","classess","timeoutId","tgLoading","showLoading","RelatedTaskStatusDirective","UsStatusDirective","usStatusDom","usStatusDomParent","tgUsStatus","onUpdate","selectionTemplate","updateTaskStatus","taskStatusDom","taskStatusDomParent","tgRelatedTaskStatus","closePopover","isVisible","docViewBottom","docViewLeft","docViewRight","docViewTop","docViewWidth","elemBottom","elemLeft","elemRight","elemTop","elemWidth","display","visibility","scrollTop","left","fadeOut","fadeIn","ExceptionHandlerFactory","ravenConfig","Raven","install","cause","captureException","ColorizeTagsBacklogDirective","LbTagLineDirective","TagsDirective","formatter","parser","isArray","$formatters","$parsers","tgColorizeBacklogTags","COMMA_KEY","ENTER_KEY","autocomplete","templateTags","addValue","deleteValue","hideSaveButton","renderTags","resetInput","saveInputTag","showSaveButton","withoutColors","has","tagsColors","style","fromCharCode","Awesomplete","CreateEditSprint","createSprint","getLastSprint","hasErrors","resetSprint","ussToAdd","newSprint","estimated_start","estimated_finish","estimated_end","copy","realClone","sprintsCounter","sprints","__all__","milestonesCounter","openSprints","sortedSprints","closed","uss","estimatedFinish","estimatedStart","lastSprint","lastSprintNameDom","editSprint","BacklogController","BacklogDirective","BurndownBacklogGraphDirective","TgBacklogProgressBarDirective","ToggleBurndownVisibility","UsPointsDirective","UsRolePointsSelectorDirective","params1","events","rs2","modelTransform","backlogOrder","milestonesOrder","disablePagination","firstLoadComplete","showTags","activeFilters","showGraphPlaceholder","displayVelocity","initializeEventHandlers","getShowTags","loadUserstories","loadProjectStats","ussToMove","loadSprints","loadClosedSprints","findIndex","moveUs","unloadClosedSprints","initializeSubscription","routingKey1","routingKey2","loadAllPaginatedUserstories","toggleShowTags","storeShowTags","toggleActiveFilters","toggleVelocityForecasting","visibleUserStories","forecastedStories","stats","defined_points","completedPercentage","total_milestones","calculateForecasting","setMilestonesOrder","len1","results1","user_stories","sprint_order","closedSprints","totalClosedMilestones","closedSprintsById","totalMilestones","totalOpenMilestones","sprintsById","currentSprint","findCurrentSprint","reverse","resetPagination","pageSize","loadingUserstories","storeQueryParams","listUnassigned","header","backlog_order","loadBacklog","backlog_points_sum","current_sum","assigned_points","speed","closedMilestones","total_closed_milestones","prepareBulkUpdateData","uses","us_id","order","usList","newUsIndex","newSprintId","afterDestination","beforeDestination","currentSprintId","len2","len3","len4","len5","len6","modifiedUs","n","oldSprintId","options","orderField","orderList","p","previous","previousWithTheSameOrder","ref2","setOrders","setPreviousOrders","startIndex","listIt","moveIt","bulkUpdateMilestone","bulkUpdateBacklogOrder","set-orders","updateUserStoryStatus","editUserStory","$event","deleteUserStory","without","addNewUs","default_us_status","addNewSprint","currentDate","end","doomLineTemplate","linkDoomLine","linkFilters","linkToolbar","openFilterInit","showHideFilter","showHideTags","addDoomLineDom","getUsItems","reloadDoomLine","removeDoomlineDom","domElement","before","rowElements","checkSelected","getUsToMove","lastChecked","moveToCurrentSprint","moveToLatestSprint","moveUssToSprint","shiftPressed","ussDom","itemScope","selectedUss","extraPoints","totalExtraPoints","ussCurrent","union","moveToSprintDom","selectedUsDom","toggleClass","shiftKey","elements","nextAll","prevAll","nextUntil","prevUntil","ussToMoveList","sidebar","hideText","showText","filtersSearch","numberOfRoles","roleName","is","rolScope","$tgTemplate","rolesTemplate","bindClickElements","filteringRoleId","renderRolesSelector","selectedRoleId","updatingSelectedRoleId","tgBacklogUsPoints","popRolesDom","firstLoad","toggleGraph","isBurndownGraphCollapsed","redrawChart","dataToDraw","client_increment_line","colors","evolution_line","milestonesRange","optimal_line","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","BacklogSortableDirective","deleteElement","drake","initIsBacklog","scroll","dragula","copySortSource","isContainer","contains","moves","container","isChecked","dragMultiple","dragMultipleItems","firstElement","isBacklog","sameContainer","autoScroll","margin","pixels","scrollWhenOutside","down","dragging","BacklogSprintDirective","BacklogSprintHeaderDirective","ToggleExcludeClosedSprintsVisualization","slideOptions","sprintTableMinHeight","toggleSprint","duration","easing","sprintArrow","sprintTable","tgBacklogSprint","slideToggle","compiledTemplate","estimatedDateRange","taskboardUrl","templateScope","excludeClosedSprints","loadingElm","after","SprintGraphDirective","days","day","unshift","d","optimal_points","open_points","tickSize","last","mode","daysNames","formattedDate","roundedValue","CreateBulkTasksDirective","CreateEditTaskDirective","tagsToAdd","sprintId","user_story","createEditTaskOpen","console","TaskboardController","TaskboardDirective","TaskboardSquishColumnDirective","rs1","q1","taskboardTasksService","openFilter","usTasks","_setMeta","setZoom","zoomLevel","zoom","previousZoomLevel","isFirstLoad","resetFolds","zoomLoading","startDate","completedPoints","completedPointsSum","totalPointsSum","openTasks","totalTasks","total_tasks","refreshTagsColors","replaceModel","taskMove","onAssignedToChanged","userid","taskModel","loadTaskboard","loadSprintStats","loadSprint","pointsList","roleById","taskStatusList","remainingPointsSum","remainingTasks","res","completed_points","completed_tasks","setUserstories","sslug","setRolePoints","showPlaceHolder","tasksRaw","editTask","getTask","getIn","editingTask","oldStatusId","moveUpdateData","getTaskModel","move","status__is_archived","set_orders","assignOrders","addNewTask","toggleFold","changeTaskAssignedTo","getPoint","getRole","pointsByRole","poitnId","tableBodyDom","tableHeaderDom","scrollLeft","avatarWidth","maxColumnWidth","getCeilWidth","recalculateStatusColumnWidth","recalculateTaskboardWidth","refreshTaskboardTableWidth","setStatusColumnWidth","statusesFolded","getStatusColumnModes","usFolded","getUsRowModes","foldStatus","storeStatusColumnModes","foldUs","storeUsRowModes","tasksMatrixSize","sqrt","column","ctrl","columnWidths","columns","totalWidth","outerWidth","total","statusFoldedWidth","TaskboardSortableDirective","containers","filterError","itemEl","newParentScope","oldParentScope","tdom","$tgConfirm","accepts","cancel","itemIndex","itemTask","newStatusId","newUsId","oldUsId","parentEl","st","TaskboardTasksService","foldStatusChanged","Map","taskId","refreshRawOrder","taskboard_order","invert","findedTask","findedIndex","usItem","taksWithoutMoved","taskByUsStatus","task_id","images","thumbnail_card_url","colorized_tags","KanbanUserstoriesService","userstoriesRaw","archivedStatus","statusHide","usByStatus","addArchivedStatus","isUsInArchivedHiddenStatus","getUsModel","hideStatus","deleteStatus","showStatus","getStatus","toDelete","archived","difference","kanban_order","initialLength","setNextOrders","usByStatusWithoutMoved","bulkOrders","moveToEnd","getUs","findedUs","usModel","KanbanArchivedStatusHeaderDirective","KanbanArchivedStatusIntroDirective","KanbanController","KanbanDirective","KanbanSquishColumnDirective","KanbanWipLimitDirective","kanbanUserstoriesService1","kanbanUserstoriesService","cleanSelectedUss","toggleSelectedUs","openArchived","loadUserStoriesForStatus","hideUserStoriesForStatus","editUs","editingUserStory","changeUsAssignedTo","listAll","filteredStatus","loadKanban","bulkUpdateKanbanOrder","hideArchivedText","showArchivedText","hidden","tgKanbanArchivedStatusHeader","userStories","hiddenUserStoriexText","updateIntroText","tgKanbanArchivedStatusIntro","hasArchived","itemUs","userStoriesLoaded","updateTableWidth","folds","kanban","redrawWipLimit","tgKanbanWipLimit","wip_limit","KanbanSortableDirective","dropTarget","finalUsList","newStatus","oldStatus","EpicDetailController","EpicStatusButtonDirective","EpicStatusDisplayDirective","epicRef","epicref","initializeOnDeleteGoToUrl","epicSubject","epicStatus","statusById","epicDescription","description_html","loadEpic","immutableProject","immutableEpic","epicId","commentModel","neighbors","previousUrl","listInEpic","onUpvote","upvote","onDownvote","downvote","onWatch","onUnwatch","onSelectColor","onSelectColorError","onSelectColorSuccess","is_closed","IssueDetailController","IssuePriorityButtonDirective","IssueSeverityButtonDirective","IssueStatusButtonDirective","IssueStatusDisplayDirective","IssueTypeButtonDirective","PromoteIssueToUsButtonDirective","issueRef","issueref","ref3","issueSubject","issueStatus","issueType","typeById","issueSeverity","issuePriority","issueDescription","loadIssue","issue_types","typeList","severityList","priorityList","issueId","typees","severityes","priorityes","generated_from_issue","CreateBulkIssuesDirective","CreateIssueDirective","createIssueOpen","default_issue_status","default_issue_type","default_priority","default_severity","IssueAssignedToInlineEditionDirective","IssueStatusInlineEditionDirective","IssuesController","IssuesDirective","loadIssues","voting","myFiltersHashSuffix","orderBy","order_by","types","issueStatusList","issueTypes","loadIssuesRequests","models","paginatedBy","addNewIssue","addIssuesInBulk","upVoteIssue","downVoteIssue","getOrderBy","linkOrdering","linkPagination","$pagEl","afterCurrent","atBegin","atEnd","beforeCurrent","getNumPages","renderPagination","numPages","cpage","pages","showPrevious","showNext","pagenum","colHeadElement","currentOrder","svg","finalOrder","newOrder","updateIssueStatus","issueStatusDom","issueStatusDomParent","tgIssueStatusInlineEdition","updateIssue","tgIssueAssignedToInlineEdition","updatedIssue","UsClientRequirementButtonDirective","UsStatusButtonDirective","UsStatusDisplayDirective","UsTeamRequirementButtonDirective","UserStoryDetailController","configService","usRef","usref","tribeEnabled","tribeHost","closedTasks","progressPercentage","userStoryRef","userStorySubject","userStoryStatus","userStoryPoints","userStoryDescription","userStoryClosedTasks","userStoryTotalTasks","userStoryProgressPercentage","allClosed","loadUs","httpParams","kanbanStaus","noMilestone","pick","onTribeInfo","publishDesc","publishTitle","alt","canEdit","isRequired","TaskDetailController","TaskIsIocaineButtonDirective","TaskStatusButtonDirective","TaskStatusDisplayDirective","taskRef","taskref","taskSubject","taskStatus","taskDescription","loadTask","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","userRoles","filtersQ","lightboxFactory","leaveConfirm","confirm_leave_project_text","leave_project_text","leave","loadProjects","class","isCurrentUser","WikiDetailController","WikiSummaryDirective","WikiWysiwyg","moveLink","loadWiki","wikiSlug","linksVisible","wikiPageName","wikiPageContent","totalEditions","editions","lastModifiedDate","modified_date","getBySlug","wikiId","loadWikiLinks","listLinks","wikiLinks","selectedWikiLink","checkLinksPerms","splice","saveAll","last_modifier","wikiPage","attachmentsFullService","wikiHistoryService","uploadFile","editableDescription","saveDescription","loadHistoryEntries","uploadFiles","files","storageKey","WikiNavDirective","linkWikiLinks","addWikiLinkPermission","deleteWikiLinkPermission","direction","mirrorContainer","linkId","parents","newLink","loadPromise","WikiPagesListController","loadWikiPages","ChangeOwnerLightboxController","ChangeOwnerLightboxDirective","LbRequestOwnershipDirective","LightboxAddMembersWarningMessageDirective","TransferProjectStartSuccessDirective","confirmService","transferRequest","lightboxService1","commentOpen","limit","getUsers","currentOwnerId","userSearch","selectUser","transferStart","bindToController","MembershipsController","MembershipsDirective","MembershipsRowActionsDirective","MembershipsRowAdminCheckboxDirective","MembershipsRowAvatarDirective","MembershipsRowRoleSelectorDirective","NoMoreMembershipsExplanationDirective","lightboxFactory1","i_am_admin","canAddUsers","max_memberships","total_memberships","httpFilters","getUrlFilters","membership","is_user_active","addNewMembers","showLimitUsersWarningMessage","pending","user_email","isOwner","is_owner","tgMembershipsRowAvatar","tgMembershipsRowAdminCheckbox","inputId","is_admin","roleList","selectedRole","tgMembershipsRowRoleSelector","newRole","activedTemplate","pendingTemplate","tgMembershipsRowActions","resendInvitation","defaultMsg","fetchProject","AdminNavigationDirective","tgAdminNavigation","AdminProjectChangeOwnerDirective","AdminProjectRequestOwnershipDirective","AdminProjectRestrictionsDirective","CsvEpicDirective","CsvExporterController","CsvExporterEpicsController","CsvExporterIssuesController","CsvExporterTasksController","CsvExporterUserstoriesController","CsvIssueDirective","CsvTaskDirective","CsvUsDirective","ProjectDefaultValuesDirective","ProjectExportDirective","ProjectLogoDirective","ProjectLogoModelDirective","ProjectModulesDirective","ProjectProfileController","ProjectProfileDirective","tgAuth","epicStatusList","issueTypesList","prioritiesList","severitiesList","openDeleteLightbox","privacyChanged","isAttributeModified","newUrl","is_private","initializeFields","newVal","oldVal","videoconferences_extra_data","videoconferences","isVideoconferenceActivated","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","errorMsg","_generateUuid","setCsvUuid","csvUrl","resolveAbsolute","csvUuid","regenerateUuid","sectionTitle","showSizeInfo","click","logoAttachment","changeLogo","removeLogo","modelSetter","tgProjectLogoModel","requestOwnership","changeOwner","project-id","active-users","current-owner-id","ColorSelectionDirective","ProjectCustomAttributesController","ProjectCustomAttributesDirective","ProjectTagsController","ProjectTagsDirective","ProjectValuesController","ProjectValuesDirective","ProjectValuesSectionController","moveValue","loadValues","resource","listValues","maxValueOrder","maxBy","itemValue","linkDragAndDrop","linkValue","goToBottomList","initializeNewValue","initializeTextTranslations","objName","saveNewValue","saveValue","valueType","objname","addNewElementText","table","formEl","row","editionRow","option","onSucces","moveTo","colorList","allowEmpty","tgAllowEmpty","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","mixingClass","cancelMixingTags","confirmMixingTags","toggleMixingFromTags","startMixingTags","editTag","createTag","filterAndSortTags","loadTags","projectTagsAll","tagsFilter","from_tag","to_tag","loadingDelete","mixingTags","toTag","fromTags","loadingMixing","mixTags","initializeMixingTags","initializeTagsFilter","originalTag","loadingEdit","loadingCreate","EditRoleDirective","NewRoleDirective","RolePermissionsDirective","RolesController","RolesDirective","_disableComputable","_enableComputable","anyComputableRole","computable","loadRoles","public_permission","external_user","public_permissions","forceLoadProject","askOnError","askOnSuccess","toggleComputable","toggleView","toggle","DEFAULT_PERMISSIONS","insertPosition","baseTemplate","categoryTemplate","resumeTemplate","generateCategoriesFromRole","renderCategory","renderPermissions","renderResume","categories","epicPermissions","isPermissionEditable","issuePermissions","milestonePermissions","setActivePermissions","setActivePermissionsPerCategory","taskPermissions","userStoryPermissions","wikiPermissions","active","cat","activePermissions","getActivePermissions","categoryId","anon_permissions","BitbucketController","BitbucketWebhooksDirective","GithubController","GithubWebhooksDirective","GitlabController","GitlabWebhooksDirective","GogsController","GogsWebhooksDirective","NewWebhookDirective","SelectInputText","ValidOriginIpsDirective","WebhookDirective","WebhooksController","loadWebhooks","openHistory","showEditMode","showVisualizationMode","updateLogs","updateShowHideHistoryText","webhook","tgWebhook","validStatus","prettySentHeaders","toPairs","request_headers","prettySentData","request_data","created","logs_counter","logs","historyElement","textElement","test","resend","addWebhookDOMNode","formDOMNode","loadModules","github","gitlab","bitbucket","saveAttribute","$ngModel","gogs","DeleteProjectDirective","projectToDelete","BindHtmlDirective","BindOnceAltDirective","BindOnceBindDirective","BindOnceHrefDirective","BindOnceHtmlDirective","BindOnceRefDirective","BindOnceSrcDirective","BindOnceTitleDirective","BindTitleDirective","tgBoBind","tgBoHtml","tgBoRef","tgBoSrc","tgBoHref","tgBoAlt","tgBoTitle","tgTitleHtml","tgBindHtml","ConfigurationService","ContribController","ContribUserSettingsController","currentPlugin","head","FiltersStorageService","HttpService","cacheFactory","cache","removeAll","locationFactory","lastRoute","Model","ModelService","dataTypes","_dataTypes","setAttrs","_isModified","applyCasts","attrName","castMethod","castName","casts","getIdAttrName","getName","setAttr","getter","self","setter","enumerable","configurable","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","resolveUrlForModel","idAttrName","resolveUrlForAttributeModel","extraParams","_data","_status","returnHeaders","queryMany","httpOptions","enablePagination","queryOneAttribute","queryOneRaw","queryPaginated","queryOnePaginatedRaw","StorageService","_default","serializedValue","getItem","setItem","removeItem","UrlsService","fmt","mainUrl","trimEnd","resourceProvider","_get","userstory","_list","hashSuffix","getQueryParams","editComment","activityId","commentData","getCommentHistory","deleteComment","undeleteComment","history","listInAllProjects","project_id","bulk_issues","hashSuffixStatusColumnModes","hashSuffixStatusViewModes","mdrender","listByUser","bulkCreateMemberships","invitation_extra_text","bulk_memberships","notifyPolicies","listByMember","memberId","bulkUpdateOrder","bulkData","regenerate_epics_csv_uuid","regenerate_userstories_csv_uuid","regenerate_tasks_csv_uuid","regenerate_issues_csv_uuid","from_tags","statusUpdater","complete","failed","maxFileSize","uploadComplete","uploadFailed","uploadProgress","fileName","fileSize","evt","loaded","uploadedSize","totalSize","responseText","getResponseHeader","isPrivate","FormData","XMLHttpRequest","setRequestHeader","transformRequest","identity","deferredAbort","get_all","noop","u","hashSuffixUsRowModes","userStoryId","milestone_id","bulk_tasks","bulkUpdateTaskTaskboardOrder","changeAvatar","removeAvatar","changePassword","currentPassword","newPassword","current_password","userSettings","contacts","page_size","status_id","bulk_stories","milestoneId","webhookId","webhooklogId","UserChangePasswordController","UserChangePasswordDirective","newPassword1","newPassword2","DeleteUserDirective","TaigaAvatarModelDirective","UserAvatarDirective","UserProfileDirective","UserSettingsController","getLan","getTheme","maxFileSizeMsg","availableThemes","avatarAttachment","tgAvatarModel","UserSettingsNavigationDirective","tgUserSettingsNavigation","UserNotificationsController","UserNotificationsDirective","UserNotificationsListDirective","policy","policyIndex","prev_level","notify_level","AssignedItemDirective","AssignedToSelectorController","assigned","_getAssignedMember","_filterAssignedMember","assignedMember","nonAssignedMembers","AssignedToSelectorDirective","onRemoveAssigned","onAssignTo","AssignedToController","has_permissions","_closeAndRemoveAssigned","_closeAndAssign","onSelectAssignedTo","on-remove-assigned","on-assign-to","assignTo","AttachmentLinkDirective","attachmentsPreviewService","tgAttachmentLink","fileId","AttachmentGalleryDirective","onDelete","AttachmentController","is_deprecated","editMode","mergeIn","AttachmentDirective","AttachmentsDropDirective","eventAttr","tgAttachmentsDrop","dataTransfer","originalEvent","AttachmentsFullController","deprecatedsCount","attachmentsVisible","deprecatedsVisible","uploadingAttachments","objId","setMode","toggleDeprecatedsVisible","addAttachments","loadAttachments","toDeleteAttachment","errorMessage","reorderAttachment","updateAttachment","toUpdateAttachment","hasPermission","editPermission","showAttachments","AttachmentsFullDirective","AttachmentsFullService","_attachments","_deprecatedsCount","_attachmentsVisible","_deprecatedsVisible","regenerate","uploading","from_comment","oldIndex","setIn","oldAttachment","AttachmentsPreviewController","getCurrent","hasPagination","getIndex","attachmentIndex","findLast","AttachmentPreviewLightboxDirective","AttachmentsPreviewService","AttachmentsSimpleController","onAdd","AttachmentsSimpleDirective","AttachmentSortableDirective","tgAttachmentsSortable","AutoSelectDirective","AvatarDirective","attributeName","tgAvatarBig","avatarBig","BelongToEpicsDirective","isIterable","immutable_epics","BindCode","$sce","wysiwygCodeHightlighterService","compile","tElement","tAttrs","tgBindCodeGetter","tgBindCodeWatch","tgBindCode","$$addBindingClass","$$addBindingInfo","getTrustedHtml","addHightlighter","BoardZoomDirective","levels","CardSlideshowController","cardSlideshowDirective","CardController","hasTasks","hasVisibleAttachments","onToggleFold","getClosedTasks","closedTasksPercent","getPermissionsKey","_setVisibility","related","slides","isRelatedTasksVisible","isSlideshowVisible","getNavKey","cardDirective","onClickAssignedTo","onClickEdit","ClickInputFile","inputFile","ColorSelectorController","checkIsColorRequired","displayColorList","userCanChangeColor","isColorRequired","dropRight","setColor","customColor","resetColor","initColor","toggleColorList","onSelectDropdownColor","onKeyDown","ColorSelectorDirective","_timeout","mouseenter","mouseleave","StoryHeaderController","loadingSubject","originalSubject","_checkNav","_checkPermissions","editSubject","saveSubject","onEditSubjectError","onEditSubjectSuccess","DetailHeaderDirective","FileChangeDirective","tgFileChange","FilterRemoteStorageService","myFilters","innerPromise","FilterSlideDownDirective","ngIf","contentHeight","wrapperHeight","outerHeight","context","nextSibling","max-height","FilterController","opened","customFilterForm","customFilterName","toggleFilterCategory","filterName","isOpen","onSaveCustomFilter","onChangeQ","onRemoveFilter","filterCategory","onAddFilter","onRemoveCustomFilter","onSelectCustomFilter","isFilterSelected","FilterDirective","vm","filtersForm","$dirty","defaultQ","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","backlog","check","joyRide","joyRides","KanbanBoardZoomDirective","getZoomView","zooms","zoomIndex","onZoomChange","LiveAnnouncementDirective","defineProperties","LiveAnnouncementService","ProjectLogoBigSrcDirective","projectLogoService","logo","projectLogo","getDefaultProjectLogo","ProjectLogoSmallSrcDirective","ProjectMenuController","menu","_getActiveSection","_setVideoConference","_setMenuPermissions","videoconferenceUrl","_videoConferenceUrl","indexBacklog","indexKanban","oldSectionName","sectionsBreadcrumb","baseUrl","ProjectMenuDirective","projectChange","fixed","TagOptionDirective","containerHeight","selectedPosition","onSelectTag","colorArray","TagLineCommonController","tagLineService","disableColorSelection","newTag","_createColorsArray","projectTagColors","createColorsArray","displayTagInput","addNewTag","onAddTag","selectColor","TagLineCommonDirective","tagName","loadingAddTag","loadingRemoveTag","onDeleteTag","TagLineController","onDeleteTagError","onDeleteTagSuccess","onAddTagError","onAddTagSuccess","TagLineDirective","TagLineService","myPermissions","projectPermissions","TagDirective","hasPermissions","TaskboardZoomDirective","TermsOfServiceAndPrivacyPolicyNoticeDirective","privacyPolicyUrl","termsOfServiceUrl","TribeButtonDirective","locationService","port","TribeLinkedDirective","gigTitle","gigId","VoteButtonController","isMouseOver","showTextWhenMouseIsOver","showTextWhenMouseIsLeave","toggleVote","is_voter","_downvote","_upvote","VoteButtonDirective","WatchButtonController","openWatchers","getPerms","toggleWatch","is_watcher","_unwatch","_watch","WatchButtonDirective","attributes","environment","CommentEditWysiwyg","CommentWysiwyg","saveComment","onAddComment","onChange","CustomFieldEditWysiwyg","ItemWysiwyg","WysiwygCodeHightlighterService","Prism","plugins","customClass","prefix","getLanguages","languages","getJSON","_languages_","getLanguageInClassList","lan","loadLanguage","replaceCodeBrToNl","replaceWith","hightlightCode","highlightElement","codes","WysiwygCodeLightbox","textarea","querySelector","codeLanguage","onSave","WysiwygMentionService","cancelablePromise","searchEmoji","filteredEmojis","searchEmojiByName","searchUser","searchProps","searchItem","searchTypes","items","mention","Medium","wysiwygMentionService","AlignRightButton","CodeButton","CustomPasteHandler","addCodeBlockAndHightlight","getIcon","getRangeCodeBlock","isCodeBlockSelected","oldIsBlockContainer","refreshCodeBlocks","removeCodeBlockAndHightlight","removeSelections","removeAllRanges","endContainer","parentsUntil","mediumInstance","pre","innerText","replaceChild","checkContentChanged","extract","startContainer","insertAfter","extractContents","mainChildren","preList","innerHTML","removeChild","querySelectorAll","setAttribute","nextElementSibling","nodeName","MediumEditor","extensions","button","toolbar","buttons","contentDefault","handleClick","getButton","getSelectionRange","commonAncestorContainer","textAlign","execCommand","tagNames","getExtensionByName","hideToolbar","paste","doPaste","pastedHTML","pastedPlain","util","htmlEntities","insertHTMLCommand","isBlockContainer","cancelWithConfirmation","change","clean","codeBlockSelected","discardLocalStorage","editorMarkdown","editorMedium","getCurrentContent","isDraft","isEditOnly","isOutdated","localSave","notPersist","saveEnd","setEditMode","setHtmlMedium","throttleChange","updateMarkdownWithCurrentHtml","uploadEnd","editonly","codeEditorVisible","codeLans","saveSnippet","codePre","saving","outdated","onCancel","pasteHTML","store","getMarkdown","throttle","imageDragging","placeholder","autolist","AutoList","alignright","mediumMention","MentionExtension","getItems","mentionCb","changeMarkdown","getAttribute","onUploadFile","currentCodeLanguage","unwatchLoader","WysiwygService","pipeLinks","p1","linkParams","replaceUrls","links","createTextNode","searchWikiLinks","removeTrailingListBr","cleanIssueConverter","codeLanguageConverter","node","firstChild","textContent","toMarkdown","gfm","converters","parseMentionMatches","prevChar","serviceName","tagBuilder","charAt","lastIndex","groupIndex","Autolinker","Mention","matchedText","autoLinkHTML","autolinker","matchRegexStr","matcher","matcherRegexes","twitter","hashtag","replaceFn","profileUrl","getType","getMention","getHashtag","parseMatches","md","breaks","markdownit","markdownitLazyHeaders","DiscoverHomeOrderByController","is_open","week","month","year","currentText","currentOrderBy","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","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","_discoverParams","discover_mode","_params","getProjects","is_featured","CreateEpicController","epicsService","newEpic","default_epic_status","createEpic","validateForm","onCreateEpic","setFormErrors","CreateEpicDirective","errors","EpicRowController","displayUserStories","displayAssignedTo","displayStatusList","loadingStatus","_calculateProgressBar","progress","canEditEpics","toggleUserStoryList","listRelatedUserStories","epicStories","updateStatus","updateEpicStatus","updateAssignedTo","assignLoader","updateEpicAssignedTo","EpicRowDirective","EpicsDashboardController","setfn","isEpicsDashboardEnabled","fetchEpics","notFound","canCreateEpics","on-create-epic","EpicsSortableDirective","tgEpicsSortable","EpicsTableController","displayOptions","displayVotes","votes","_disablePagination","_loadingEpics","toggleEpicTableOptions","reorderEpic","nextPage","hoverEpicTableOption","timer","hideEpicTableOption","updateViewOptions","EpicsTableDirective","StoryRowController","totalTasksCompleted","story","StoryRowDirective","EpicsService","resources","xhrError","_epics","_page","epicData","withoutMoved","fromPairs","epics_order","reorder","reorderRelatedUserstory","epicUserstories","userstoryId","replaceEpic","RelatedUserStoriesController","showCreateRelatedUserstoriesLightbox","showRelatedUserStoriesSection","userCanSort","loadRelatedUserstories","RelatedUserstoriesCreateController","projectUserstories","filterUss","selectedProjectId","filterText","excludeIds","filteredData","saveRelatedUserStory","selectedUserstoryId","onSavedRelatedUserstory","validateExistingUserstoryForm","setExistingUserstoryFormErrors","addRelatedUserstory","bulkCreateRelatedUserStories","userstoriesText","onCreatedRelatedUserstory","validateNewUserstoryForm","setNewUserstoryFormErrors","RelatedUserstoriesCreateDirective","existingUserstoryForm","newUserstoryForm","showLightbox","selectProject","selectedUserstory","searchUserstory","relatedUserstoriesText","selectedProject","onUpdateSearchUserstory","RelatedUserstoriesSortableDirective","tgRelatedUserstoriesSortable","RelatedUserStoriesDirective","RelatedUserstoryRowController","setAvatarData","getAssignedToFullNameDisplay","onDeleteRelatedUserstory","deleteRelatedUserstory","RelatedUserstoryRowDirective","ExternalAppController","externalAppsService","loginUrl","createApplicationToken","_getApplicationToken","_redirect","_applicationId","application","_state","state","_user","_application","loginWithAnotherUserUrl","applicationToken","getApplicationToken","back","authorizeApplicationToken","ExternalAppsService","applicationId","externalapps","FeedbackService","sendFeedback","CommentController","permissionService","hiddenDeletedComment","showDeletedComment","hideDeletedComment","checkCancelComment","onEditMode","commentId","canEditDeleteComment","pk","onEditComment","displayCommentHistory","CommentDirective","editing","deleting","onDeleteComment","onRestoreDeletedComment","CommentsController","initializePermissions","canAddCommentPermission","CommentsDirective","comments","LightboxDisplayHistoricController","_loadHistoric","commentHistoryEntries","LightboxDisplayHistoricDirective","HistoryEntryDirective","entry","HistoryTabsDirective","showCommentTab","showActivityTab","onActiveComments","onActiveActivities","onOrderComments","activeTab","commentsNum","activitiesNum","onReverse","HistorySectionController","viewComments","_loadHistory","_getComments","_getActivities","activities","values_diff","showHistorySection","toggleEditMode","onActiveHistoryTab","restoreDeletedComment","addComment","HistorySectionDirective","ActivitiesDiffController","diffTags","diffRemoveTags","diffAddTags","HistoryDiffDirective","HistoryDirective","DutyDirective","duty","getDutyType","HomeController","HomeService","_attachProjectInfoToWorkInProgress","workInProgress","projectsById","_attachProjectInfoToDuty","_duties","_getValidDutiesAndAttachProjectInfo","watching","objType","duties","dutyType","getWorkInProgress","assignedEpicsPromise","assignedIssuesPromise","assignedTasksPromise","assignedUserStoriesPromise","params_epics","params_issues","params_tasks","params_uss","projectsPromise","watchingEpicsPromise","watchingIssuesPromise","watchingTasksPromise","watchingUserStoriesPromise","getProjectsByUserId","status__is_closed","HomeProjectListDirective","WorkingOnController","homeService","_setAssignedTo","elem","_setWatching","WorkingOnDirective","InviteMembersFormController","rolesValues","defaultMaxInvites","_areRolesValidated","roleIds","contactsToInvite","emailsToInvite","_checkLimitMemberships","pendingMembersCount","membersLimit","showWarningMessage","sendInvites","setInvitedContacts","role_id","inviteContactsMessage","InviteMembersFormDirective","onDisplayContactList","onRemoveInvitedContact","onRemoveInvitedEmail","onSendInvites","AddMembersController","userService","displayContactList","_getContacts","excludeProjectId","getContacts","_filterContacts","invited","contact","inviteSuggested","removeContact","testEmptyContacts","inviteEmail","emailData","removeEmail","LightboxAddMembersDirective","SuggestAddMembersController","contactQuery","filterContacts","filteredContacts","setInvited","onInviteSuggested","SuggestAddMembersDirective","onInviteEmail","DropdownProjectListDirective","newProject","DropdownUserDirective","authService","navUrlsService","isFeedbackEnabled","supportUrl","userMenu","NavigationBarDirective","isEnabledHeader","NavigationBarService","enabledHeader","ProfileBarController","loadStats","getStats","ProfileBarDirective","ProfileContactsController","loadContacts","ProfileContactsDirective","FavItemDirective","itemType","FavsBaseController","ProfileLikedController","ProfileVotedController","ProfileWatchedController","_init","enableFilterByAll","enableFilterByProjects","enableFilterByEpics","enableFilterByUserStories","enableFilterByTasks","enableFilterByIssues","enableFilterByTextQuery","_resetList","scrollDisabled","_enableLoadingSpinner","isLoading","_disableLoadingSpinner","_enableScroll","_disableScroll","_checkIfHasMorePages","hasNext","_checkIfHasNoResults","hasNoResults","loadItems","_getItems","filterByTextQuery","showAll","showProjectsOnly","showEpicsOnly","showUserStoriesOnly","showTasksOnly","showIssuesOnly","tabName","getLiked","getVoted","getWatched","ProfileLikedDirective","ProfileVotedDirective","ProfileWatchedDirective","ProfileHints","hintKey","HINTS","hint","linkText","ProfileProjectsController","attachUserContactsToProjects","ProfileProjectsDirective","ProfileTabDirective","tab","tabIcon","tabActive","tabDisabled","addTab","ProfileTabsController","tabs","toggleTab","ProfileTabsDirective","ProfileController","getUserByUserName","userFullName","userUsername","BlockedProjectExplanationDirective","ContactProjectButtonController","launchContactForm","ContactProjectButtonDirective","layout","ContactProjectLbController","contactProject","sendingFeedback","ContactProjectLbDirective","inject","LikeProjectButtonController","likeButtonService","toggleLike","_unlike","_like","like","unlike","LikeProjectButtonDirective","LikeProjectButtonService","_getProjectIndex","_updateProjects","isFan","projectIndex","totalFans","is_fan","total_fans","setProjects","_updateCurrentProject","setProject","likeProject","unlikeProject","SortProjectsDirective","sortData","sorted_project_ids","bulkUpdateProjectsOrder","WatchProjectButtonController","watchButtonService","showWatchOptions","toggleWatcherOptions","closeWatcherOptions","notifyLevel","WatchProjectButtonDirective","WatchProjectButtonService","isWatcher","totalWatchers","total_watchers","watchProject","unwatchProject","AsanaImportProjectFormController","canCreatePublicProjects","canCreatePrivateProjects","projectForm","platformName","keepExternalReference","project_type","checkUsersLimit","limitMembersPrivateProject","canAddMembersPrivateProject","limitMembersPublicProject","canAddMembersPublicProject","saveForm","onSaveProjectDetails","canCreateProject","isDisabled","AsanaImportProjectFormDirective","onCancelForm","fetchingUsers","AsanaImportController","asanaImportService","importProjectService","projectUsers","startProjectSelector","fetchProjects","onSelectProject","fetchUsers","onCancelMemberSelection","startImport","importProject","importPromise","submitUserSelection","AsanaImportDirective","AsanaImportService","asanaImporter","listProjects","listUsers","userBindings","projectType","getAuthUrl","authUrl","authorize","CreatetProjectFormController","projectUrl","creation_template","formSubmitLoading","CreateProjectFormDirective","createProjectMembersRestrictionsDirective","createProjectRestrictionsDirective","CreateProjectController","displayScrumDesc","displayKanbanDesc","displayHelp","DuplicateProjectController","refreshReferenceProject","getProjectBySlug","referenceProject","invitedMembers","toggleInvitedMember","duplicate","DuplicateProjectDirective","GithubImportProjectFormController","GithubImportProjectFormDirective","GithubImportController","githubImportService","GithubImportDirective","GithubImportService","githubImporter","callbackUri","ImportProjectMembersController","selectImportUserLightbox","warningImportUsers","displayEmailSelector","cancelledUsers","selectedUsers","selectableUsers","userContacts","fetchUser","refreshSelectableUsers","searchingUser","beforeSubmitUsers","confirmUser","externalUser","taigaUser","discardSuggestedUser","unselectUser","getSelectedMember","isMemberSelected","userSelected","showSuggestedMatch","getDistinctSelectedTaigaUsers","ids","importMoreUsersDisabled","isImportMoreUsersDisabled","ImportProjectMembersDirective","platform","ImportProjectSelectorController","ImportProjectSelectorDirective","noProjectsMsg","ImportTaigaController","importTaiga","ImportTaigaDirective","LbImportErrorDirective","ImportProjectController","trelloService","jiraService","githubService","asanaService","tgNavUrls","asanaOauthToken","githubOauthToken","jiraOauthToken","jiraOauthVerifier","locationSearch","trelloOauthToken","from","cancelCurrentImport","oauth_verifier","oauth_token","jiraUrl","err","absUrl","unfoldOptions","unfoldedOptions","isActiveImporter","backToCreate","ImportProjectDirective","onCancelImport","ImportProjectService","importSuccess","importError","restrictionError","getRestrictionError","error_message","errorKey","maxMemberships","membersError","privateError","publicError","InviteMembersController","InviteMembersDirective","onToggleInvitedMember","SingleMemberDirective","disabled","JiraImportProjectFormController","importer_type","create_subissues","JiraImportProjectFormDirective","JiraImportController","jiraImportService","JiraImportDirective","JiraImportService","jiraImporter","importerType","SelectImportUserLightboxCtrl","invalid","assignUser","onSelectUser","userEmail","SelectImportUserLightboxDirective","TrelloImportProjectFormController","TrelloImportProjectFormDirective","TrelloImportController","trelloImportService","TrelloImportDirective","TrelloImportService","trelloImporter","verifyCode","WarningUserImportDirective","onConfirm","ProjectsListingController","ProjectController","activeMembers","ProjectsService","getProjectStats","paginate","transferValidateToken","transferAccept","reason","transferReject","CantOwnProjectExplanationDirective","TransferProject","showAddComment","_refreshUserData","_validateToken","_setProjectData","_checkOwnerData","canBeOwnedByUser","canOwnProject","ownerMessage","maxProjects","currentProjects","validNumberOfMemberships","loadingAccept","loadingReject","hideComment","TransferProjectDirective","Resource","urlsService","urlname","object_id","x-disable-pagination","progressMessage","progressPercent","bulk_userstories","AsanaResource","GithubResource","JiraResource","TrelloResource","users_bindings","keep_external_reference","jira_url","projectTemplate","pagination","paginateResponseService","x-lazy-pagination","getTimeline","only_relevant","Resources","services","serviceFn","serviceProperty","warn","getUserStorage","setUserStorage","createUserStorage","getUserByUsername","exclude_project","getProfileTimeline","getUserTimeline","listAllInProject","epicIid","getWikiHistory","wikiHistory","AppMetaService","_set","meta","setTitle","setDescription","setTwitterMetas","origin","setOpenGraphMetas","listener","_listener","metas","AttachmentsService","getMaxFileSize","maxFileSizeFormated","sizeError","saveError","AvatarService","modulo","COLORS","IMAGES","logos","getDefault","murmurhash3_32_gc","getUnnamed","avatarParamName","gravatar","logoUrl","photo","root","gravatar_id","CheckPermissionsService","CurrentUserService","storageService","_projects","_projectsById","_joyride","_loadUserInfo","totalMembers","membersResult","ErrorHandlingService","errorHandling","showingError","blocked","LightboxFactory","scopeAttrs","PaginateResponse","paginateResponse","ProjectLogoService","ProjectService","userActivityService","interval","_project","_section","_sectionsBreadcrumb","_activeMembers","e2e","autoRefresh","intervalId","onInactive","onActive","ThemeService","themeName","stylesheetEl","UserActivityService","resetTimer","subscriptionsActive","subscriptionsInactive","isActive","startTimer","idleTimeout","timerId","_fireInactive","_fireActive","_unSubscriptionsActive","_unSubscriptionsInactive","UserService","pageNumber","objectType","textQuery","contactsFiltered","contactId","UserTimelineAttachmentDirective","validFileExtensions","extension","is_image","templateHtml","UserTimelineItemTitle","sce","_fieldTranslationKey","description_diff","timeline","title_attr","_getLink","_getUsernameSpan","field_name","new_value","sprint_name","us_name","event_us","_getTimelineObj","_getDetailObjUrl","related_us_name","epic_name","obj_name","role_name","keySeq","_translateTitleParams","parent_userstory","span","_getParams","timeline_type","translate_params","getTitle","paramsKeys","translation","UserTimelineType","timelineType","hasIn","UserTimelineItemDirective","UserTimelinePaginationSequence","generate","getContent","minItems","UserTimelineController","userTimelineService","timelineList","getProjectTimeline","loadTimeline","UserTimelineDirective","UserTimelineService","userTimelinePaginationSequenceService","userTimelineItemType","userTimelineItemTitle","_valid_fields","_invalid","fieldKey","value_diff","_isInValidTimeline","_parseEventType","event_type","_getTimelineObject","_attachExtraInfoToTimelineEntry","_parseTimeline","newdata","newItem","moveInBacklog","deleteIn","_addEntyAttributes","filterNot","IsolateClickDirective","WikiHistoryDiffDirective","WikiHistoryEntryDirective","singleHistoryEntry","historyEntry","WikiHistoryController","historyEntries","initializeHistoryEntries","setWikiId","WikiHistoryDirective","WikiHistoryService","_wikiId","_historyEntries"],"mappings":"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","file":"../app.js","sourcesContent":["\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, pluginsModules, pluginsWithModule, taiga;\n\n this.taiga = taiga = {};\n\n taiga.emojis = window.emojis;\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, blockingIntercept, 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 projectLoaded: [\n \"$q\", \"tgProjectService\", \"$route\", function($q, projectService, $route) {\n var deferred, ref;\n deferred = $q.defer();\n projectService.setSection((ref = $route.current.$$route) != null ? ref.section : void 0);\n if ($route.current.params.pslug) {\n projectService.setProjectBySlug($route.current.params.pslug).then(deferred.resolve);\n } else {\n projectService.cleanProject();\n 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/new\", {\n title: \"PROJECT.CREATE.TITLE\",\n templateUrl: \"projects/create/create-project.html\",\n loader: true,\n controller: \"CreateProjectCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/new/scrum\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/kanban\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/duplicate\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/import/:platform?\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\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/t/:ref\", {\n loader: true,\n controller: \"DetailController\",\n template: \"\"\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/epics\", {\n section: \"epics\",\n templateUrl: \"epics/dashboard/epics-dashboard.html\",\n loader: true,\n controller: \"EpicsDashboardCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/:pslug/epic/:epicref\", {\n templateUrl: \"epic/epic-detail.html\",\n loader: true,\n section: \"epics\"\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-list\", {\n templateUrl: \"wiki/wiki-list.html\",\n loader: true,\n section: \"wiki\"\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/project-values/tags\", {\n templateUrl: \"admin/admin-project-values-tags.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/third-parties/gogs\", {\n templateUrl: \"admin/admin-third-parties-gogs.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\", {\n templateUrl: \"contrib/main.html\"\n });\n $routeProvider.when(\"/project/:pslug/transfer/:token\", {\n templateUrl: \"projects/transfer/transfer-page.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\"\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(\"/user-settings/contrib/:plugin\", {\n templateUrl: \"contrib/user-settings.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 controller: \"LoginPage\"\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(\"/blocked-project/:pslug/\", {\n templateUrl: \"projects/project/blocked-project.html\",\n loader: 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 templateUrl: \"error/not-found.html\"\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, errorHandlingService) {\n var httpResponseError;\n httpResponseError = function(response) {\n var nextUrl, search;\n if (response.status === 0 || (response.status === -1 && !response.config.cancelable)) {\n $lightboxService.closeAll();\n errorHandlingService.error();\n } else if (response.status === 401 && $location.url().indexOf('/login') === -1) {\n nextUrl = $location.url();\n search = $location.search();\n if (search.force_next) {\n $location.url($navUrls.resolve(\"login\")).search(\"force_next\", search.force_next);\n } else {\n $location.url($navUrls.resolve(\"login\")).search({\n \"unauthorized\": true,\n \"next\": nextUrl\n });\n }\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\", \"tgErrorHandlingService\", 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 blockingIntercept = function($q, errorHandlingService) {\n var redirectToBlockedPage, responseError, responseOk;\n redirectToBlockedPage = function() {\n return errorHandlingService.block();\n };\n responseOk = function(response) {\n if (response.data.blocked_code) {\n redirectToBlockedPage();\n }\n return response;\n };\n responseError = function(response) {\n if (response.status === 451) {\n redirectToBlockedPage();\n }\n return $q.reject(response);\n };\n return {\n response: responseOk,\n responseError: responseError\n };\n };\n $provide.factory(\"blockingIntercept\", [\"$q\", \"tgErrorHandlingService\", blockingIntercept]);\n $httpProvider.interceptors.push(\"blockingIntercept\");\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 if (lang !== 'en') {\n ljs.load((\"/\" + window._version + \"/locales/moment-locales/\") + lang + \".js\");\n }\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 linewidth: $translate.instant(\"COMMON.FORM_ERRORS.LINEWIDTH\"),\n pikaday: $translate.instant(\"COMMON.FORM_ERRORS.PIKADAY\")\n };\n return checksley.updateMessages('default', messages);\n };\n\n init = function($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, loaderService, navigationBarService, errorHandlingService, lightboxService) {\n var un, user, validators;\n $log.debug(\"Initialize application\");\n $rootscope.$on('$translatePartialLoaderStructureChanged', function() {\n return $translate.refresh();\n });\n validators = {\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 pikaday: function(val) {\n var prettyDate;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n return moment(val, prettyDate).isValid();\n }\n };\n checksley.updateValidators(validators);\n $rootscope.contribPlugins = this.taigaContribPlugins;\n $rootscope.adminPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"admin\"\n });\n $rootscope.userSettingsPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"userSettings\"\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 $rootscope.$on('$locationChangeStart', function(event) {\n errorHandlingService.init();\n if (lightboxService.getLightboxOpen().length) {\n event.preventDefault();\n return lightboxService.closeAll();\n }\n });\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 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 angular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 500);\n\n pluginsWithModule = _.filter(this.taigaContribPlugins, function(plugin) {\n return plugin.module;\n });\n\n pluginsModules = _.map(pluginsWithModule, function(plugin) {\n return plugin.module;\n });\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\", \"taigaHistory\", \"taigaWikiHistory\", \"taigaEpics\", \"taigaUtils\", \"templates\", \"ngSanitize\", \"ngRoute\", \"ngAnimate\", \"ngAria\", \"pascalprecht.translate\", \"infinite-scroll\", \"tgRepeat\"].concat(pluginsModules);\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\", \"tgLoader\", \"tgNavigationBarService\", \"tgErrorHandlingService\", \"lightboxService\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.errorHandlingService.notfound();\n } else if (xhr.status === 403) {\n this.errorHandlingService.permissionDenied();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 DEFAULT_COLOR_LIST, addClass, bindMethods, bindOnce, cancelTimeout, debounce, debounceLeading, defineImmutableProperty, getDefaulColorList, getMatches, getRandomDefaultColor, groupBy, isEmail, isImage, isPdf, 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 addClass = function(el, className) {\n if (el.classList) {\n return el.classList.add(className);\n } else {\n return el.className += ' ' + className;\n }\n };\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 && _.isFunction(value)) {\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 _.trim(data, char);\n };\n\n slugify = function(data) {\n return data.toString().toLowerCase().trim().replace(/\\s+/g, '-').replace(/&/g, '-and-').replace(/[^\\w\\-]+/g, '').replace(/\\-\\-+/g, '-');\n };\n\n unslugify = function(data) {\n if (data) {\n return _.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 coll.join(str);\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 _.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|svg|psd)/i) !== null;\n };\n\n isEmail = function(name) {\n return (name != null) && name.match(/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/) !== null;\n };\n\n isPdf = function(name) {\n return name.match(/\\.(pdf)/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 DEFAULT_COLOR_LIST = ['#fce94f', '#edd400', '#c4a000', '#8ae234', '#73d216', '#4e9a06', '#d3d7cf', '#fcaf3e', '#f57900', '#ce5c00', '#729fcf', '#3465a4', '#204a87', '#888a85', '#ad7fa8', '#75507b', '#5c3566', '#ef2929', '#cc0000', '#a40000', '#222222'];\n\n getRandomDefaultColor = function() {\n return _.sample(DEFAULT_COLOR_LIST);\n };\n\n getDefaulColorList = function() {\n return _.clone(DEFAULT_COLOR_LIST);\n };\n\n getMatches = function(string, regex, index) {\n var match, matches;\n index || (index = 1);\n matches = [];\n match = null;\n while (match = regex.exec(string)) {\n if (index === -1) {\n matches.push(match);\n } else {\n matches.push(match[index]);\n }\n }\n return matches;\n };\n\n taiga = this.taiga;\n\n taiga.addClass = addClass;\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.isEmail = isEmail;\n\n taiga.isPdf = isPdf;\n\n taiga.patch = patch;\n\n taiga.getRandomDefaultColor = getRandomDefaultColor;\n\n taiga.getDefaulColorList = getDefaulColorList;\n\n taiga.getMatches = getMatches;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, UsFiltersMixin, 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 _.includes(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 FiltersMixin.prototype.applyStoredFilters = function(projectSlug, key) {\n var filters;\n if (_.isEmpty(this.location.search())) {\n filters = this.getFilters(projectSlug, key);\n if (Object.keys(filters).length) {\n this.location.search(filters);\n this.location.replace();\n return true;\n }\n }\n return false;\n };\n\n FiltersMixin.prototype.storeFilters = function(projectSlug, params, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.set(hash, params);\n };\n\n FiltersMixin.prototype.getFilters = function(projectSlug, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.get(hash) || {};\n };\n\n FiltersMixin.prototype.formatSelectedFilters = function(type, list, urlIds) {\n var invalidAppliedTags, invalidTags, selectedFilters, selectedIds, validAppliedTags;\n selectedIds = urlIds.split(',');\n selectedFilters = _.filter(list, function(it) {\n return selectedIds.indexOf(_.toString(it.id)) !== -1;\n });\n invalidTags = _.filter(selectedIds, function(it) {\n return !_.find(selectedFilters, function(sit) {\n return _.toString(sit.id) === it;\n });\n });\n invalidAppliedTags = _.map(invalidTags, function(it) {\n return {\n id: it,\n key: type + \":\" + it,\n dataType: type,\n name: it\n };\n });\n validAppliedTags = _.map(selectedFilters, function(it) {\n return {\n id: it.id,\n key: type + \":\" + it.id,\n dataType: type,\n name: it.name,\n color: it.color\n };\n });\n return invalidAppliedTags.concat(validAppliedTags);\n };\n\n return FiltersMixin;\n\n })();\n\n taiga.FiltersMixin = FiltersMixin;\n\n UsFiltersMixin = (function() {\n function UsFiltersMixin() {}\n\n UsFiltersMixin.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.epic = urlfilters.epic;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n return _this.generateFilters();\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n UsFiltersMixin.prototype.generateFilters = function(milestone) {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.storeFiltersName);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.epic = urlfilters.epic;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n if (milestone) {\n loadFilters.milestone = milestone;\n }\n return this.q.all([this.rs.userstories.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, epic, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n epic = _.map(data.epics, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n it.name = \"#\" + it.ref + \" \" + it.subject;\n } else {\n it.id = \"null\";\n it.name = \"Not in an epic\";\n }\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.epic) {\n selected = _this.formatSelectedFilters(\"epic\", epic, loadFilters.epic);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.EPIC\"),\n dataType: \"epic\",\n content: epic\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n return UsFiltersMixin;\n\n })();\n\n taiga.UsFiltersMixin = UsFiltersMixin;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, LoginPage, 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 LoginPage = (function() {\n LoginPage.$inject = ['tgCurrentUserService', '$location', '$tgNavUrls', '$routeParams', '$tgAuth'];\n\n function LoginPage(currentUserService, $location, $navUrls, $routeParams, $auth) {\n var url;\n if (currentUserService.isAuthenticated()) {\n if (!$routeParams['force_login']) {\n url = $navUrls.resolve(\"home\");\n if ($routeParams['next']) {\n url = decodeURIComponent($routeParams['next']);\n $location.search('next', null);\n }\n if ($routeParams['unauthorized']) {\n $auth.clear();\n $auth.removeToken();\n } else {\n $location.url(url);\n }\n }\n }\n }\n\n return LoginPage;\n\n })();\n\n module.controller('LoginPage', LoginPage);\n\n AuthService = (function(superClass) {\n extend(AuthService, superClass);\n\n AuthService.$inject = [\"$rootScope\", \"$tgStorage\", \"$tgModel\", \"$tgResources\", \"$tgHttp\", \"$tgUrls\", \"$tgConfig\", \"$translate\", \"tgCurrentUserService\", \"tgThemeService\", \"$tgAnalytics\"];\n\n function AuthService(rootscope, storage, model, rs, http, urls, config1, translate, currentUserService1, themeService, analytics) {\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 = config1;\n this.translate = translate;\n this.currentUserService = currentUserService1;\n this.themeService = themeService;\n this.analytics = analytics;\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 this.currentUserService.setUser(this.userData);\n } else {\n this.userData = null;\n }\n return this.analytics.setUserId();\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.refresh = function() {\n var url;\n url = this.urls.resolve(\"user-me\");\n return this.http.get(url).then((function(_this) {\n return function(data, status) {\n var user;\n user = data.data;\n user.token = _this.getUser().auth_token;\n user = _this.model.make_model(\"users\", user);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:refresh\", user);\n return user;\n };\n })(this));\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 _this.rootscope.$broadcast(\"auth:login\", 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 this._setLocales();\n this.rootscope.$broadcast(\"auth:logout\");\n return this.analytics.setUserId();\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 _this.rootscope.$broadcast(\"auth:register\", 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.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['force_next']) {\n nextUrl = encodeURIComponent($routeParams['force_next']);\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, $window, $analytics) {\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 if ($routeParams['force_next']) {\n $scope.nextUrl = decodeURIComponent($routeParams['force_next']);\n }\n onSuccess = function(response) {\n $events.setupConnection();\n $analytics.trackEvent(\"auth\", \"login\", \"user login\", 1);\n if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\n };\n onError = function(response) {\n return $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"));\n };\n $scope.onKeyUp = function(event) {\n var target, value;\n target = angular.element(event.currentTarget);\n value = target.val();\n $scope.iscapsLockActivated = false;\n if (value !== value.toLowerCase()) {\n return $scope.iscapsLockActivated = true;\n }\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\", \"$window\", \"$tgAnalytics\", LoginDirective]);\n\n RegisterDirective = function($auth, $confirm, $location, $navUrls, $config, $routeParams, $analytics, $translate, $window) {\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(\"login\")) {\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 if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\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\", \"$window\", 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 message, title;\n $location.path($navUrls.resolve(\"login\"));\n title = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TITLE\");\n message = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TEXT\");\n return $confirm.success(title, message);\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, $config, $params, $navUrls, $analytics, $translate, config) {\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 $scope.invitation = invitation;\n return $scope.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\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 var data, loginFormType;\n event.preventDefault();\n if (!loginForm.validate()) {\n return;\n }\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n data = $scope.dataLogin;\n promise = $auth.login({\n username: data.username,\n password: data.password,\n invitation_token: data.token\n }, loginFormType);\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\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgConfig\", 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 $location.path($navUrls.resolve(\"home\"));\n return $location.replace();\n };\n })(this));\n } else {\n $location.path($navUrls.resolve(\"login\"));\n $location.replace();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\": \"/project/new\",\n \"create-project-scrum\": \"/project/new/scrum\",\n \"create-project-kanban\": \"/project/new/kanban\",\n \"create-project-duplicate\": \"/project/new/duplicate\",\n \"create-project-import\": \"/project/new/import\",\n \"create-project-import-platform\": \"/project/new/import/:platform\",\n \"profile\": \"/profile\",\n \"user-profile\": \"/profile/:username\",\n \"blocked-project\": \"/blocked-project/:project\",\n \"project\": \"/project/:project\",\n \"project-detail-ref\": \"/project/:project/t/:ref\",\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-epics\": \"/project/:project/epics\",\n \"project-search\": \"/project/:project/search\",\n \"project-epics-detail\": \"/project/:project/epic/:ref\",\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-list\": \"/project/:project/wiki-list\",\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-project-values-tags\": \"/project/:project/admin/project-values/tags\",\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-third-parties-gogs\": \"/project/:project/admin/third-parties/gogs\",\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 \"user-settings-contrib\": \"/user-settings/contrib/:plugin\"\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, Autofocus, Capslock, CheckPermissionDirective, ClassPermissionDirective, DataPickerConfig, LightboxClose, ProjectUrl, Qqueue, QueueModelTransformation, SelectedText, Svg, Template, ToggleCommentDirective, module, taiga,\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 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 if (project.toJS) {\n project = project.toJS();\n }\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 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 };\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 QueueModelTransformation = (function(superClass) {\n extend(QueueModelTransformation, superClass);\n\n QueueModelTransformation.$inject = [\"$tgQqueue\", \"$tgRepo\", \"$q\", \"$tgModel\"];\n\n function QueueModelTransformation(qqueue1, repo, q, model1) {\n this.qqueue = qqueue1;\n this.repo = repo;\n this.q = q;\n this.model = model1;\n }\n\n QueueModelTransformation.prototype.setObject = function(scope1, prop) {\n this.scope = scope1;\n this.prop = prop;\n };\n\n QueueModelTransformation.prototype.clone = function() {\n var attrs, model;\n attrs = _.cloneDeep(this.scope[this.prop]._attrs);\n model = this.model.make_model(this.scope[this.prop]._name, attrs);\n return model;\n };\n\n QueueModelTransformation.prototype.getObj = function() {\n return this.scope[this.prop];\n };\n\n QueueModelTransformation.prototype.save = function(transformation) {\n var defered;\n defered = this.q.defer();\n this.qqueue.add((function(_this) {\n return function() {\n var clone, comment, modified, obj, success;\n obj = _this.getObj();\n comment = obj.comment;\n obj.comment = '';\n clone = _this.clone();\n modified = _.omit(obj._modifiedAttrs, ['version']);\n clone = _.assign(clone, modified);\n transformation(clone);\n if (comment.length) {\n clone.comment = comment;\n }\n success = function() {\n _this.scope[_this.prop] = clone;\n return defered.resolve.apply(null, arguments);\n };\n return _this.repo.save(clone).then(success, defered.reject);\n };\n })(this));\n return defered.promise;\n };\n\n return QueueModelTransformation;\n\n })(taiga.Service);\n\n module.service(\"$tgQueueModelTransformation\", QueueModelTransformation);\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() {\n var template;\n template = \"\";\n return {\n template: template\n };\n };\n\n module.directive(\"tgCapslock\", [Capslock]);\n\n LightboxClose = function() {\n var link, template;\n template = \"\\n \\n\";\n link = function(scope, elm, attrs) {};\n return {\n scope: {\n onClose: '&'\n },\n link: link,\n template: template\n };\n };\n\n module.directive(\"tgLightboxClose\", [LightboxClose]);\n\n Svg = function() {\n var template;\n template = \"\\n \\n {{svgTitle}}\\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\\n \\n\";\n return {\n scope: {\n svgIcon: \"@\",\n svgTitle: \"@\",\n svgTitleTranslate: \"@\",\n svgTitleTranslateValues: \"=\"\n },\n template: template\n };\n };\n\n module.directive(\"tgSvg\", [Svg]);\n\n Autofocus = function($timeout, $parse, animationFrame) {\n return {\n restrict: 'A',\n link: function($scope, $element, attrs) {\n var model;\n if (attrs.ngShow) {\n model = $parse(attrs.ngShow);\n return $scope.$watch(model, function(value) {\n if (value === true) {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n });\n } else {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n }\n };\n };\n\n module.directive('tgAutofocus', ['$timeout', '$parse', \"animationFrame\", Autofocus]);\n\n module.directive('tgPreloadImage', function() {\n var preload, spinner, template;\n spinner = \"loading...\";\n template = \"
\\n \\n
\";\n preload = function(src, onLoad) {\n var image;\n image = new Image();\n image.onload = onLoad;\n image.src = src;\n return image;\n };\n return {\n template: template,\n transclude: true,\n replace: true,\n link: function(scope, el, attrs) {\n var image, onLoad, timeout;\n image = el.find('img:last');\n timeout = null;\n onLoad = function() {\n el.find('.loading-spinner').remove();\n image.show();\n if (timeout) {\n clearTimeout(timeout);\n return timeout = null;\n }\n };\n return attrs.$observe('preloadSrc', function(src) {\n if (timeout) {\n clearTimeout(timeout);\n }\n el.find('.loading-spinner').remove();\n timeout = setTimeout(function() {\n return el.prepend(spinner);\n }, 200);\n image.hide();\n return preload(src, onLoad);\n });\n }\n };\n });\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/detail.coffee\n */\n\n(function() {\n var DetailController, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString;\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(\"taigaCommon\");\n\n DetailController = (function() {\n DetailController.$inject = ['$routeParams', '$tgRepo', \"tgProjectService\", \"$tgNavUrls\", \"$location\"];\n\n function DetailController(params, repo, projectService, navurls, location) {\n this.params = params;\n this.repo = repo;\n this.projectService = projectService;\n this.navurls = navurls;\n this.location = location;\n this.repo.resolve({\n pslug: this.params.pslug,\n ref: this.params.ref\n }).then((function(_this) {\n return function(result) {\n var url;\n if (result.issue) {\n url = _this.navurls.resolve('project-issues-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.task) {\n url = _this.navurls.resolve('project-tasks-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.us) {\n url = _this.navurls.resolve('project-userstories-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.epic) {\n url = _this.navurls.resolve('project-epics-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.wikipage) {\n url = _this.navurls.resolve('project-wiki-page', {\n project: _this.projectService.project.get('slug'),\n slug: _this.params.ref\n });\n }\n return _this.location.path(url);\n };\n })(this));\n }\n\n return DetailController;\n\n })();\n\n module.controller(\"DetailController\", DetailController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/epics.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaEpics\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 = _.trimStart(url, \"/\");\n url = scheme + \"//\" + loc.host + \"/\" + path;\n }\n this.error = false;\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, reconnectTryInterval;\n if (this.heartbeatInterval) {\n return;\n }\n maxMissedHeartbeats = this.config.get(\"eventsMaxMissedHeartbeats\", 5);\n heartbeatIntervalTime = this.config.get(\"eventsHeartbeatIntervalTime\", 60000);\n reconnectTryInterval = this.config.get(\"eventsReconnectTryInterval\", 10000);\n this.missedHeartbeats = 0;\n this.heartbeatInterval = setInterval((function(_this) {\n return function() {\n var e;\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.setupConnection();\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.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 this.sendMessage(message);\n this.startHeartBeatMessages();\n return this.notifications();\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 this.error = true;\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\n };\n\n EventsService.prototype.onClose = function() {\n this.log.debug(\"WebSocket closed.\");\n this.connected = false;\n this.stopHeartBeatMessages();\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $emojis) {\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 this.childScope = $scope.$new();\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 this.childScope.$destroy();\n this.childScope = $scope.$new();\n $el.off();\n $el.html($compile(templateEdit({\n task: task\n }))(childScope));\n $el.find(\".task-name input\").val(task.subject);\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\", \".save-task\", 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 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 emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n }))($scope));\n $el.on(\"click\", \".edit-task\", 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\", \"$tgEmojis\", RelatedTaskRowDirective]);\n\n RelatedTaskCreateFormDirective = function($repo, $compile, $confirm, $tgmodel, $loading, $analytics) {\n var link, newTask;\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n link = function($scope, $el, $attrs) {\n var close, createTask, render, reset;\n createTask = 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 return $scope.openNewRelatedTask = false;\n };\n reset = function() {\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n newTask[\"status\"] = $scope.project.default_task_status;\n newTask[\"project\"] = $scope.project.id;\n newTask[\"user_story\"] = $scope.us.id;\n return $scope.newTask = $tgmodel.make_model(\"tasks\", newTask);\n };\n render = function() {\n if ($scope.openNewRelatedTask) {\n return;\n }\n $scope.openNewRelatedTask = true;\n return $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return createTask(newTask).then(function() {\n reset();\n return $el.find('input').focus();\n });\n } else if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return close();\n });\n }\n });\n };\n $scope.save = function() {\n return createTask(newTask).then(function() {\n return close();\n });\n };\n taiga.bindOnce($scope, \"us\", reset);\n $scope.$on(\"related-tasks:show-form\", function() {\n return $scope.$apply(render);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n link: link,\n templateUrl: 'task/related-task-create-form.html'\n };\n };\n\n module.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", 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 _isEditable, _isVisible, 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, function(x) {\n return [x.us_order, x.ref];\n });\n return tasks;\n };\n })(this));\n };\n _isVisible = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"view_tasks\") !== -1;\n }\n return false;\n };\n _isEditable = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n }\n return false;\n };\n $scope.showRelatedTasks = function() {\n var ref;\n return _isVisible() && (_isEditable() || ((ref = $scope.tasks) != null ? ref.length : void 0));\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, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
<%- name %>
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task, updateRelatedTask;\n updateRelatedTask = function(task) {\n var avatar, ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = $scope.usersById[task.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\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 $scope.$watch($attrs.tgRelatedTaskAssignedToInlineEdition, function() {\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n return updateRelatedTask(task);\n });\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\", \"tgAvatarService\", RelatedTaskAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 \"user-me\": \"/users/me\",\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 \"project-contact\": \"contact\",\n \"project-transfer-validate-token\": \"/projects/%s/transfer_validate_token\",\n \"project-transfer-accept\": \"/projects/%s/transfer_accept\",\n \"project-transfer-reject\": \"/projects/%s/transfer_reject\",\n \"project-transfer-request\": \"/projects/%s/transfer_request\",\n \"project-transfer-start\": \"/projects/%s/transfer_start\",\n \"epic-statuses\": \"/epic-statuses\",\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 \"epics\": \"/epics\",\n \"epic-upvote\": \"/epics/%s/upvote\",\n \"epic-downvote\": \"/epics/%s/downvote\",\n \"epic-watch\": \"/epics/%s/watch\",\n \"epic-unwatch\": \"/epics/%s/unwatch\",\n \"epic-related-userstories\": \"/epics/%s/related_userstories\",\n \"epic-related-userstories-bulk-create\": \"/epics/%s/related_userstories/bulk_create\",\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-milestone\": \"/userstories/bulk_update_milestone\",\n \"bulk-update-us-miles-order\": \"/userstories/bulk_update_sprint_order\",\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\",\n \"bulk-update-us-milestone\": \"/userstories/bulk_update_milestone\",\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 \"task-filters\": \"/tasks/filters_data\",\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/epic\": \"/history/epic\",\n \"history/us\": \"/history/userstory\",\n \"history/issue\": \"/history/issue\",\n \"history/task\": \"/history/task\",\n \"history/wiki\": \"/history/wiki/%s\",\n \"attachments/epic\": \"/epics/attachments\",\n \"attachments/us\": \"/userstories/attachments\",\n \"attachments/issue\": \"/issues/attachments\",\n \"attachments/task\": \"/tasks/attachments\",\n \"attachments/wiki_page\": \"/wiki/attachments\",\n \"custom-attributes/epic\": \"/epic-custom-attributes\",\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\",\n \"custom-attributes/task\": \"/task-custom-attributes\",\n \"custom-attributes/issue\": \"/issue-custom-attributes\",\n \"custom-attributes-values/epic\": \"/epics/custom-attributes-values\",\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\",\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\",\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\",\n \"webhooks\": \"/webhooks\",\n \"webhooks-test\": \"/webhooks/%s/test\",\n \"webhooklogs\": \"/webhooklogs\",\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\",\n \"epics-csv\": \"/epics/csv?uuid=%s\",\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 \"importers-trello-auth-url\": \"/importers/trello/auth_url\",\n \"importers-trello-authorize\": \"/importers/trello/authorize\",\n \"importers-trello-list-projects\": \"/importers/trello/list_projects\",\n \"importers-trello-list-users\": \"/importers/trello/list_users\",\n \"importers-trello-import-project\": \"/importers/trello/import_project\",\n \"importers-jira-auth-url\": \"/importers/jira/auth_url\",\n \"importers-jira-authorize\": \"/importers/jira/authorize\",\n \"importers-jira-list-projects\": \"/importers/jira/list_projects\",\n \"importers-jira-list-users\": \"/importers/jira/list_users\",\n \"importers-jira-import-project\": \"/importers/jira/import_project\",\n \"importers-github-auth-url\": \"/importers/github/auth_url\",\n \"importers-github-authorize\": \"/importers/github/authorize\",\n \"importers-github-list-projects\": \"/importers/github/list_projects\",\n \"importers-github-list-users\": \"/importers/github/list_users\",\n \"importers-github-import-project\": \"/importers/github/import_project\",\n \"importers-asana-auth-url\": \"/importers/asana/auth_url\",\n \"importers-asana-authorize\": \"/importers/asana/authorize\",\n \"importers-asana-list-projects\": \"/importers/asana/list_projects\",\n \"importers-asana-list-users\": \"/importers/asana/list_users\",\n \"importers-asana-import-project\": \"/importers/asana/import_project\"\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\", \"$tgEpicsResourcesProvider\", \"$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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function SearchController(scope1, repo, rs, params, q, location, appMetaService, navUrls, translate, errorHandlingService, projectService1) {\n var description, loadSearchData, title;\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.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.sectionName = \"Search\";\n this.loadInitialData();\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 this.appMetaService.setAll(title, description);\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 var project;\n project = this.projectService.project.toJS();\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.epicStatusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\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\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 var project;\n project = this.loadProject();\n this.scope.projectId = project.id;\n return this.fillUsersAndRoles(project.members, project.roles);\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, $analytics) {\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\", \"epics\", \"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 epics: $templatecache.get(\"search-epics\"),\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 $location.search(\"text\", searchTerm);\n }\n return $analytics.trackPage($location.url(), \"Search\");\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\", \"$tgAnalytics\", SearchDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"ec\");\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 this.initialized = true;\n return this.setUserId();\n };\n\n AnalyticsService.prototype.setUserId = function() {\n var ref, ref1;\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga('set', 'userId', (ref = this.rootscope) != null ? (ref1 = ref.user) != null ? ref1.uuid : void 0 : void 0);\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 AnalyticsService.prototype.ecViewPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'detail');\n return this.trackEvent(\"ecommerce\", \"view-product-detail\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecClickPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'click');\n return this.trackEvent(\"ecommerce\", \"click-product\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecListPlans = function(arg, page) {\n var i, len, plan, plans, position;\n plans = arg[0];\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n position = 1;\n for (i = 0, len = plans.length; i < len; i++) {\n plan = plans[i];\n this.win.ga('ec:addImpression', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'list': page,\n 'position': position\n });\n position++;\n }\n return this.trackEvent(\"ecommerce\", \"list-plans\");\n };\n\n AnalyticsService.prototype.ecAddToCart = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'add');\n return this.trackEvent('ecommerce', 'add-to-cart', 'Collect Payment Info', null);\n };\n\n AnalyticsService.prototype.ecConfirmChange = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 1\n });\n return this.trackEvent(\"ecommerce\", \"start-checkout\", \"start\", 1);\n };\n\n AnalyticsService.prototype.ecPurchase = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 2\n });\n this.trackEvent(\"ecommerce\", \"end-checkout\", \"end\", 2);\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'purchase', {\n 'id': plan_id,\n 'revenue': plan_price\n });\n return this.trackEvent('ecommerce', 'checkout', 'Plan checkout', null);\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-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, ListItemAssignedtoDirective, ListItemEpicStatusDirective, ListItemIssueStatusDirective, ListItemPriorityDirective, ListItemSeverityDirective, ListItemTaskStatusDirective, ListItemTypeDirective, ListItemUsStatusDirective, SprintProgressBarDirective, TgMainTitleDirective, TgProgressBarDirective, UserDisplayDirective, 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 });\n return $el.picker = new Pikaday(datePickerConfig);\n };\n unbind = $rootscope.$on(\"$translateChangeEnd\", (function(_this) {\n return function(ctx) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n return initialize();\n };\n })(this));\n $attrs.$observe(\"pickerValue\", function(val) {\n $el.val(val);\n if (val != null) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n initialize();\n }\n return $el.picker.setDate(val);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n unbind();\n return $el.picker.destroy();\n });\n };\n return {\n link: link\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, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.ngModel, function(model) {\n var avatar, ref;\n if (model != null) {\n avatar = avatarService.getAvatar(model.owner_extra_info);\n $scope.owner = model.owner_extra_info || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n $scope.owner.avatar = avatar.url;\n $scope.owner.bg = avatar.bg;\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\", \"tgAvatarService\", CreatedByDisplayDirective]);\n\n UserDisplayDirective = function($template, $compile, $translate, $navUrls, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var avatar, id;\n id = $attrs.tgUserId;\n $scope.user = $scope.usersById[id] || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n avatar = avatarService.getAvatar($scope.usersById[id] || null);\n $scope.user.avatar = avatar.url;\n $scope.user.bg = avatar.bg;\n $scope.url = $scope.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: $scope.user.username\n }) : \"\";\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n scope: true,\n templateUrl: \"common/components/user-display.html\"\n };\n };\n\n module.directive(\"tgUserDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", \"tgAvatarService\", UserDisplayDirective]);\n\n WatchersDirective = function($rootscope, $confirm, $repo, $modelTransform, $template, $compile, $translate) {\n var link;\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 = function(watchers) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watchers;\n return item;\n });\n transform.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 transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n deleteWatcher = function(watcherIds) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watcherIds;\n return item;\n });\n transform.then(function() {\n var item, watchers;\n item = $modelTransform.getObj();\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 transform.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n renderWatchers = function(watchers) {\n $scope.watchers = watchers;\n return $scope.isEditable = isEditable();\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 watchers = _.filter(watchers, function(it) {\n return !!it;\n });\n return renderWatchers(watchers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n templateUrl: \"common/components/watchers.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", \"$translate\", WatchersDirective]);\n\n AssignedToDirective = function($rootscope, $confirm, $repo, $loading, $modelTransform, $template, $translate, $compile, $currentUserService, avatarService) {\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 = function(userId) {\n var currentLoading, item, transform;\n item = $model.$modelValue.clone();\n item.assigned_to = userId;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(item) {\n item.assigned_to = userId;\n return item;\n });\n transform.then(function() {\n currentLoading.finish();\n renderAssignedTo($modelTransform.getObj());\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n });\n return transform;\n };\n renderAssignedTo = function(assignedObject) {\n var avatar, bg, ctx, fullName, html, isIocaine, isUnassigned;\n avatar = avatarService.getAvatar(assignedObject != null ? assignedObject.assigned_to_extra_info : void 0);\n bg = null;\n if ((assignedObject != null ? assignedObject.assigned_to : void 0) != null) {\n fullName = assignedObject.assigned_to_extra_info.full_name_display;\n isUnassigned = false;\n bg = avatar.bg;\n } else {\n fullName = $translate.instant(\"COMMON.ASSIGNED_TO.ASSIGN\");\n isUnassigned = true;\n }\n isIocaine = assignedObject != null ? assignedObject.is_iocaine : void 0;\n ctx = {\n fullName: fullName,\n avatar: avatar.url,\n bg: bg,\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\", \".remove-user\", 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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$translate\", \"$compile\", \"tgCurrentUserService\", \"tgAvatarService\", 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 ListItemEpicStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var epic;\n epic = $scope.$eval($attrs.tgListitemEpicStatus);\n return bindOnce($scope, \"epicStatusById\", function(epicStatusById) {\n return $el.html(epicStatusById[epic.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemEpicStatus\", ListItemEpicStatusDirective);\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, avatarService) {\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 avatar, ctx, item, member;\n item = $scope.$eval($attrs.tgListitemAssignedto);\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = usersById[item.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\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\", \"tgAvatarService\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 if (title) {\n el.find(\".title\").text(title);\n }\n if (subtitle) {\n el.find(\".subtitle\").text(subtitle);\n }\n if (message) {\n el.find(\".message\").text(message);\n }\n el.on(\"click.confirm-dialog\", \".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\", \".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\", \".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(\".title\").html(message);\n el.on(\"click.confirm-dialog\", \".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\", \".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, icon) {\n var defered, detailImage, el, svgContainer, useSVG;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-success\");\n el.find(\"img\").remove();\n el.find(\"svg\").remove();\n if (icon) {\n if (icon.type === \"img\") {\n detailImage = $('').addClass('lb-icon').attr('src', icon.name);\n } else if (icon.type === \"svg\") {\n detailImage = document.createElement(\"div\");\n taiga.addClass(detailImage, \"icon\");\n taiga.addClass(detailImage, icon.name);\n taiga.addClass(detailImage, \"lb-icon\");\n svgContainer = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n useSVG = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n useSVG.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + icon.name);\n detailImage.appendChild(svgContainer).appendChild(useSVG);\n }\n if (detailImage) {\n el.find('section').prepend(detailImage);\n }\n }\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n el.on(\"click.confirm-dialog\", \".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\", \".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, spin) {\n var el;\n if (spin == null) {\n spin = false;\n }\n el = angular.element(\".lightbox-generic-loading\");\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n if (spin) {\n el.find(\".spin\").removeClass(\"hidden\");\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(\".title\").html(title);\n }\n if (message) {\n el.find(\".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').one('animationend', function() {\n return $(this).removeClass('inactive');\n });\n return delete _this.tsem;\n };\n })(this));\n return el.on(\"click\", \".icon-close, .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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, 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 RICHTEXT_TYPE = \"url\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\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 key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\n }, {\n key: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\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(scope1, rootscope, repo, rs, confirm, q) {\n this.scope = scope1;\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, hash;\n $ctrl = $ctrls[0];\n $model = $ctrls[1];\n hash = collapsedHash($attrs.type);\n $scope.collapsed = $storage.get(hash) || false;\n bindOnce($scope, $attrs.ngModel, function(value) {\n $ctrl.initialize($attrs.type, value.id);\n return $ctrl.loadCustomAttributesValues();\n });\n $scope.toggleCollapse = function() {\n $scope.collapsed = !$scope.collapsed;\n return $storage.set(hash, $scope.collapsed);\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm\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, wysiwygService) {\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, scope, 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 scope = $scope.$new();\n scope.attributeHtml = wysiwygService.getHTML(value);\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 $scope.saveCustomRichText = (function(_this) {\n return function(markdown, callback) {\n attributeValue.value = markdown;\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n callback();\n return render(attributeValue, false);\n });\n };\n })(this);\n $scope.cancelCustomRichText = (function(_this) {\n return function() {\n render(attributeValue, false);\n return null;\n };\n })(this);\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, input;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n input = $el.find(\"input[name=value], textarea[name='value']\");\n attributeValue.value = input.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 }\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 if (attributeValue.value === null || attributeValue.value === void 0) {\n attributeValue.value = \"\";\n }\n $scope.customAttributeValue = attributeValue;\n render(attributeValue);\n $el.on(\"click\", \".js-value-view-mode span a\", function(event) {\n return event.stopPropagation();\n });\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\", \".js-edit-description\", 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\", \".js-save-description\", 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\", \"tgWysiwygService\", CustomAttributeValueDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 EmojisService, 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\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n EmojisService = (function(superClass) {\n extend(EmojisService, superClass);\n\n EmojisService.$inject = [];\n\n function EmojisService() {\n this.replaceEmojiNameByHtmlImgs = bind(this.replaceEmojiNameByHtmlImgs, this);\n this.replaceEmojiNameByImgs = bind(this.replaceEmojiNameByImgs, this);\n this.replaceImgsByEmojiName = bind(this.replaceImgsByEmojiName, this);\n this.getEmojiByName = bind(this.getEmojiByName, this);\n this.getEmojiById = bind(this.getEmojiById, this);\n this.searchByName = bind(this.searchByName, this);\n this.emojis = _.map(taiga.emojis, function(it) {\n it.image = (\"/\" + window._version + \"/emojis/\") + it.image;\n return it;\n });\n this.emojisById = _.keyBy(this.emojis, 'id');\n this.emojisByName = _.keyBy(this.emojis, 'name');\n }\n\n EmojisService.prototype.searchByName = function(name) {\n return _.filter(this.emojis, function(it) {\n return it.name.indexOf(name) !== -1;\n });\n };\n\n EmojisService.prototype.getEmojiById = function(id) {\n return this.emojisById[id];\n };\n\n EmojisService.prototype.getEmojiByName = function(name) {\n return this.emojisByName[name];\n };\n\n EmojisService.prototype.replaceImgsByEmojiName = function(html) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(html, /emojis\\/([^\"]+).png\"/gi);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(']+\\>', 'g');\n emoji = this.getEmojiById(emojiId);\n html = html.replace(regexImgs, ':' + emoji.name + ':');\n }\n return html;\n };\n\n EmojisService.prototype.replaceEmojiNameByImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + emojiId + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '![alt](' + emoji.image + ')');\n }\n }\n return text;\n };\n\n EmojisService.prototype.replaceEmojiNameByHtmlImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + _.escapeRegExp(emojiId) + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '');\n }\n }\n return text;\n };\n\n return EmojisService;\n\n })(taiga.Service);\n\n module.service(\"$tgEmojis\", EmojisService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, points) {\n us.points = points;\n estimationProcess.render();\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 loading: false\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, $template, $compile, $modelTransform, $confirm) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = function(points) {\n var onError, transform;\n transform = $modelTransform.save((function(_this) {\n return function(us) {\n us.points = points;\n return us;\n };\n })(this));\n onError = (function(_this) {\n return function() {\n return $confirm.notify(\"error\");\n };\n })(this);\n return transform.then(null, onError);\n };\n $scope.$watchCollection(function() {\n return $model.$modelValue && $model.$modelValue.points;\n }, function() {\n var estimationProcess, us;\n us = $model.$modelValue;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n estimationProcess.loading = roleId;\n estimationProcess.render();\n return save(points).then(function() {\n estimationProcess.loading = false;\n $rootScope.$broadcast(\"object:updated\");\n return estimationProcess.render();\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 loading: estimationProcess.loading\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\", \"$tgTemplate\", \"$compile\", \"$tgQueueModelTransformation\", \"$tgConfirm\", UsEstimationDirective]);\n\n EstimationsService = function($template, $repo, $confirm, $q, $qqueue) {\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.loading = false;\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 deferred.resolve();\n return _this.render();\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 \"?\";\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 return _this.onSelectedPointForRole(roleId, pointId, points);\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\", \"$tgRepo\", \"$tgConfirm\", \"$q\", \"$tgQqueue\", EstimationsService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 byRefFilter, darkerFilter, defaultFilter, emojify, inArray, markdownToHTML, module, momentFormat, momentFromNow, sizeFormat, taiga, toMutableFilter, 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 toMutableFilter = function() {\n var memoizedMutable, toMutable;\n toMutable = function(js) {\n return js.toJS();\n };\n memoizedMutable = _.memoize(toMutable);\n return function(input) {\n if (input instanceof Immutable.List) {\n return memoizedMutable(input);\n }\n return input;\n };\n };\n\n module.filter(\"toMutable\", toMutableFilter);\n\n byRefFilter = function($filterFilter) {\n return function(userstories, filter) {\n var cleanRef;\n if (filter != null ? filter.startsWith(\"#\") : void 0) {\n cleanRef = filter.substr(1);\n return _.filter(userstories, (function(_this) {\n return function(us) {\n return String(us.ref).startsWith(cleanRef);\n };\n })(this));\n }\n return $filterFilter(userstories, filter);\n };\n };\n\n module.filter(\"byRef\", [\"filterFilter\", byRefFilter]);\n\n darkerFilter = function() {\n return function(color, luminosity) {\n var black, c, i, j, len, newColor, ref, white;\n color = new String(color).replace(/[^0-9a-f]/gi, '');\n if (color.length < 6) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n luminosity = luminosity || 0;\n newColor = \"#\";\n c = 0;\n i = 0;\n black = 0;\n white = 255;\n ref = [0, 1, 2];\n for (j = 0, len = ref.length; j < len; j++) {\n i = ref[j];\n c = parseInt(color.substr(i * 2, 2), 16);\n c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);\n newColor += (\"00\" + c).substr(c.length);\n }\n return newColor;\n };\n };\n\n module.filter(\"darker\", darkerFilter);\n\n markdownToHTML = function(wysiwigService) {\n return function(input) {\n if (input) {\n return wysiwigService.getHTML(input);\n }\n return \"\";\n };\n };\n\n module.filter(\"markdownToHTML\", [\"tgWysiwygService\", markdownToHTML]);\n\n inArray = function($filter) {\n return function(list, arrayFilter, element) {\n var filter;\n if (arrayFilter) {\n filter = $filter(\"filter\");\n return filter(list, function(listItem) {\n return arrayFilter.indexOf(listItem[element]) !== -1;\n });\n }\n };\n };\n\n module.filter(\"inArray\", [\"$filter\", inArray]);\n\n emojify = function($emojis) {\n return function(input) {\n if (input) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(input));\n }\n return \"\";\n };\n };\n\n module.filter(\"emojify\", [\"$tgEmojis\", emojify]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, BlockLightboxDirective, BlockingMessageInputDirective, CreateBulkUserstoriesDirective, CreateEditUserstoryDirective, LightboxDirective, LightboxKeyboardNavigationService, LightboxLeaveProjectWarningDirective, LightboxService, WatchersLightboxDirective, bindOnce, debounce, module, sizeFormat, timeout, 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 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 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 trim = this.taiga.trim;\n\n LightboxService = (function(superClass) {\n extend(LightboxService, superClass);\n\n function LightboxService(animationFrame, q, rootScope) {\n this.animationFrame = animationFrame;\n this.q = q;\n this.rootScope = rootScope;\n }\n\n LightboxService.prototype.open = function($el, onClose, onEsc) {\n var defered, docEl, lightboxContent;\n this.onClose = onClose;\n if (_.isString($el)) {\n $el = $($el);\n }\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 var firstField;\n firstField = $el.find('input,textarea').first();\n if (firstField.length) {\n return $el.find('input,textarea').first().focus();\n } else if (document.activeElement) {\n return $(document.activeElement).blur();\n }\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 if (onEsc) {\n return _this.rootScope.$applyAsync(onEsc);\n } else {\n return _this.close($el);\n }\n }\n };\n })(this));\n return defered.promise;\n };\n\n LightboxService.prototype.close = function($el) {\n return new Promise((function(_this) {\n return function(resolve) {\n var docEl, scope;\n if (_.isString($el)) {\n $el = $($el);\n }\n docEl = angular.element(document);\n docEl.off(\".lightbox\");\n docEl.off(\".keyboard-navigation\");\n $el.addClass('close-started');\n _this.animationFrame.add(function() {\n $el.addClass('close');\n return $el.one(\"transitionend\", function() {\n $el.removeAttr('style');\n $el.removeClass(\"open\").removeClass('close').removeClass('close-started');\n if (_this.onClose) {\n _this.rootScope.$apply(_this.onClose);\n }\n return resolve();\n });\n });\n if ($el.hasClass(\"remove-on-close\")) {\n scope = $el.data(\"scope\");\n if (scope) {\n scope.$destroy();\n }\n return $el.remove();\n }\n };\n })(this));\n };\n\n LightboxService.prototype.getLightboxOpen = function() {\n return $(\".lightbox.open:not(.close-started)\");\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\", \"$rootScope\", 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 if (!$attrs.$attr.visible) {\n return $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\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, $modelTransform, $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 = (function(_this) {\n return function(finishCallback) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.is_blocked = false;\n item.blocked_note = \"\";\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n return finishCallback();\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return item.revert();\n });\n transform[\"finally\"](function() {\n return finishCallback();\n });\n return transform;\n };\n })(this);\n block = function() {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\".button-green\")).start();\n transform = $modelTransform.save(function(item) {\n item.is_blocked = true;\n item.blocked_note = $el.find(\".reason\").val();\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\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 return unblock(finishCallback);\n };\n })(this));\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return block();\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\", \"$tgQueueModelTransformation\", \"$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, close, createAttachments, deleteAttachments, form, resetAttachments, submit, submitButton;\n form = null;\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 attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.us.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([value, color]);\n return $scope.us.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.us.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.us.tags = itemtags;\n return _.pull($scope.us.tags, value);\n };\n $scope.$on(\"usform:new\", function(ctx, projectId, status, statusList) {\n if (form) {\n form.reset();\n }\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 subject: \"\",\n description: \"\"\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 $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\n });\n $scope.$on(\"usform:edit\", function(ctx, us, attachments) {\n if (form) {\n form.reset();\n }\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 $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\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, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n params = {\n include_attachments: true,\n include_tasks: true\n };\n if ($scope.isNew) {\n promise = $repo.create(\"userstories\", $scope.us);\n broadcastEvent = \"usform:new:success\";\n } else {\n promise = $repo.save($scope.us, true);\n broadcastEvent = \"usform:edit:success\";\n }\n promise.then(function(data) {\n return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n currentLoading.finish();\n lightboxService.close($el);\n return $rs.userstories.getByRef(data.project, data.ref, params).then(function(us) {\n return $rootScope.$broadcast(broadcastEvent, us);\n });\n };\n })(this));\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 close = (function(_this) {\n return function() {\n if (!$scope.us.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.us.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.us.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.on(\"submit\", \"form\", submit);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\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, $model) {\n var link;\n link = function($scope, $el, attrs) {\n var form, submit, submitButton;\n form = null;\n $scope.$on(\"usform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\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, 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 result = _.map(result.data, (function(_this) {\n return function(x) {\n return $model.make_model('userstories', x);\n };\n })(this));\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\", \"$tgModel\", CreateBulkUserstoriesDirective]);\n\n AssignedToLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\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 _.includes(username, text);\n };\n render = function(selected, text) {\n var ctx, html, users, visibleUsers;\n users = _.clone($scope.activeUsers, true);\n if (selected != null) {\n users = _.reject(users, {\n \"id\": selected.id\n });\n }\n users = _.sortBy(users, function(o) {\n if (o.id === $scope.user.id) {\n return 0;\n } else {\n return o.id;\n }\n });\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n return user.avatar = avatarService.getAvatar(user);\n });\n if (selected) {\n if (selected) {\n selected.avatar = avatarService.getAvatar(selected);\n }\n }\n ctx = {\n selected: selected,\n users: _.slice(users, 0, 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\", \"tgAvatarService\", AssignedToLightboxDirective]);\n\n WatchersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\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 _.includes(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, visibleUsers;\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n user.avatar = avatarService.getAvatar(user);\n return user;\n });\n ctx = {\n selected: false,\n users: visibleUsers,\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(200, 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\", \"tgAvatarService\", WatchersLightboxDirective]);\n\n LightboxLeaveProjectWarningDirective = 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-leave-project-warning.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLightboxLeaveProjectWarning\", [\"lightboxService\", LightboxLeaveProjectWarningDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 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 open: function() {\n return open;\n },\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 if (!target.hasClass('loading') && !service.settings.template) {\n service.settings.template = target.html();\n }\n timeoutId = setTimeout((function() {\n if (!target.hasClass('loading')) {\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 priority: 99999,\n link: link\n };\n };\n\n module.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 $scope.$watch($attrs.tgRelatedTaskStatus, function() {\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n return updateTaskStatus($el, task, $scope.taskStatusById);\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 ColorizeTagsBacklogDirective, LbTagLineDirective, 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 _.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 ColorizeTagsBacklogDirective = function($emojis) {\n var link, template;\n template = _.template(\"<% _.each(tags, function(tag) { %>\\n <% if (tag[1] !== null) { %>\\n \\\"\\n title=\\\"<%- tag[0] %>\\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\\n<% _.each(tags, function(tag) { %>\\n <% if (tag[1] === null) { %>\\n \\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\");\n link = function($scope, $el, $attrs, $ctrl) {\n var render;\n render = function(tags) {\n var html;\n html = template({\n tags: tags,\n emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n });\n return $el.html(html);\n };\n $scope.$watch($attrs.tgColorizeBacklogTags, 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(\"tgColorizeBacklogTags\", [\"$tgEmojis\", ColorizeTagsBacklogDirective]);\n\n LbTagLineDirective = function($rs, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, autocomplete, link, templateTags;\n ENTER_KEY = 13;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true);\n autocomplete = null;\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideSaveButton, renderTags, resetInput, saveInputTag, showSaveButton, withoutColors;\n withoutColors = _.has($attrs, \"withoutColors\");\n renderTags = function(tags, tagsColors) {\n var color, ctx, html;\n if (tagsColors == null) {\n tagsColors = [];\n }\n color = !withoutColors ? tagsColors[t] : null;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n style: color ? \"border-left: 5px solid \" + color : \"\"\n };\n })\n };\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\".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 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\", \".remove-tag\", 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 input;\n input = $el.find(\"input\");\n autocomplete = new Awesomplete(input[0], {\n list: _.keys(project.tags_colors)\n });\n return input.on(\"awesomplete-selectcomplete\", function() {\n addValue(input.val());\n return input.val(\"\");\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}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, form, getLastSprint, hasErrors, remove, resetSprint, submit, ussToAdd;\n hasErrors = false;\n createSprint = true;\n form = null;\n $scope.newSprint = {};\n ussToAdd = null;\n resetSprint = function() {\n if (form) {\n form.reset();\n }\n return $scope.newSprint = {\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, estimated_end, estimated_start, 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 broadcastEvent = null;\n estimated_start = $('.date-start').val();\n estimated_end = $('.date-end').val();\n if (createSprint) {\n newSprint = angular.copy($scope.newSprint);\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.create(\"milestones\", newSprint);\n broadcastEvent = \"sprintform:create:success\";\n } else {\n newSprint = $scope.newSprint.realClone();\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, 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 $scope.sprints = _.map($scope.sprints, function(it) {\n if (it.id === data.id) {\n return data;\n } else {\n return it;\n }\n });\n if (broadcastEvent === \"sprintform:create:success\" && ussToAdd) {\n $rootscope.$broadcast(broadcastEvent, data, ussToAdd);\n } else {\n $rootscope.$broadcast(broadcastEvent, data);\n }\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.newSprint.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.newSprint);\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove($scope.newSprint).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, uss) {\n var estimatedFinish, estimatedStart, lastSprint, lastSprintNameDom, prettyDate, text;\n ussToAdd = uss;\n resetSprint();\n form = $el.find(\"form\").checksley();\n form.reset();\n createSprint = true;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.newSprint.project = projectId;\n $scope.newSprint.name = null;\n $scope.newSprint.slug = null;\n lastSprint = getLastSprint();\n estimatedStart = moment();\n if (lastSprint) {\n estimatedStart = moment(lastSprint.estimated_finish);\n } else if ($scope.newSprint.estimated_start) {\n estimatedStart = moment($scope.newSprint.estimated_start);\n }\n $scope.newSprint.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.newSprint.estimated_finish) {\n estimatedFinish = moment($scope.newSprint.estimated_finish);\n }\n $scope.newSprint.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.newSprint = sprint.realClone();\n $scope.newSprint.estimated_start = moment($scope.newSprint.estimated_start).format(prettyDate);\n return $scope.newSprint.estimated_finish = moment($scope.newSprint.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\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n BacklogController.prototype.storeCustomFiltersName = 'backlog-custom-filters';\n\n BacklogController.prototype.storeFiltersName = 'backlog-filters';\n\n BacklogController.prototype.backlogOrder = {};\n\n BacklogController.prototype.milestonesOrder = {};\n\n function BacklogController(scope1, rootscope, repo, confirm, rs, params1, q, location, appMetaService, navUrls, events, analytics, translate, loading, rs2, modelTransform, errorHandlingService, storage, filterRemoteStorageService, projectService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n bindMethods(this);\n this.backlogOrder = {};\n this.milestonesOrder = {};\n this.page = 1;\n this.disablePagination = false;\n this.firstLoadComplete = false;\n this.scope.userstories = [];\n if (this.applyStoredFilters(this.params.pslug, \"backlog-filters\")) {\n return;\n }\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.displayVelocity = false;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n _this.firstLoadComplete = true;\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.filtersReloadContent = function() {\n return this.loadUserstories(true);\n };\n\n BacklogController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories(true);\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\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(e, data, ussToMove) {\n _this.loadSprints().then(function() {\n return _this.scope.$broadcast(\"sprintform:create:success:callback\", ussToMove);\n });\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\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(true);\n _this.loadProjectStats();\n _this.rootscope.$broadcast(\"filters:update\");\n _this.confirm.notify(\"success\");\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(true);\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(event, data) {\n var index;\n index = _.findIndex(_this.scope.userstories, function(us) {\n return us.id === data.id;\n });\n _this.scope.userstories[index] = data;\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\", (function(_this) {\n return function() {\n _this.loadSprints();\n return _this.loadProjectStats();\n };\n })(this));\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.loadAllPaginatedUserstories();\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.toggleVelocityForecasting = function() {\n this.displayVelocity = !this.displayVelocity;\n if (!this.displayVelocity) {\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n } else {\n this.scope.visibleUserStories = _.map(this.forecastedStories, function(it) {\n return it.ref;\n });\n }\n return scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n };\n })(this));\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 _this.calculateForecasting();\n return stats;\n };\n })(this));\n };\n\n BacklogController.prototype.setMilestonesOrder = function(sprints) {\n var it, j, len, results, sprint;\n results = [];\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n this.milestonesOrder[sprint.id] = {};\n results.push((function() {\n var l, len1, ref1, results1;\n ref1 = sprint.user_stories;\n results1 = [];\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n it = ref1[l];\n results1.push(this.milestonesOrder[sprint.id][it.id] = it.sprint_order);\n }\n return results1;\n }).call(this));\n }\n return results;\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.setMilestonesOrder(sprints);\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.setMilestonesOrder(sprints);\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 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.openSprints = function() {\n return _.filter(this.scope.sprints, (function(_this) {\n return function(sprint) {\n return !sprint.closed;\n };\n })(this)).reverse();\n };\n\n BacklogController.prototype.loadAllPaginatedUserstories = function() {\n var page;\n page = this.page;\n return this.loadUserstories(true, this.scope.userstories.length).then((function(_this) {\n return function() {\n return _this.page = page;\n };\n })(this));\n };\n\n BacklogController.prototype.loadUserstories = function(resetPagination, pageSize) {\n var params, promise;\n if (resetPagination == null) {\n resetPagination = false;\n }\n if (!this.scope.projectId) {\n return null;\n }\n this.loadingUserstories = true;\n this.disablePagination = true;\n params = _.clone(this.location.search());\n this.rs.userstories.storeQueryParams(this.scope.projectId, params);\n if (resetPagination) {\n this.page = 1;\n }\n params.page = this.page;\n promise = this.rs.userstories.listUnassigned(this.scope.projectId, params, pageSize);\n return promise.then((function(_this) {\n return function(result) {\n var header, it, j, len, ref1, userstories;\n userstories = result[0];\n header = result[1];\n if (resetPagination) {\n _this.scope.userstories = [];\n }\n _this.scope.userstories = _this.scope.userstories.concat(_.sortBy(userstories, \"backlog_order\"));\n _this.scope.visibleUserStories = _.map(_this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = _this.scope.userstories;\n for (j = 0, len = ref1.length; j < len; j++) {\n it = ref1[j];\n _this.backlogOrder[it.id] = it.backlog_order;\n }\n _this.loadingUserstories = false;\n if (header('x-pagination-next')) {\n _this.disablePagination = false;\n _this.page++;\n }\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()]).then(this.calculateForecasting);\n };\n\n BacklogController.prototype.calculateForecasting = function() {\n var backlog_points_sum, current_sum, j, len, ref1, results, stats, total_points, us;\n stats = this.scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n backlog_points_sum = 0;\n this.forecastedStories = [];\n ref1 = this.scope.userstories;\n results = [];\n for (j = 0, len = ref1.length; j < len; j++) {\n us = ref1[j];\n current_sum += us.total_points;\n backlog_points_sum += us.total_points;\n this.forecastedStories.push(us);\n if (stats.speed > 0 && backlog_points_sum > stats.speed) {\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n BacklogController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_backlog_activated) {\n this.errorHandlingService.permissionDenied();\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\n BacklogController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n return this.loadBacklog().then((function(_this) {\n return function() {\n var milestone;\n return _this.generateFilters(milestone = \"null\");\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.moveUs = function(ctx, usList, newUsIndex, newSprintId) {\n var afterDestination, beforeDestination, currentSprintId, data, it, j, key, l, len, len1, len2, len3, len4, len5, len6, list, m, modifiedUs, n, newSprint, o, oldSprintId, options, orderField, orderList, p, previous, previousWithTheSameOrder, project, promise, q, ref1, ref2, setOrders, setPreviousOrders, sprint, startIndex, us;\n oldSprintId = usList[0].milestone;\n project = usList[0].project;\n if (oldSprintId) {\n sprint = this.scope.sprintsById[oldSprintId] || this.scope.closedSprintsById[oldSprintId];\n }\n if (newSprintId) {\n newSprint = this.scope.sprintsById[newSprintId] || this.scope.closedSprintsById[newSprintId];\n }\n currentSprintId = newSprintId !== oldSprintId ? newSprintId : oldSprintId;\n orderList = null;\n orderField = \"\";\n if (newSprintId !== oldSprintId) {\n if (newSprintId === null) {\n for (key = j = 0, len = usList.length; j < len; key = ++j) {\n us = usList[key];\n _.remove(sprint.user_stories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n beforeDestination = _.slice(this.scope.userstories, 0, newUsIndex);\n afterDestination = _.slice(this.scope.userstories, newUsIndex);\n this.scope.userstories = this.scope.userstories.concat(usList);\n } else {\n for (l = 0, len1 = usList.length; l < len1; l++) {\n us = usList[l];\n _.remove(this.scope.userstories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[newSprint.id];\n beforeDestination = _.slice(newSprint.user_stories, 0, newUsIndex);\n afterDestination = _.slice(newSprint.user_stories, newUsIndex);\n newSprint.user_stories = newSprint.user_stories.concat(usList);\n }\n } else {\n if (oldSprintId === null) {\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n list = _.filter(this.scope.userstories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n } else {\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[sprint.id];\n list = _.filter(newSprint.user_stories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n }\n }\n previous = beforeDestination[beforeDestination.length - 1];\n setPreviousOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = orderList[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, function(it) {\n return it[orderField] === orderList[previous.id];\n });\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, function(it) {\n return {\n us_id: it.id,\n order: orderList[it.id]\n };\n });\n }\n }\n modifiedUs = [];\n for (key = m = 0, len2 = usList.length; m < len2; key = ++m) {\n us = usList[key];\n us.milestone = currentSprintId;\n us[orderField] = startIndex + key;\n orderList[us.id] = us[orderField];\n modifiedUs.push({\n us_id: us.id,\n order: us[orderField]\n });\n }\n startIndex = orderList[usList[usList.length - 1].id];\n for (key = n = 0, len3 = afterDestination.length; n < len3; key = ++n) {\n it = afterDestination[key];\n orderList[it.id] = startIndex + key + 1;\n }\n this.scope.userstories = _.sortBy(this.scope.userstories, (function(_this) {\n return function(it) {\n return _this.backlogOrder[it.id];\n };\n })(this));\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = this.scope.sprints;\n for (o = 0, len4 = ref1.length; o < len4; o++) {\n sprint = ref1[o];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n ref2 = this.scope.closedSprints;\n for (p = 0, len5 = ref2.length; p < len5; p++) {\n sprint = ref2[p];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n if (usList.length > 1 && (newSprintId !== oldSprintId)) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateMilestone(project, newSprintId, data);\n } else if (usList.length > 1) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateBacklogOrder(project, data);\n } else {\n setOrders = {};\n for (q = 0, len6 = setPreviousOrders.length; q < len6; q++) {\n it = setPreviousOrders[q];\n setOrders[it.us_id] = it.order;\n }\n options = {\n headers: {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n promise = this.repo.save(usList[0], true, {}, options, true);\n }\n promise.then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"sprint:us:moved\");\n if (_this.scope.closedSprintsById && _this.scope.closedSprintsById[oldSprintId]) {\n return _this.rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n };\n })(this));\n return promise;\n };\n\n BacklogController.prototype.updateUserStoryStatus = function() {\n return this.generateFilters().then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"filters:update\");\n _this.loadProjectStats();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.filtersReloadContent();\n }\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(\"edit-story\").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.q.all([_this.loadProjectStats(), _this.loadSprints()]);\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, taiga.UsFiltersMixin));\n\n module.controller(\"BacklogController\", BacklogController);\n\n BacklogDirective = function($repo, $rootscope, $translate, $rs) {\n var doomLineTemplate, link, linkDoomLine, linkFilters, linkToolbar, openFilterInit, 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.displayVelocity) {\n removeDoomlineDom();\n }\n if (($scope.stats != null) && ($scope.stats.total_points != null) && $scope.stats.total_points !== 0 && ($scope.displayVelocity == null)) {\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 $scope.$on(\"userstories:forecast\", removeDoomlineDom);\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 data, 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 data = _.map(selectedUss, function(us) {\n return {\n us_id: us.id,\n order: us.sprint_order\n };\n });\n $rs.userstories.bulkUpdateMilestone($scope.project.id, $scope.sprints[0].id, data).then((function(_this) {\n return function() {\n $ctrl.loadSprints();\n $ctrl.loadProjectStats();\n $ctrl.toggleVelocityForecasting();\n return $ctrl.calculateForecasting();\n };\n })(this));\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 $scope.$on(\"sprintform:create:success:callback\", function(e, ussToMove) {\n return _.partial(moveToCurrentSprint, ussToMove)();\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 $el.on(\"click\", \"#show-tags\", function(event) {\n event.preventDefault();\n $ctrl.toggleShowTags();\n return showHideTags($ctrl);\n });\n return $el.on(\"click\", \".forecasting-add-sprint\", function(event) {\n var ussToMove, ussToMoveList;\n ussToMoveList = $ctrl.forecastedStories;\n if ($scope.currentSprint) {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.milestone = $scope.currentSprint.id;\n us.order = index;\n return us;\n });\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n } else {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.order = index;\n return us;\n });\n return $rootscope.$broadcast(\"sprintform:create\", $scope.projectId, ussToMove);\n }\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 openFilterInit = function($scope, $el, $ctrl) {\n var sidebar;\n sidebar = $el.find(\"sidebar.backlog-filter\");\n sidebar.addClass(\"active\");\n return $ctrl.activeFilters = true;\n };\n showHideFilter = function($scope, $el, $ctrl) {\n var hideText, showText, sidebar, target;\n sidebar = $el.find(\"sidebar.backlog-filter\");\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 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 filters = $ctrl.location.search();\n if (filters.status || filters.tags || filters.q || filters.assigned_to || filters.owner) {\n openFilterInit($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\", \"$tgResources\", 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-down\").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\", \"$translate\", 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, points) {\n us.points = points;\n estimationProcess.render();\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\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 BacklogSortableDirective, bindOnce, deleteElement, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\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() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"project\", function(project) {\n var drake, initIsBacklog, scroll;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n initIsBacklog = false;\n drake = dragula([$el[0], $('.js-empty-backlog')[0]], {\n copySortSource: false,\n copy: false,\n isContainer: function(el) {\n return el.classList.contains('sprint-table');\n },\n moves: function(item) {\n if (!$(item).hasClass('row')) {\n return false;\n }\n return true;\n }\n });\n drake.on('drag', function(item, container) {\n var isChecked, parent;\n parent = $(item).parent();\n initIsBacklog = parent.hasClass('backlog-table-body');\n $(document.body).addClass(\"drag-active\");\n isChecked = $(item).find(\"input[type='checkbox']\").is(\":checked\");\n return window.dragMultiple.start(item, container);\n });\n drake.on('cloned', function(item) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, firstElement, index, isBacklog, parent, sameContainer, sprint, usList;\n parent = $(item).parent();\n $('.doom-line').remove();\n parent = $(item).parent();\n isBacklog = parent.hasClass('backlog-table-body') || parent.hasClass('js-empty-backlog');\n if (initIsBacklog || isBacklog) {\n sameContainer = initIsBacklog === isBacklog;\n } else {\n sameContainer = $(item).scope().sprint.id === parent.scope().sprint.id;\n }\n dragMultipleItems = window.dragMultiple.stop();\n $(document.body).removeClass(\"drag-active\");\n sprint = null;\n firstElement = dragMultipleItems.length ? dragMultipleItems[0] : item;\n if (isBacklog) {\n index = $(firstElement).index(\".backlog-table-body .row\");\n } else {\n index = $(firstElement).index();\n sprint = parent.scope().sprint.id;\n }\n if (!sameContainer) {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n if (dragMultipleItems.length) {\n _.each(dragMultipleItems, function(item) {\n return deleteElement(item);\n });\n } else {\n deleteElement(item);\n }\n } else {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n }\n return $scope.$emit(\"sprint:us:move\", usList, index, sprint);\n });\n scroll = autoScroll([window], {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSortable\", BacklogSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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(\".compact-sprint\");\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 > .compact-sprint\", function(event) {\n event.preventDefault();\n toggleSprint($el);\n return $el.find(\".sprint-table\").slideToggle(slideOptions);\n });\n $el.on(\"click\", \".edit-sprint\", 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(\"sprint\", function(sprint) {\n return render(sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\"\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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(new Date(x.day).getTime());\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, 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 bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n CreateEditTaskDirective = function($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate, $q, $confirm, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, close, createAttachments, deleteAttachments, resetAttachments, submit, submitButton, tagsToAdd;\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 attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\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 promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"task\", attachment.id);\n });\n return $q.all(promises);\n };\n tagsToAdd = [];\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.task.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.task.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.task.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.task.tags = itemtags;\n return _.pull($scope.task.tags, value);\n };\n $scope.$on(\"taskform:new\", function(ctx, sprintId, usId) {\n var create, newTask;\n $scope.task = $model.make_model('tasks', {\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 subject: \"\",\n description: \"\"\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 lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\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 lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\n });\n submitButton = $el.find(\".submit-button\");\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n params = {\n include_attachments: true,\n include_tasks: true\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 return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n return $rs.tasks.getByRef(data.project, data.ref, params).then(function(task) {\n return $rootscope.$broadcast(broadcastEvent, task);\n });\n };\n })(this));\n });\n currentLoading = $loading().target(submitButton).start();\n return promise.then(function(data) {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n close = (function(_this) {\n return function() {\n if (!$scope.task.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.task.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.task.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CreateBulkTasksDirective = function($repo, $rs, $rootscope, $loading, lightboxService, $model) {\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 result = _.map(result, (function(_this) {\n return function(x) {\n return $model.make_model('tasks', x);\n };\n })(this));\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\", \"$tgConfirm\", \"tgAttachmentsService\", CreateEditTaskDirective]);\n\n module.directive(\"tgLbCreateBulkTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$tgModel\", CreateBulkTasksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, 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\", \"tgResources\", \"$routeParams\", \"$q\", \"tgAppMetaService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"tgTaskboardTasks\", \"$tgStorage\", \"tgFilterRemoteStorageService\"];\n\n function TaskboardController(scope, rootscope, repo, confirm, rs1, rs2, params1, q1, appMetaService, location, navUrls, events, analytics, translate, errorHandlingService, taskboardTasksService, storage, filterRemoteStorageService) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\n this.params = params1;\n this.q = q1;\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 this.errorHandlingService = errorHandlingService;\n this.taskboardTasksService = taskboardTasksService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n bindMethods(this);\n this.taskboardTasksService.reset();\n this.scope.userstories = [];\n this.openFilter = false;\n if (this.applyStoredFilters(this.params.pslug, \"tasks-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"TASKBOARD.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usTasks\", (function(_this) {\n return function() {\n return _this.taskboardTasksService.usTasks;\n };\n })(this));\n }\n\n TaskboardController.prototype.firstLoad = function() {\n var promise;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n TaskboardController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n this.loadTasks().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n }\n if (this.zoomLevel === '0') {\n return this.rootscope.$broadcast(\"sprint:zoom0\");\n }\n };\n\n TaskboardController.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), \"tasks-filters\");\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.milestone = this.scope.sprintId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.tasks.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters')]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(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(event, tasks) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(tasks);\n });\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(event, task) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(task);\n });\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(event, task) {\n return _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.replaceModel(task);\n });\n };\n })(this));\n this.scope.$on(\"taskboard:task:move\", this.taskMove);\n return this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n };\n\n TaskboardController.prototype.onAssignedToChanged = function(ctx, userid, taskModel) {\n taskModel.assigned_to = userid;\n this.taskboardTasksService.replaceModel(taskModel);\n return this.repo.save(taskModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.loadTasks();\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.errorHandlingService.permissionDenied();\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._attrs;\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 _this.taskboardTasksService.setUserstories(_this.scope.userstories);\n return sprint;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTasks = function() {\n var params;\n params = {};\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n }\n params = _.merge(params, this.location.search());\n return this.rs.tasks.list(this.scope.projectId, this.scope.sprintId, null, params).then((function(_this) {\n return function(tasks) {\n _this.taskboardTasksService.init(_this.scope.project, _this.scope.usersById);\n return _this.taskboardTasksService.set(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 _this.generateFilters();\n return _this.loadTaskboard().then(function() {\n return _this.setRolePoints();\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.showPlaceHolder = function(statusId, usId) {\n if (!this.taskboardTasksService.tasksRaw.length) {\n if (this.scope.taskStatusList[0].id === statusId && (!this.scope.userstories.length || this.scope.userstories[0].id === usId)) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.editTask = function(id) {\n var task;\n task = this.taskboardTasksService.getTask(id);\n task = task.set('loading', true);\n this.taskboardTasksService.replace(task);\n return this.rs.tasks.getByRef(task.getIn(['model', 'project']), task.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingTask) {\n return _this.rs2.attachments.list(\"task\", task.get('id'), task.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"taskform:edit\", editingTask, attachments.toJS());\n task = task.set('loading', false);\n return _this.taskboardTasksService.replace(task);\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.taskMove = function(ctx, task, oldStatusId, usId, statusId, order) {\n var moveUpdateData, options, params, promise;\n task = this.taskboardTasksService.getTaskModel(task.get('id'));\n moveUpdateData = this.taskboardTasksService.move(task.id, usId, statusId, order);\n params = {\n status__is_archived: false,\n include_attachments: true\n };\n options = {\n headers: {\n \"set-orders\": JSON.stringify(moveUpdateData.set_orders)\n }\n };\n return promise = this.repo.save(task, true, params, options, true).then((function(_this) {\n return function(result) {\n var headers;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.taskboardTasksService.assignOrders(order);\n }\n _this.loadSprintStats();\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.loadTasks();\n }\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.toggleFold = function(id) {\n return this.taskboardTasksService.toggleFold(id);\n };\n\n TaskboardController.prototype.changeTaskAssignedTo = function(id) {\n var task;\n task = this.taskboardTasksService.getTaskModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", task);\n };\n\n TaskboardController.prototype.setRolePoints = function() {\n var computableRoles, getPoint, getRole, pointsByRole;\n computableRoles = _.filter(this.scope.project.roles, \"computable\");\n getRole = (function(_this) {\n return function(roleId) {\n roleId = parseInt(roleId, 10);\n return _.find(computableRoles, function(role) {\n return role.id === roleId;\n });\n };\n })(this);\n getPoint = (function(_this) {\n return function(pointId) {\n var poitnId;\n poitnId = parseInt(pointId, 10);\n return _.find(_this.scope.project.points, function(point) {\n return point.id === pointId;\n });\n };\n })(this);\n pointsByRole = _.reduce(this.scope.userstories, (function(_this) {\n return function(result, us, key) {\n _.forOwn(us.points, function(pointId, roleId) {\n var point, role;\n role = getRole(roleId);\n point = getPoint(pointId);\n if (!result[role.id]) {\n result[role.id] = role;\n result[role.id].points = 0;\n }\n return result[role.id].points += point.value;\n });\n return result;\n };\n })(this), {});\n return this.scope.pointsByRole = Object.keys(pointsByRole).map(function(key) {\n return pointsByRole[key];\n });\n };\n\n return TaskboardController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\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 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:zoom0\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$on(\"sprint:task:moved\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$watch(\"usTasks\", function() {\n if ($scope.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 });\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 if (usId) {\n tasks = $scope.usTasks.getIn([usId.toString(), statusId.toString()]).size;\n } else {\n tasks = $scope.usTasks.getIn(['null', statusId.toString()]).size;\n }\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 if ($scope.ctrl.zoomLevel === '0') {\n return column.css(\"max-width\", 148);\n } else {\n return column.css(\"max-width\", maxColumnWidth);\n }\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}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch;\n return unwatch = $scope.$watch(\"usTasks\", function(usTasks) {\n var containers, deleteElement, drake, filterError, itemEl, newParentScope, oldParentScope, scroll, tdom;\n if (!usTasks || !usTasks.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_task\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n filterError = function() {\n var text;\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\");\n return $tgConfirm.notify(\"error\", text);\n };\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n accepts: function(el, target) {\n return !$(target).hasClass('taskboard-userstory-box');\n },\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n oldParentScope = $(item).parent().scope();\n if ($el.hasClass(\"active-filters\")) {\n filterError();\n setTimeout((function() {\n return drake.cancel(true);\n }), 0);\n return false;\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemTask, newStatusId, newUsId, oldStatusId, oldUsId, parentEl;\n parentEl = $(item).parent();\n itemEl = $(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 return $scope.$apply(function() {\n return $rootscope.$broadcast(\"taskboard:task:move\", itemTask, itemTask.getIn(['model', 'status']), newUsId, newStatusId, itemIndex);\n });\n });\n scroll = autoScroll([$('.taskboard-table-body')[0]], {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$translate\", TaskboardSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 TaskboardTasksService, 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 TaskboardTasksService = (function(superClass) {\n extend(TaskboardTasksService, superClass);\n\n TaskboardTasksService.$inject = [];\n\n function TaskboardTasksService() {\n this.reset();\n }\n\n TaskboardTasksService.prototype.reset = function() {\n this.tasksRaw = [];\n this.foldStatusChanged = {};\n return this.usTasks = Immutable.Map();\n };\n\n TaskboardTasksService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n TaskboardTasksService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.toggleFold = function(taskId) {\n this.foldStatusChanged[taskId] = !this.foldStatusChanged[taskId];\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.add = function(task) {\n this.tasksRaw = this.tasksRaw.concat(task);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.set = function(tasks) {\n this.tasksRaw = tasks;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.setUserstories = function(userstories) {\n return this.userstories = userstories;\n };\n\n TaskboardTasksService.prototype.refreshRawOrder = function() {\n var i, len, ref, results, task;\n this.order = {};\n ref = this.tasksRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n task = ref[i];\n results.push(this.order[task.id] = task.taskboard_order);\n }\n return results;\n };\n\n TaskboardTasksService.prototype.assignOrders = function(order) {\n order = _.invert(order);\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.getTask = function(id) {\n var findedTask;\n findedTask = null;\n this.usTasks.forEach(function(us) {\n us.forEach(function(status) {\n findedTask = status.find(function(task) {\n return task.get('id') === id;\n });\n if (findedTask) {\n return false;\n }\n });\n if (findedTask) {\n return false;\n }\n });\n return findedTask;\n };\n\n TaskboardTasksService.prototype.replace = function(task) {\n return this.usTasks = this.usTasks.map(function(us) {\n return us.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, task);\n }\n return status;\n });\n });\n };\n\n TaskboardTasksService.prototype.getTaskModel = function(id) {\n return _.find(this.tasksRaw, function(task) {\n return task.id === id;\n });\n };\n\n TaskboardTasksService.prototype.replaceModel = function(task) {\n this.tasksRaw = _.map(this.tasksRaw, function(it) {\n if (task.id === it.id) {\n return task;\n } else {\n return it;\n }\n });\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.move = function(id, usId, statusId, index) {\n var afterDestination, beforeDestination, i, it, j, key, len, len1, previous, previousWithTheSameOrder, setOrders, taksWithoutMoved, task, taskByUsStatus;\n task = this.getTaskModel(id);\n taskByUsStatus = _.filter(this.tasksRaw, (function(_this) {\n return function(task) {\n return task.status === statusId && task.user_story === usId;\n };\n })(this));\n taskByUsStatus = _.sortBy(taskByUsStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n taksWithoutMoved = _.filter(taskByUsStatus, (function(_this) {\n return function(it) {\n return it.id !== id;\n };\n })(this));\n beforeDestination = _.slice(taksWithoutMoved, 0, index);\n afterDestination = _.slice(taksWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n if (!previous) {\n this.order[task.id] = 0;\n } else if (previous) {\n this.order[task.id] = this.order[previous.id] + 1;\n }\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[task.id] + key + 1;\n }\n task.status = statusId;\n task.user_story = usId;\n task.taskboard_order = this.order[task.id];\n this.refresh();\n return {\n \"task_id\": task.id,\n \"order\": this.order[task.id],\n \"set_orders\": setOrders\n };\n };\n\n TaskboardTasksService.prototype.refresh = function() {\n var i, j, k, len, len1, len2, model, ref, status, task, taskModel, taskStatusList, tasks, us, usTasks;\n this.tasksRaw = _.sortBy(this.tasksRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n tasks = this.tasksRaw;\n taskStatusList = _.sortBy(this.project.task_statuses, \"order\");\n usTasks = {};\n ref = _.union(this.userstories, [\n {\n id: null\n }\n ]);\n for (i = 0, len = ref.length; i < len; i++) {\n us = ref[i];\n usTasks[us.id] = {};\n for (j = 0, len1 = taskStatusList.length; j < len1; j++) {\n status = taskStatusList[j];\n usTasks[us.id][status.id] = [];\n }\n }\n for (k = 0, len2 = tasks.length; k < len2; k++) {\n taskModel = tasks[k];\n if ((usTasks[taskModel.user_story] != null) && (usTasks[taskModel.user_story][taskModel.status] != null)) {\n task = {};\n model = taskModel.getAttrs();\n task.foldStatusChanged = this.foldStatusChanged[taskModel.id];\n task.model = model;\n task.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n task.id = taskModel.id;\n task.assigned_to = this.usersById[taskModel.assigned_to];\n task.colorized_tags = _.map(task.model.tags, (function(_this) {\n return function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n };\n })(this));\n usTasks[taskModel.user_story][taskModel.status].push(task);\n }\n }\n return this.usTasks = Immutable.fromJS(usTasks);\n };\n\n return TaskboardTasksService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgTaskboardTasks\", TaskboardTasksService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: kanban-userstories.service.coffee\n */\n\n(function() {\n var KanbanUserstoriesService, 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 KanbanUserstoriesService = (function(superClass) {\n extend(KanbanUserstoriesService, superClass);\n\n KanbanUserstoriesService.$inject = [];\n\n function KanbanUserstoriesService() {\n this.reset();\n }\n\n KanbanUserstoriesService.prototype.reset = function() {\n this.userstoriesRaw = [];\n this.archivedStatus = [];\n this.statusHide = [];\n this.foldStatusChanged = {};\n return this.usByStatus = Immutable.Map();\n };\n\n KanbanUserstoriesService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n KanbanUserstoriesService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.toggleFold = function(usId) {\n this.foldStatusChanged[usId] = !this.foldStatusChanged[usId];\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.set = function(userstories) {\n this.userstoriesRaw = userstories;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.add = function(us) {\n this.userstoriesRaw = this.userstoriesRaw.concat(us);\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.addArchivedStatus = function(statusId) {\n return this.archivedStatus.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.isUsInArchivedHiddenStatus = function(usId) {\n var us;\n us = this.getUsModel(usId);\n return this.archivedStatus.indexOf(us.status) !== -1 && this.statusHide.indexOf(us.status) !== -1;\n };\n\n KanbanUserstoriesService.prototype.hideStatus = function(statusId) {\n this.deleteStatus(statusId);\n return this.statusHide.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.showStatus = function(statusId) {\n return _.remove(this.statusHide, function(it) {\n return it === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.getStatus = function(statusId) {\n return _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.deleteStatus = function(statusId) {\n var toDelete;\n toDelete = _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n toDelete = _.map(function(it) {\n return it.id;\n });\n this.archived = _.difference(this.archived, toDelete);\n this.userstoriesRaw = _.filter(this.userstoriesRaw, function(us) {\n return us.status !== statusId;\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.refreshRawOrder = function() {\n var i, it, len, ref, results;\n this.order = {};\n ref = this.userstoriesRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n it = ref[i];\n results.push(this.order[it.id] = it.kanban_order);\n }\n return results;\n };\n\n KanbanUserstoriesService.prototype.assignOrders = function(order) {\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.move = function(usList, statusId, index) {\n var afterDestination, beforeDestination, i, initialLength, it, j, k, key, len, len1, len2, modifiedUs, previous, previousWithTheSameOrder, setNextOrders, setOrders, setPreviousOrders, startIndex, us, usByStatus, usByStatusWithoutMoved;\n initialLength = usList.length;\n usByStatus = _.filter(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return it.status === statusId;\n };\n })(this));\n usByStatus = _.sortBy(usByStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n usByStatusWithoutMoved = _.filter(usByStatus, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(usByStatusWithoutMoved, 0, index);\n afterDestination = _.slice(usByStatusWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n modifiedUs = [];\n setPreviousOrders = [];\n setNextOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = this.order[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return it.kanban_order === _this.order[previous.id];\n };\n })(this));\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[previous.id] + key + initialLength + 1;\n it.kanban_order = this.order[it.id];\n }\n setNextOrders = _.map(afterDestination, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n }\n }\n for (key = k = 0, len2 = usList.length; k < len2; key = ++k) {\n us = usList[key];\n us.status = statusId;\n us.kanban_order = startIndex + key;\n this.order[us.id] = us.kanban_order;\n modifiedUs.push({\n us_id: us.id,\n order: us.kanban_order\n });\n }\n this.refresh();\n return {\n bulkOrders: modifiedUs.concat(setPreviousOrders, setNextOrders),\n usList: modifiedUs,\n set_orders: setOrders\n };\n };\n\n KanbanUserstoriesService.prototype.moveToEnd = function(id, statusId) {\n var us;\n us = this.getUsModel(id);\n this.order[us.id] = -1;\n us.status = statusId;\n us.kanban_order = this.order[us.id];\n this.refresh();\n return {\n \"us_id\": us.id,\n \"order\": -1\n };\n };\n\n KanbanUserstoriesService.prototype.replace = function(us) {\n return this.usByStatus = this.usByStatus.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, us);\n }\n return status;\n });\n };\n\n KanbanUserstoriesService.prototype.replaceModel = function(us) {\n this.userstoriesRaw = _.map(this.userstoriesRaw, function(usItem) {\n if (us.id === usItem.id) {\n return us;\n } else {\n return usItem;\n }\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.getUs = function(id) {\n var findedUs;\n findedUs = null;\n this.usByStatus.forEach(function(status) {\n findedUs = status.find(function(us) {\n return us.get('id') === id;\n });\n if (findedUs) {\n return false;\n }\n });\n return findedUs;\n };\n\n KanbanUserstoriesService.prototype.getUsModel = function(id) {\n return _.find(this.userstoriesRaw, function(us) {\n return us.id === id;\n });\n };\n\n KanbanUserstoriesService.prototype.refresh = function() {\n var usByStatus, userstories;\n this.userstoriesRaw = _.sortBy(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n userstories = this.userstoriesRaw;\n userstories = _.map(userstories, (function(_this) {\n return function(usModel) {\n var model, us;\n us = {};\n model = usModel.getAttrs();\n us.foldStatusChanged = _this.foldStatusChanged[usModel.id];\n us.model = model;\n us.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n us.id = usModel.id;\n us.assigned_to = _this.usersById[usModel.assigned_to];\n us.colorized_tags = _.map(us.model.tags, function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n });\n return us;\n };\n })(this));\n usByStatus = _.groupBy(userstories, function(us) {\n return us.model.status;\n });\n return this.usByStatus = Immutable.fromJS(usByStatus);\n };\n\n return KanbanUserstoriesService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgKanbanUserstories\", KanbanUserstoriesService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, KanbanWipLimitDirective, 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 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 KanbanController = (function(superClass) {\n extend(KanbanController, superClass);\n\n KanbanController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"$tgModel\", \"tgKanbanUserstories\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n KanbanController.prototype.storeCustomFiltersName = 'kanban-custom-filters';\n\n KanbanController.prototype.storeFiltersName = 'kanban-filters';\n\n function KanbanController(scope, rootscope, repo, confirm, rs1, rs2, params1, q, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, model, kanbanUserstoriesService1, storage, filterRemoteStorageService, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\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.errorHandlingService = errorHandlingService;\n this.model = model;\n this.kanbanUserstoriesService = kanbanUserstoriesService1;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService1;\n bindMethods(this);\n this.kanbanUserstoriesService.reset();\n this.openFilter = false;\n this.selectedUss = {};\n if (this.applyStoredFilters(this.params.pslug, \"kanban-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"KANBAN.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usByStatus\", (function(_this) {\n return function() {\n return _this.kanbanUserstoriesService.usByStatus;\n };\n })(this));\n }\n\n KanbanController.prototype.cleanSelectedUss = function() {\n var key, results;\n results = [];\n for (key in this.selectedUss) {\n results.push(this.selectedUss[key] = false);\n }\n return results;\n };\n\n KanbanController.prototype.toggleSelectedUs = function(usId) {\n return this.selectedUss[usId] = !this.selectedUss[usId];\n };\n\n KanbanController.prototype.firstLoad = function() {\n var promise;\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 return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n KanbanController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n return this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n return this.loadUserstories().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n }\n };\n\n KanbanController.prototype.filtersReloadContent = function() {\n return this.loadUserstories().then((function(_this) {\n return function() {\n var i, len, openArchived, results, statusId;\n openArchived = _.difference(_this.kanbanUserstoriesService.archivedStatus, _this.kanbanUserstoriesService.statusHide);\n if (openArchived.length) {\n results = [];\n for (i = 0, len = openArchived.length; i < len; i++) {\n statusId = openArchived[i];\n results.push(_this.loadUserStoriesForStatus({}, statusId));\n }\n return results;\n }\n };\n })(this));\n };\n\n KanbanController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function(event, us) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(us);\n });\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(event, uss) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(uss);\n });\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(event, us) {\n return _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.replaceModel(us);\n });\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.editUs = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUs(id);\n us = us.set('loading', true);\n this.kanbanUserstoriesService.replace(us);\n return this.rs.userstories.getByRef(us.getIn(['model', 'project']), us.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingUserStory) {\n return _this.rs2.attachments.list(\"us\", us.get('id'), us.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", editingUserStory, attachments.toJS());\n us = us.set('loading', false);\n return _this.kanbanUserstoriesService.replace(us);\n });\n };\n })(this));\n };\n\n KanbanController.prototype.showPlaceHolder = function(statusId) {\n if (this.scope.usStatusList[0].id === statusId && !this.kanbanUserstoriesService.userstoriesRaw.length) {\n return true;\n }\n return false;\n };\n\n KanbanController.prototype.toggleFold = function(id) {\n return this.kanbanUserstoriesService.toggleFold(id);\n };\n\n KanbanController.prototype.isUsInArchivedHiddenStatus = function(usId) {\n return this.kanbanUserstoriesService.isUsInArchivedHiddenStatus(usId);\n };\n\n KanbanController.prototype.changeUsAssignedTo = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUsModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", us);\n };\n\n KanbanController.prototype.onAssignedToChanged = function(ctx, userid, usModel) {\n usModel.assigned_to = userid;\n this.kanbanUserstoriesService.replaceModel(usModel);\n return this.repo.save(usModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.filtersReloadContent();\n }\n };\n })(this));\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._attrs;\n };\n })(this));\n };\n\n KanbanController.prototype.loadUserstories = function() {\n var params, promise;\n params = {\n status__is_archived: false\n };\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n params.include_tasks = 1;\n }\n params = _.merge(params, this.location.search());\n promise = this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.kanbanUserstoriesService.init(_this.scope.project, _this.scope.usersById);\n _this.kanbanUserstoriesService.set(userstories);\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 filteredStatus, params;\n filteredStatus = this.location.search().status;\n if (filteredStatus) {\n filteredStatus = filteredStatus.split(\",\").map(function(it) {\n return parseInt(it, 10);\n });\n if (filteredStatus.indexOf(statusId) === -1) {\n return;\n }\n }\n params = {\n status: statusId,\n include_attachments: true,\n include_tasks: true\n };\n params = _.merge(params, this.location.search());\n return this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\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 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 var project;\n project = this.projectService.project.toJS();\n if (!project.is_kanban_activated) {\n this.errorHandlingService.permissionDenied();\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.scope.$emit(\"project:loaded\", project);\n return project;\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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.loadKanban();\n return this.generateFilters();\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.moveUs = function(ctx, usList, newStatusId, index) {\n var data, promise;\n this.cleanSelectedUss();\n usList = _.map(usList, (function(_this) {\n return function(us) {\n return _this.kanbanUserstoriesService.getUsModel(us.id);\n };\n })(this));\n data = this.kanbanUserstoriesService.move(usList, newStatusId, index);\n promise = this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId, data.bulkOrders);\n return promise.then((function(_this) {\n return function() {\n var options, params, promises;\n options = {\n headers: {\n \"set-orders\": JSON.stringify(data.setOrders)\n }\n };\n params = {\n include_attachments: true,\n include_tasks: true\n };\n promises = _.map(usList, function(us) {\n return _this.repo.save(us, true, params, options, true);\n });\n promise = _this.q.all(promises);\n return promise.then(function(result) {\n var headers, order;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.kanbanUserstoriesService.assignOrders(order);\n }\n _this.scope.$broadcast(\"redraw:wip\");\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n _this.filtersReloadContent();\n }\n return promise;\n });\n };\n })(this));\n };\n\n return KanbanController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin, taiga.UsFiltersMixin));\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, kanbanUserstoriesService) {\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 kanbanUserstoriesService.addArchivedStatus(status.id);\n kanbanUserstoriesService.hideStatus(status.id);\n $scope[\"class\"] = \"icon-watch\";\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-watch\";\n $scope.title = showArchivedText;\n $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id);\n return kanbanUserstoriesService.hideStatus(status.id);\n } else {\n $scope[\"class\"] = \"icon-unwatch\";\n $scope.title = hideArchivedText;\n $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id);\n return kanbanUserstoriesService.showStatus(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\", \"tgKanbanUserstories\", KanbanArchivedStatusHeaderDirective]);\n\n KanbanArchivedStatusIntroDirective = function($translate, kanbanUserstoriesService) {\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(hasArchived) {\n if (hasArchived) {\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 hasArchived;\n hasArchived = !!kanbanUserstoriesService.getStatus(newStatusId).length;\n return updateIntroText(hasArchived);\n });\n $scope.$on(\"kanban:shown-userstories-for-status\", function(ctx, statusId, userStoriesLoaded) {\n var hasArchived;\n if (statusId === status.id) {\n kanbanUserstoriesService.deleteStatus(statusId);\n kanbanUserstoriesService.add(userStoriesLoaded);\n hasArchived = !!kanbanUserstoriesService.getStatus(statusId).length;\n return updateIntroText(hasArchived);\n }\n });\n $scope.$on(\"kanban:hidden-userstories-for-status\", function(ctx, statusId) {\n if (statusId === status.id) {\n return updateIntroText(false);\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\", \"tgKanbanUserstories\", KanbanArchivedStatusIntroDirective]);\n\n KanbanSquishColumnDirective = function(rs, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch, updateTableWidth;\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 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 return unwatch = $scope.$watch('usByStatus', function(usByStatus) {\n if (usByStatus.size) {\n $scope.folds = rs.kanban.getStatusColumnModes(projectService.project.get('id'));\n updateTableWidth();\n return unwatch();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", \"tgProjectService\", KanbanSquishColumnDirective]);\n\n KanbanWipLimitDirective = function($timeout) {\n var link;\n link = function($scope, $el, $attrs) {\n var redrawWipLimit, status;\n status = $scope.$eval($attrs.tgKanbanWipLimit);\n redrawWipLimit = (function(_this) {\n return function() {\n $el.find(\".kanban-wip-limit\").remove();\n return $timeout(function() {\n var element;\n element = $el.find(\"tg-card\")[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\", [\"$timeout\", KanbanWipLimitDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 var unwatch;\n return unwatch = $scope.$watch(\"usByStatus\", function(usByStatus) {\n var containers, deleteElement, drake, itemEl, newParentScope, scroll, tdom;\n if (!usByStatus || !usByStatus.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\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 containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n return window.dragMultiple.start(item, containers);\n });\n drake.on('cloned', function(item, dropTarget) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, finalUsList, firstElement, index, newStatus, newStatusId, parentEl, usList;\n parentEl = $(item).parent();\n newParentScope = parentEl.scope();\n newStatusId = newParentScope.s.id;\n dragMultipleItems = window.dragMultiple.stop();\n if (!dragMultipleItems.length) {\n dragMultipleItems = [item];\n }\n firstElement = dragMultipleItems[0];\n index = $(firstElement).index();\n newStatus = newParentScope.s.id;\n usList = _.map(dragMultipleItems, function(item) {\n return $(item).scope().us;\n });\n finalUsList = _.map(usList, function(item) {\n return {\n id: item.get('id'),\n oldStatusId: item.getIn(['model', 'status'])\n };\n });\n return $scope.$apply(function() {\n _.each(usList, (function(_this) {\n return function(item, key) {\n var oldStatus, sameContainer;\n oldStatus = item.getIn(['model', 'status']);\n sameContainer = newStatus === oldStatus;\n if (!sameContainer) {\n itemEl = $(dragMultipleItems[key]);\n return deleteElement(itemEl);\n }\n };\n })(this));\n return $rootscope.$broadcast(\"kanban:us:move\", finalUsList, newStatus, index);\n });\n });\n scroll = autoScroll(containers, {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/epics/detail.coffee\n */\n\n(function() {\n var EpicDetailController, EpicStatusButtonDirective, EpicStatusDisplayDirective, 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(\"taigaEpics\");\n\n EpicDetailController = (function(superClass) {\n extend(EpicDetailController, superClass);\n\n EpicDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function EpicDetailController(scope, rootscope, repo, confirm, rs, rs2, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\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.rs2 = rs2;\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.epicRef = this.params.epicref;\n this.scope.sectionName = this.translate.instant(\"EPIC.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 EpicDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"EPIC.PAGE_TITLE\", {\n epicRef: \"#\" + this.scope.epic.ref,\n epicSubject: this.scope.epic.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"EPIC.PAGE_DESCRIPTION\", {\n epicStatus: ((ref = this.scope.statusById[this.scope.epic.status]) != null ? ref.name : void 0) || \"--\",\n epicDescription: angular.element(this.scope.epic.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n EpicDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on epic\", 1);\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadEpic();\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 EpicDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-epics\", ctx);\n };\n\n EpicDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.immutableProject = this.projectService.project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.epic_statuses;\n this.scope.statusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n EpicDetailController.prototype.loadEpic = function() {\n return this.rs.epics.getByRef(this.scope.projectId, this.params.epicref).then((function(_this) {\n return function(epic) {\n var ctx, ref, ref1;\n _this.scope.epic = epic;\n _this.scope.immutableEpic = Immutable.fromJS(epic._attrs);\n _this.scope.epicId = epic.id;\n _this.scope.commentModel = epic;\n _this.modelTransform.setObject(_this.scope, 'epic');\n if (((ref = _this.scope.epic.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n if (((ref1 = _this.scope.epic.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadUserstories = function() {\n return this.rs2.userstories.listInEpic(this.scope.epicId).then((function(_this) {\n return function(data) {\n return _this.scope.userstories = data;\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadEpic().then((function(_this) {\n return function() {\n return _this.loadUserstories();\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 EpicDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.upvote(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.downvote(this.scope.epicId).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 EpicDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.watch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.unwatch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onSelectColor = function(color) {\n var onSelectColorError, onSelectColorSuccess, transform;\n onSelectColorSuccess = (function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.confirm.notify('success');\n };\n })(this);\n onSelectColorError = (function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this);\n transform = this.modelTransform.save(function(epic) {\n epic.color = color;\n return epic;\n });\n return transform.then(onSelectColorSuccess, onSelectColorError);\n };\n\n return EpicDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"EpicDetailController\", EpicDetailController);\n\n EpicStatusDisplayDirective = 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(epic) {\n var html, status;\n status = $scope.statusById[epic.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(epic) {\n if (epic != null) {\n return render(epic);\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(\"tgEpicStatusDisplay\", [\"$tgTemplate\", \"$compile\", EpicStatusDisplayDirective]);\n\n EpicStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/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_epic\") !== -1;\n };\n render = (function(_this) {\n return function(epic) {\n var html, status;\n status = $scope.statusById[epic.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 = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(epic) {\n epic.status = status;\n return epic;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var epic;\n epic = $model.$modelValue;\n if (epic) {\n return render(epic);\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(\"tgEpicStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", EpicStatusButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function IssueDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\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\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 _this.modelTransform.setObject(_this.scope, '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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadIssue();\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, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/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 = function(statusId) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(issue) {\n issue.status = statusId;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective]);\n\n IssueTypeButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $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 = function(type) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.type = type;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.type : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective]);\n\n IssueSeverityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $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 = function(severity) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.severity = severity;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.severity : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective]);\n\n IssuePriorityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $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 = function(priority) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.priority = priority;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.priority : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective]);\n\n PromoteIssueToUsButtonDirective = function($rootScope, $repo, $confirm, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = (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\", \"$translate\", PromoteIssueToUsButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, 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 bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\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 form.reset();\n resetAttachments();\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createIssueOpen = false;\n });\n $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 return $scope.createIssueOpen = true;\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 attachmentsToAdd = Immutable.List();\n return $scope.attachments = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.issue.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.issue.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.issue.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.issue.tags = itemtags;\n return _.pull($scope.issue.tags, value);\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 form, submit, submitButton;\n form = null;\n $scope.$on(\"issueform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\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, 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, bindMethods, 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 bindMethods = this.taiga.bindMethods;\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\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\", \"tgUserActivityService\"];\n\n IssuesController.prototype.filtersHashSuffix = \"issues-filters\";\n\n IssuesController.prototype.myFiltersHashSuffix = \"issues-my-filters\";\n\n function IssuesController(scope, rootscope, repo, confirm, rs, urls, params1, q1, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, storage, filterRemoteStorageService, projectService) {\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.urls = urls;\n this.params = params1;\n this.q = q1;\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.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n this.loadIssues = bind(this.loadIssues, this);\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"PROJECT.SECTION.ISSUES\");\n this.voting = false;\n if (this.applyStoredFilters(this.params.pslug, this.filtersHashSuffix)) {\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.changeQ = function(q) {\n this.unselectFilter(\"page\");\n this.replaceFilter(\"q\", q);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeFilter = function(filter) {\n this.unselectFilter(\"page\");\n this.unselectFilter(filter.dataType, filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.addFilter = function(newFilter) {\n this.unselectFilter(\"page\");\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.selectCustomFilter = function(customFilter) {\n var orderBy;\n orderBy = this.location.search().order_by;\n if (orderBy) {\n customFilter.filter.order_by = orderBy;\n }\n this.unselectFilter(\"page\");\n this.replaceAllFilters(customFilter.filter);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, j, len, ref;\n ref = this.selectedFilters;\n for (j = 0, len = ref.length; j < len; j++) {\n filter = ref[j];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n IssuesController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.type = urlfilters.type;\n filters.severity = urlfilters.severity;\n filters.priority = urlfilters.priority;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.filtersHashSuffix);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.type = urlfilters.type;\n loadFilters.severity = urlfilters.severity;\n loadFilters.priority = urlfilters.priority;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.issues.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, priority, role, selected, severity, statuses, tags, tagsWithAtLeastOneElement, type;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n type = _.map(data.types, function(it) {\n it.id = it.id.toString();\n return it;\n });\n severity = _.map(data.severities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n priority = _.map(data.priorities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.type) {\n selected = _this.formatSelectedFilters(\"type\", type, loadFilters.type);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.severity) {\n selected = _this.formatSelectedFilters(\"severity\", severity, loadFilters.severity);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.priority) {\n selected = _this.formatSelectedFilters(\"priority\", priority, loadFilters.priority);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TYPE\"),\n dataType: \"type\",\n content: type\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.SEVERITY\"),\n dataType: \"severity\",\n content: severity\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.PRIORITIES\"),\n dataType: \"priority\",\n content: priority\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\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.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_issues_activated) {\n this.errorHandlingService.permissionDenied();\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\n IssuesController.prototype.loadIssuesRequests = 0;\n\n IssuesController.prototype.loadIssues = function() {\n var params, promise;\n params = this.location.search();\n promise = this.rs.issues.list(this.scope.projectId, params);\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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.generateFilters();\n return this.loadIssues();\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 IssuesController.prototype.upVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.upvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.downVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.downvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.getOrderBy = function() {\n if (_.isString(this.location.search().order_by)) {\n return this.location.search().order_by;\n } else {\n return \"created_date\";\n }\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, svg;\n currentOrder = $ctrl.getOrderBy();\n if (currentOrder) {\n icon = startswith(currentOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n colHeadElement = $el.find(\".row.title > div[data-fieldname='\" + (trim(currentOrder, \"-\")) + \"']\");\n svg = $(\"\").attr(\"svg-icon\", icon);\n colHeadElement.append(svg);\n $compile(colHeadElement.contents())($scope);\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.getOrderBy();\n newOrder = target.data(\"fieldname\");\n if (newOrder === 'total_voters' && currentOrder !== \"-total_voters\") {\n currentOrder = \"total_voters\";\n }\n finalOrder = currentOrder === newOrder ? \"-\" + newOrder : newOrder;\n return $scope.$apply(function() {\n $ctrl.replaceFilter(\"order_by\", finalOrder);\n $ctrl.storeFilters($ctrl.params.pslug, $location.search(), $ctrl.filtersHashSuffix);\n return $ctrl.loadIssues().then(function() {\n $el.find(\".row.title > div > tg-svg\").remove();\n icon = startswith(finalOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n svg = $(\"\").attr(\"svg-icon\", icon);\n target.append(svg);\n return $compile(target.contents())($scope);\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 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 target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\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 return $repo.save(issue).then(function() {\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('status')) {\n return $ctrl.loadIssues();\n }\n });\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, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
<%- name %>
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, issue, updateIssue;\n updateIssue = function(issue) {\n var avatar, 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 avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = null;\n if (member) {\n ctx.name = member.full_name_display;\n ctx.bg = avatar.bg;\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(ctx, userId, updatedIssue) {\n if (updatedIssue.id === issue.id) {\n updatedIssue.assigned_to = userId;\n return $repo.save(issue).then(function() {\n updateIssue(updatedIssue);\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('assigned_to') || $ctrl.isFilterDataTypeSelected('role')) {\n return $ctrl.loadIssues();\n }\n });\n }\n });\n $scope.$watch($attrs.tgIssueAssignedToInlineEdition, function(val) {\n return updateIssue(val);\n });\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\", \"tgAvatarService\", IssueAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgConfig\", \"tgProjectService\", \"tgWysiwygService\"];\n\n function UserStoryDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, configService, projectService, wysiwigService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.configService = configService;\n this.projectService = projectService;\n this.wysiwigService = wysiwigService;\n bindMethods(this);\n this.scope.usRef = this.params.usref;\n this.scope.sectionName = this.translate.instant(\"US.SECTION_NAME\");\n this.scope.tribeEnabled = this.configService.config.tribeHost;\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.wysiwigService.getHTML(this.scope.us.description) || \"\").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 var project;\n project = this.projectService.project.toJS();\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\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 _this.scope.us = us;\n _this.scope.usId = us.id;\n _this.scope.commentModel = us;\n _this.modelTransform.setObject(_this.scope, 'us');\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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadUs().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadTasks()]);\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 UserStoryDetailController.prototype.onTribeInfo = function() {\n var image, publishDesc, publishTitle, text;\n publishTitle = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\");\n image = $('').attr({\n 'src': \"/\" + window._version + \"/images/monster-fight.png\",\n 'alt': this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\")\n });\n text = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TEXT\");\n publishDesc = $('
').append(image).append(text);\n return this.confirm.success(publishTitle, publishDesc);\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, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/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 $el.html(html);\n return $compile($el.contents())($scope);\n };\n })(this);\n save = (function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, transform;\n $el.find(\".pop-status\").popover().close();\n currentLoading = $loading().target($el.find('.js-edit-status')).start();\n transform = $modelTransform.save(function(us) {\n us.status = status;\n return us;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsStatusButtonDirective]);\n\n UsTeamRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $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 = function(team_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.team_requirement = team_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.team_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective]);\n\n UsClientRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $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 = function(client_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.client_requirement = client_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.client_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsClientRequirementButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function TaskDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, projectService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\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\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 _this.modelTransform.setObject(_this.scope, '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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadTask().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadUserStory()]);\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, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/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 = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(task) {\n task.status = status;\n return task;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective]);\n\n TaskIsIocaineButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $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 = function(is_iocaine) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find('label')).start();\n transform = $modelTransform.save(function(task) {\n task.is_iocaine = is_iocaine;\n return task;\n });\n transform.then(function() {\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.is_iocaine : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$compile\", \"$tgTemplate\", TaskIsIocaineButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\"];\n\n function TeamController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, auth, translate, projectService, errorHandlingService) {\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.errorHandlingService = errorHandlingService;\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 var project;\n project = this.projectService.project.toJS();\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 this.scope.owner = project.owner.id;\n return project;\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 key, max, min, singleStat, value;\n max = _.max(_.toArray(stat));\n min = _.min(_.toArray(stat));\n singleStat = Object();\n for (key in stat) {\n if (!hasProp.call(stat, key)) continue;\n value = stat[key];\n if (value === min) {\n singleStat[key] = 0.1;\n } else if (value === max) {\n singleStat[key] = 1;\n } else {\n singleStat[key] = (value * 0.5) / max;\n }\n }\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 project, userRoles;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.loadMembers();\n userRoles = _.map(this.scope.users, function(user) {\n return user.role;\n });\n this.scope.roles = _.filter(this.scope.roles, function(role) {\n return userRoles.indexOf(role.id) !== -1;\n });\n return this.loadMemberStats();\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 project: \"=project\",\n currentUser: \"=currentuser\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\",\n owner: \"=owner\"\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 owner: \"=owner\"\n }\n };\n };\n\n module.directive(\"tgTeamMembers\", TeamMembersDirective);\n\n LeaveProjectDirective = function($repo, $confirm, $location, $rs, $navurls, $translate, lightboxFactory, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var leaveConfirm;\n leaveConfirm = 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($scope.project.id);\n promise.then(function() {\n return currentUserService.loadProjects().then(function() {\n response.finish();\n $confirm.notify(\"success\");\n return $location.path($navurls.resolve(\"home\"));\n });\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 return $scope.leave = function() {\n if ($scope.project.owner.id === $scope.user.id) {\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: true,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\n }\n };\n };\n return {\n scope: {\n user: \"=\",\n project: \"=\"\n },\n templateUrl: \"team/leave-project.html\",\n link: link\n };\n };\n\n module.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\", \"tgLightboxFactory\", \"tgCurrentUserService\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 WikiDetailController, WikiSummaryDirective, WikiWysiwyg, bindOnce, debounce, groupBy, 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\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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiDetailController(scope, rootscope, repo, model, confirm, rs, params, q, location, filter, log, appMetaService, navUrls, analytics, translate, errorHandlingService, projectService) {\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.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.moveLink = bind(this.moveLink, this);\n this.loadWiki = bind(this.loadWiki, this);\n this.scope.$on(\"wiki:links:move\", this.moveLink);\n this.scope.$on(\"wikipage:add\", this.loadWiki);\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\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.wikiSlug,\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 var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\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 i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWiki()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiDetailController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_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.wikiSlug;\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 _this.confirm.notify(\"success\");\n return _this.loadWiki();\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 WikiDetailController.prototype.moveLink = function(ctx, item, itemIndex) {\n var r, values;\n values = this.scope.wikiLinks;\n r = values.indexOf(item);\n values.splice(r, 1);\n values.splice(itemIndex, 0, item);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\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, avatarService) {\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 avatar, 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 avatar = avatarService.getAvatar(user);\n if (user === void 0) {\n user = {\n name: \"unknown\",\n avatar: avatar\n };\n } else {\n user = {\n name: user.full_name_display,\n avatar: avatar\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\", \"tgAvatarService\", WikiSummaryDirective]);\n\n WikiWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $qqueue, $repo, $analytics, wikiHistoryService) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = $qqueue.bindAdd(function(description, cb) {\n var onError, onSuccess, promise;\n onSuccess = function(wikiPage) {\n if ($scope.item.id == null) {\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1);\n $scope.$emit(\"wikipage:add\");\n }\n wikiHistoryService.loadHistoryEntries();\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n $scope.item.content = description;\n if ($scope.item.id != null) {\n promise = $repo.save($scope.item).then(onSuccess, onError);\n } else {\n promise = $repo.create(\"wiki\", $scope.item).then(onSuccess, onError);\n }\n return promise[\"finally\"](cb);\n });\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, 'wiki_page', file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-wiki\";\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf(\"modify_wiki_page\") !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
\\n \\n \\n\\n
\\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n
\\n\"\n };\n };\n\n module.directive(\"tgWikiWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$tgQqueue\", \"$tgRepo\", \"$tgAnalytics\", \"tgWikiHistoryService\", WikiWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $analytics, $loading, $template, $compile, $translate) {\n var link, linkWikiLinks, template;\n template = $template.get(\"wiki/wiki-nav.html\", true);\n linkWikiLinks = function($scope, $el, $attrs) {\n var $ctrl, addWikiLinkPermission, drake, render;\n $ctrl = $el.controller();\n if ($attrs.ngModel == null) {\n return $log.error(\"WikiNavDirective: no ng-model attr is defined\");\n }\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n drake = null;\n render = function(wikiLinks) {\n var deleteWikiLinkPermission, html, itemEl, scroll, tdom;\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 if (addWikiLinkPermission && drake) {\n drake.destroy();\n }\n $el.html(html);\n if (addWikiLinkPermission) {\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('li');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex;\n itemEl = $(item);\n item = itemEl.scope().link;\n itemIndex = itemEl.index();\n return $scope.$emit(\"wiki:links:move\", item, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\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\", \".js-delete-link\", 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_LINK_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 link = function($scope, $el, $attrs) {\n linkWikiLinks($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(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/pages-list.coffee\n */\n\n(function() {\n var WikiPagesListController, 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(\"taigaWiki\");\n\n WikiPagesListController = (function(superClass) {\n extend(WikiPagesListController, superClass);\n\n WikiPagesListController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgNavUrls\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiPagesListController(scope, rootscope, repo, model, confirm, rs, params, q, navUrls, errorHandlingService, projectService) {\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.navUrls = navUrls;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiPagesListController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WikiPagesListController.prototype.loadWikiPages = function() {\n var promise;\n return promise = this.rs.wiki.list(this.scope.projectId).then((function(_this) {\n return function(wikipages) {\n return _this.scope.wikipages = wikipages;\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWikiPages()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiPagesListController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_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 return WikiPagesListController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiPagesListController\", WikiPagesListController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 ChangeOwnerLightboxController, ChangeOwnerLightboxDirective, LbRequestOwnershipDirective, LightboxAddMembersWarningMessageDirective, TransferProjectStartSuccessDirective, debounce, module, taiga;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaKanban\");\n\n LightboxAddMembersWarningMessageDirective = function() {\n return {\n templateUrl: \"admin/memberships-warning-message.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgLightboxAddMembersWarningMessage\", [LightboxAddMembersWarningMessageDirective]);\n\n LbRequestOwnershipDirective = function(lightboxService, rs, confirmService, $translate) {\n return {\n link: function(scope, el) {\n lightboxService.open(el);\n return scope.request = function() {\n scope.loading = true;\n return rs.projects.transferRequest(scope.projectId).then(function() {\n scope.loading = false;\n lightboxService.close(el);\n return confirmService.notify(\"success\", $translate.instant(\"ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP_SUCCESS\"));\n });\n };\n },\n templateUrl: \"common/lightbox/lightbox-request-ownership.html\"\n };\n };\n\n module.directive('tgLbRequestOwnership', [\"lightboxService\", \"tgResources\", \"$tgConfirm\", \"$translate\", LbRequestOwnershipDirective]);\n\n ChangeOwnerLightboxController = (function() {\n function ChangeOwnerLightboxController(rs1, lightboxService1, confirm, translate) {\n this.rs = rs1;\n this.lightboxService = lightboxService1;\n this.confirm = confirm;\n this.translate = translate;\n this.users = [];\n this.q = \"\";\n this.commentOpen = false;\n }\n\n ChangeOwnerLightboxController.prototype.limit = 3;\n\n ChangeOwnerLightboxController.prototype.normalizeString = function(normalizedString) {\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\n ChangeOwnerLightboxController.prototype.filterUsers = function(user) {\n var text, username;\n username = user.full_name_display.toUpperCase();\n username = this.normalizeString(username);\n text = this.q.toUpperCase();\n text = this.normalizeString(text);\n return _.includes(username, text);\n };\n\n ChangeOwnerLightboxController.prototype.getUsers = function() {\n var users;\n if (!this.users.length && !this.q.length) {\n users = this.activeUsers;\n } else {\n users = this.users;\n }\n users = users.slice(0, this.limit);\n users = _.reject(users, {\n \"selected\": true\n });\n return _.reject(users, {\n \"id\": this.currentOwnerId\n });\n };\n\n ChangeOwnerLightboxController.prototype.userSearch = function() {\n this.users = this.activeUsers;\n this.selected = _.find(this.users, {\n \"selected\": true\n });\n if (this.q) {\n return this.users = _.filter(this.users, this.filterUsers.bind(this));\n }\n };\n\n ChangeOwnerLightboxController.prototype.selectUser = function(user) {\n this.activeUsers = _.map(this.activeUsers, function(user) {\n user.selected = false;\n return user;\n });\n user.selected = true;\n return this.userSearch();\n };\n\n ChangeOwnerLightboxController.prototype.submit = function() {\n this.loading = true;\n return this.rs.projects.transferStart(this.projectId, this.selected.id, this.comment).then((function(_this) {\n return function() {\n var desc, title;\n _this.loading = false;\n _this.lightboxService.closeAll();\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_TITLE\");\n desc = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_DESC\");\n return _this.confirm.success(title, desc, {\n type: \"svg\",\n name: \"icon-speak-up\"\n });\n };\n })(this));\n };\n\n return ChangeOwnerLightboxController;\n\n })();\n\n ChangeOwnerLightboxController.$inject = [\"tgResources\", \"lightboxService\", \"$tgConfirm\", \"$translate\"];\n\n module.controller('ChangeOwnerLightbox', ChangeOwnerLightboxController);\n\n ChangeOwnerLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n scope: true,\n controller: \"ChangeOwnerLightbox\",\n controllerAs: \"vm\",\n bindToController: {\n currentOwnerId: \"=\",\n projectId: \"=\",\n activeUsers: \"=\"\n },\n templateUrl: \"common/lightbox/lightbox-change-owner.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbChangeOwner\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", ChangeOwnerLightboxDirective]);\n\n TransferProjectStartSuccessDirective = function(lightboxService) {\n var link;\n link = function(scope, el) {\n scope.close = function() {\n return lightboxService.close(el);\n };\n return lightboxService.open(el);\n };\n return {\n templateUrl: \"common/lightbox/lightbox-transfer-project-start-success.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbTransferProjectStartSuccess\", [\"lightboxService\", TransferProjectStartSuccessDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, NoMoreMembershipsExplanationDirective, 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\", \"$tgAuth\", \"tgLightboxFactory\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function MembershipsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, analytics, appMetaService, translate, auth, lightboxFactory1, errorHandlingService, projectService1) {\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 this.auth = auth;\n this.lightboxFactory = lightboxFactory1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\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.loadInitialData();\n return _this.analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1);\n };\n })(this));\n }\n\n MembershipsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.canAddUsers = project.max_memberships === null || project.max_memberships > project.total_memberships;\n this.scope.$emit('project:loaded', project);\n return project;\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 this.loadProject();\n return this.q.all([this.loadMembers(), this.auth.refresh()]);\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.lightboxFactory.create('tg-lb-add-members', {\n \"class\": \"lightbox lightbox-add-member\",\n \"project\": \"project\"\n }, {\n \"project\": this.scope.project\n });\n };\n\n MembershipsController.prototype.showLimitUsersWarningMessage = function() {\n var icon, message, title;\n title = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING\");\n message = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE\", {\n members: this.scope.project.max_memberships\n });\n icon = \"/\" + window._version + \"/svg/icons/team-question.svg\";\n return this.confirm.success(title, message, {\n name: icon,\n type: \"img\"\n });\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, $compile, avatarService) {\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 avatar, ctx, html;\n avatar = avatarService.getAvatar(member);\n ctx = {\n full_name: member.full_name ? member.full_name : \"\",\n email: member.user_email ? member.user_email : member.email,\n imgurl: avatar.url,\n bg: avatar.bg,\n pending: !member.is_user_active ? pending : \"\",\n isOwner: member.is_owner\n };\n html = template(ctx);\n html = $compile(html)($scope);\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', \"$compile\", \"tgAvatarService\", 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 $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n if ($attrs.tgMembershipsRowAdminCheckbox == null) {\n return $log.error(\"MembershipsRowAdminCheckboxDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox);\n if (member.is_owner) {\n $el.find(\".js-check\").remove();\n return;\n }\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 $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_admin);\n return $confirm.notify(\"error\", data.is_admin[0]);\n };\n target = angular.element(event.currentTarget);\n member.is_admin = target.prop(\"checked\");\n return $repo.save(member).then(onSuccess, onError);\n };\n })(this));\n html = render(member);\n if (member.is_admin) {\n return $el.find(\":checkbox\").prop(\"checked\", true);\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, $location, $navUrls, lightboxFactory, projectService) {\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, leaveConfirm, 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 leaveConfirm = function() {\n var defaultMsg, message, title;\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 (member.user !== $scope.user.id) {\n if ($scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy) {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n }\n projectService.fetchProject().then(function() {\n return $ctrl.loadInitialData();\n });\n } else {\n $location.path($navUrls.resolve(\"home\"));\n }\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\", {\n message: message\n });\n return $confirm.notify(\"success\", text, null, 5000);\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\", text);\n };\n })(this);\n return $repo.remove(member).then(onSuccess, onError);\n });\n };\n $el.on(\"click\", \".delete\", function(event) {\n var isCurrentUser;\n event.preventDefault();\n if ($scope.project.owner.id === member.user) {\n isCurrentUser = $scope.user.id === member.user;\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: isCurrentUser,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\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\", \"$tgLocation\", \"$tgNavUrls\", \"tgLightboxFactory\", \"tgProjectService\", MembershipsRowActionsDirective]);\n\n NoMoreMembershipsExplanationDirective = function() {\n return {\n templateUrl: \"admin/no-more-memberships-explanation.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgNoMoreMembershipsExplanation\", [NoMoreMembershipsExplanationDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 AdminProjectChangeOwnerDirective, AdminProjectRequestOwnershipDirective, AdminProjectRestrictionsDirective, CsvEpicDirective, CsvExporterController, CsvExporterEpicsController, CsvExporterIssuesController, CsvExporterTasksController, CsvExporterUserstoriesController, CsvIssueDirective, CsvTaskDirective, CsvUsDirective, ProjectDefaultValuesDirective, ProjectExportDirective, ProjectLogoDirective, ProjectLogoModelDirective, ProjectModulesDirective, ProjectProfileController, ProjectProfileDirective, bindOnce, debounce, groupBy, joinStr, mixOf, module, scopeDefer, 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 scopeDefer = this.taiga.scopeDefer;\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\", \"$tgAuth\", \"tgCurrentUserService\", \"tgErrorHandlingService\", \"tgProjectService\", \"$tgModel\"];\n\n function ProjectProfileController(scope1, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, tgAuth, currentUserService1, errorHandlingService, projectService1, model1) {\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 = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.tgAuth = tgAuth;\n this.currentUserService = currentUserService1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.model = model1;\n this.scope.project = {};\n this.scope.projectTags = [];\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 _this.appMetaService.setAll(title, description);\n return _this.fillUsersAndRoles(_this.scope.project.members, _this.scope.project.roles);\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 var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.epicStatusList = _.sortBy(project.epic_statuses, \"order\");\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n this.scope.pointsList = _.sortBy(project.points, \"order\");\n this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n this.scope.issueTypesList = _.sortBy(project.issue_types, \"order\");\n this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n this.scope.prioritiesList = _.sortBy(project.priorities, \"order\");\n this.scope.severitiesList = _.sortBy(project.severities, \"order\");\n scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$emit('project:loaded', project);\n };\n })(this));\n this.scope.projectTags = _.map(this.scope.project.tags, (function(_this) {\n return function(it) {\n return [it, _this.scope.project.tags_colors[it]];\n };\n })(this));\n return project;\n };\n\n ProjectProfileController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.tgAuth.refresh();\n };\n\n ProjectProfileController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.project);\n };\n\n ProjectProfileController.prototype.addTag = function(name, color) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n tags.push(name);\n this.scope.projectTags.push([name, null]);\n return this.scope.project.tags = tags;\n };\n\n ProjectProfileController.prototype.deleteTag = function(tag) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n _.pull(tags, tag[0]);\n _.remove(this.scope.projectTags, (function(_this) {\n return function(it) {\n return it[0] === tag[0];\n };\n })(this));\n return this.scope.project.tags = tags;\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, $analytics) {\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, privacyChanged, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n privacyChanged = $scope.project.isAttributeModified(\"is_private\");\n promise = $repo.save($scope.project);\n promise.then(function() {\n var newUrl;\n currentLoading.finish();\n if (privacyChanged && $scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-public-to-private\", \"Change project privacy from public to private\", 1);\n } else if (privacyChanged && !$scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-private-to-public\", \"Change project privacy from private to public\", 1);\n }\n $confirm.notify(\"success\");\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n });\n $location.path(newUrl);\n projectService.fetchProject().then((function(_this) {\n return function() {\n return $ctrl.loadInitialData();\n };\n })(this));\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\", \"$tgAnalytics\", 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 form, promise;\n form = $el.find(\"form\").checksley();\n form.initializeFields();\n form.reset();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save($scope.project);\n promise.then(function() {\n $scope.$emit(\"project:loaded\", $scope.project);\n $confirm.notify(\"success\");\n return projectService.fetchProject();\n });\n return promise.then(null, function(data) {\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this);\n $el.on(\"change\", \".module-activation.module-direct-active input\", function(event) {\n event.preventDefault();\n return $scope.$applyAsync(submit);\n });\n $el.on(\"submit\", \"form\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"keydown\", \".videoconference-attributes input\", function(e) {\n return e.which !== 32;\n });\n $scope.$watch(\"project.videoconferences\", function(newVal, oldVal) {\n if ((newVal != null) && (oldVal != null) && newVal !== oldVal) {\n return $scope.project.videoconferences_extra_data = \"\";\n }\n });\n $scope.$watch(\"isVideoconferenceActivated\", function(newValue, oldValue) {\n if (newValue === false) {\n $scope.project.videoconferences = null;\n $scope.project.videoconferences_extra_data = \"\";\n if (oldValue === true) {\n return submit();\n }\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, $analytics) {\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 $analytics.trackEvent(\"exporter\", \"export-project\", \"Exported project\", 1);\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\", \"$tgAnalytics\", ProjectExportDirective]);\n\n CsvExporterController = (function(superClass) {\n extend(CsvExporterController, superClass);\n\n CsvExporterController.$inject = [\"$scope\", \"$rootScope\", \"$tgUrls\", \"$tgConfirm\", \"$tgResources\", \"$translate\"];\n\n function CsvExporterController(scope1, rootscope, urls, confirm, rs, translate) {\n this.scope = scope1;\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 CsvExporterEpicsController = (function(superClass) {\n extend(CsvExporterEpicsController, superClass);\n\n function CsvExporterEpicsController() {\n return CsvExporterEpicsController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterEpicsController.prototype.type = \"epics\";\n\n return CsvExporterEpicsController;\n\n })(CsvExporterController);\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(\"CsvExporterEpicsController\", CsvExporterEpicsController);\n\n module.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController);\n\n module.controller(\"CsvExporterTasksController\", CsvExporterTasksController);\n\n module.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController);\n\n CsvEpicDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_EPIC\";\n };\n return {\n controller: \"CsvExporterEpicsController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvEpic\", [\"$translate\", CsvEpicDirective]);\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 AdminProjectRestrictionsDirective = function() {\n return {\n scope: {\n \"project\": \"=\"\n },\n templateUrl: \"admin/admin-project-restrictions.html\"\n };\n };\n\n module.directive('tgAdminProjectRestrictions', [AdminProjectRestrictionsDirective]);\n\n AdminProjectRequestOwnershipDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.requestOwnership = function() {\n return lightboxFactory.create(\"tg-lb-request-ownership\", {\n \"class\": \"lightbox lightbox-request-ownership\"\n }, {\n projectId: scope.projectId\n });\n };\n },\n scope: {\n \"projectId\": \"=\",\n \"owner\": \"=\"\n },\n templateUrl: \"admin/admin-project-request-ownership.html\"\n };\n };\n\n module.directive('tgAdminProjectRequestOwnership', [\"tgLightboxFactory\", AdminProjectRequestOwnershipDirective]);\n\n AdminProjectChangeOwnerDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.changeOwner = function() {\n return lightboxFactory.create(\"tg-lb-change-owner\", {\n \"class\": \"lightbox lightbox-select-user\",\n \"project-id\": \"projectId\",\n \"active-users\": \"activeUsers\",\n \"current-owner-id\": \"currentOwnerId\"\n }, {\n projectId: scope.projectId,\n activeUsers: scope.activeUsers,\n currentOwnerId: scope.owner.id,\n members: scope.members\n });\n };\n },\n scope: {\n \"activeUsers\": \"=\",\n \"projectId\": \"=\",\n \"owner\": \"=\",\n \"members\": \"=\"\n },\n templateUrl: \"admin/admin-project-change-owner.html\"\n };\n };\n\n module.directive('tgAdminProjectChangeOwner', [\"tgLightboxFactory\", AdminProjectChangeOwnerDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, ProjectTagsController, ProjectTagsDirective, ProjectValuesController, ProjectValuesDirective, ProjectValuesSectionController, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, bindOnce, debounce, getDefaulColorList, 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 getDefaulColorList = this.taiga.getDefaulColorList;\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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function ProjectValuesSectionController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, errorHandlingService, projectService1) {\n var description, sectionName, title;\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.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.project = {};\n this.loadInitialData();\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 this.appMetaService.setAll(title, description);\n }\n\n ProjectValuesSectionController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\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 var unwatch;\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 unwatch = this.scope.$watch(\"resource\", (function(_this) {\n return function(resource) {\n if (resource) {\n _this.loadValues();\n return unwatch();\n }\n };\n })(this));\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 = _.maxBy(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, projectService) {\n var link, linkDragAndDrop, linkValue;\n linkDragAndDrop = function($scope, $el, $attrs) {\n var drake, itemEl, newParentScope, oldParentScope, scroll, tdom;\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemValue;\n itemEl = $(item);\n itemValue = itemEl.scope().value;\n itemIndex = itemEl.index();\n return $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\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 row.siblings(\".visualization\").removeClass('hidden');\n return projectService.fetchProject();\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\", \".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\", \"tgProjectService\", ProjectValuesDirective]);\n\n ColorSelectionDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var $ctrl;\n $scope.colorList = getDefaulColorList();\n $scope.allowEmpty = false;\n if ($attrs.tgAllowEmpty) {\n $scope.allowEmpty = true;\n }\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 $(\".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 $el.on(\"keyup\", \"input\", function(event) {\n event.stopPropagation();\n if (event.keyCode === 13) {\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n } else if (event.keyCode === 27) {\n return $el.find(\".select-color\").hide();\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(\"tgColorSelection\", ColorSelectionDirective);\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n RICHTEXT_TYPE = \"richtext\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\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: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }, {\n key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\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\", \"tgProjectService\"];\n\n function ProjectCustomAttributesController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, translate, projectService1) {\n var description, sectionName, title;\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.projectService = projectService1;\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 = this.projectService.project.toJS();\n this.scope.projectId = this.scope.project.id;\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 this.appMetaService.setAll(title, description);\n this.scope.init = (function(_this) {\n return function(type) {\n _this.scope.type = type;\n return _this.loadCustomAttributes();\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 var ref;\n _this.scope.customAttributes = customAttributes;\n _this.scope.maxOrder = (ref = _.maxBy(customAttributes, \"order\")) != null ? ref.order : void 0;\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, drake, 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 drake = dragula([sortableEl[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: sortableEl[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemAttr, itemEl, itemIndex;\n itemEl = $(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 ProjectTagsController = (function(superClass) {\n extend(ProjectTagsController, superClass);\n\n ProjectTagsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgModel\", \"tgProjectService\"];\n\n function ProjectTagsController(scope, rootscope, repo, confirm, rs, model, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.model = model;\n this.projectService = projectService1;\n this.mixingClass = bind(this.mixingClass, this);\n this.cancelMixingTags = bind(this.cancelMixingTags, this);\n this.confirmMixingTags = bind(this.confirmMixingTags, this);\n this.toggleMixingFromTags = bind(this.toggleMixingFromTags, this);\n this.startMixingTags = bind(this.startMixingTags, this);\n this.deleteTag = bind(this.deleteTag, this);\n this.editTag = bind(this.editTag, this);\n this.createTag = bind(this.createTag, this);\n this.filterAndSortTags = bind(this.filterAndSortTags, this);\n this.loadTags = bind(this.loadTags, this);\n this.loading = true;\n this.loadTags();\n }\n\n ProjectTagsController.prototype.loadTags = function() {\n var project;\n project = this.projectService.project.toJS();\n return this.rs.projects.tagsColors(project.id).then((function(_this) {\n return function(tags) {\n _this.scope.projectTagsAll = _.map(tags.getAttrs(), function(color, name) {\n return _this.model.make_model('tag', {\n name: name,\n color: color\n });\n });\n _this.filterAndSortTags();\n return _this.loading = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.filterAndSortTags = function() {\n this.scope.projectTags = _.sortBy(this.scope.projectTagsAll, function(it) {\n return it.name.toLowerCase();\n });\n return this.scope.projectTags = _.filter(this.scope.projectTags, (function(_this) {\n return function(tag) {\n return tag.name.indexOf(_this.scope.tagsFilter.name) !== -1;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.createTag = function(tag, color) {\n return this.rs.projects.createTag(this.scope.projectId, tag, color);\n };\n\n ProjectTagsController.prototype.editTag = function(from_tag, to_tag, color) {\n if (from_tag === to_tag) {\n to_tag = null;\n }\n return this.rs.projects.editTag(this.scope.projectId, from_tag, to_tag, color);\n };\n\n ProjectTagsController.prototype.deleteTag = function(tag) {\n this.scope.loadingDelete = true;\n return this.rs.projects.deleteTag(this.scope.projectId, tag)[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingDelete = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.startMixingTags = function(tag) {\n return this.scope.mixingTags.toTag = tag.name;\n };\n\n ProjectTagsController.prototype.toggleMixingFromTags = function(tag) {\n var index;\n if (tag.name !== this.scope.mixingTags.toTag) {\n index = this.scope.mixingTags.fromTags.indexOf(tag.name);\n if (index === -1) {\n return this.scope.mixingTags.fromTags.push(tag.name);\n } else {\n return this.scope.mixingTags.fromTags.splice(index, 1);\n }\n }\n };\n\n ProjectTagsController.prototype.confirmMixingTags = function() {\n var fromTags, toTag;\n toTag = this.scope.mixingTags.toTag;\n fromTags = this.scope.mixingTags.fromTags;\n this.scope.loadingMixing = true;\n return this.rs.projects.mixTags(this.scope.projectId, toTag, fromTags).then((function(_this) {\n return function() {\n _this.cancelMixingTags();\n return _this.loadTags();\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingMixing = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.cancelMixingTags = function() {\n this.scope.mixingTags.toTag = null;\n return this.scope.mixingTags.fromTags = [];\n };\n\n ProjectTagsController.prototype.mixingClass = function(tag) {\n if (this.scope.mixingTags.toTag !== null) {\n if (tag.name === this.scope.mixingTags.toTag) {\n return \"mixing-tags-to\";\n } else if (this.scope.mixingTags.fromTags.indexOf(tag.name) !== -1) {\n return \"mixing-tags-from\";\n }\n }\n };\n\n return ProjectTagsController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectTagsController\", ProjectTagsController);\n\n ProjectTagsDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, $window, cancel, goToBottomList, initializeMixingTags, initializeNewValue, initializeTagsFilter, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $window = $(window);\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"tag\": \"\",\n \"color\": \"\"\n };\n };\n initializeTagsFilter = function() {\n return $scope.tagsFilter = {\n \"name\": \"\"\n };\n };\n initializeMixingTags = function() {\n return $scope.mixingTags = {\n \"toTag\": null,\n \"fromTags\": []\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD\");\n };\n initializeNewValue();\n initializeTagsFilter();\n initializeMixingTags();\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(_this) {\n return function(target) {\n var form, formEl, originalTag, promise, tag;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n tag = formEl.scope().tag;\n originalTag = tag.clone();\n originalTag.revert();\n $scope.loadingEdit = true;\n promise = $ctrl.editTag(originalTag.name, tag.name, tag.color);\n promise.then(function() {\n return $ctrl.loadTags().then(function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n $scope.loadingEdit = false;\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingEdit = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n saveNewValue = (function(_this) {\n return function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n formEl = target;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.loadingCreate = true;\n promise = $ctrl.createTag($scope.newValue.tag, $scope.newValue.color);\n promise.then(function(data) {\n return $ctrl.loadTags().then(function() {\n $scope.loadingCreate = false;\n target.addClass(\"hidden\");\n return initializeNewValue();\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingCreate = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n cancel = function(target) {\n var formEl, row, tag;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n tag.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $scope.$watch(\"tagsFilter.name\", function(tagsFilter) {\n return $ctrl.filterAndSortTags();\n });\n $window.on(\"keyup\", function(event) {\n if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return initializeMixingTags();\n });\n }\n });\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n return $el.find(\".new-value\").removeClass('hidden');\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\", \".mix-tags\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.startMixingTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-row\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.toggleMixingFromTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-confirm\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.confirmMixingTags();\n });\n });\n $el.on(\"click\", \".mixing-cancel\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.cancelMixingTags();\n });\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\", \".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(\"keyup\", \".status-name input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === 13) {\n return saveValue(target);\n } else if (event.keyCode === 27) {\n return cancel(target);\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 $el.on(\"click\", \".delete-tag\", function(event) {\n var formEl, tag, target, title;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_TAG\");\n return $confirm.askOnDelete(title, tag.name).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadTags()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $ctrl.deleteTag(tag.name).then(onSucces, onError);\n });\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $window.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectTags\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectTagsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgModel\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function RolesController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, model, appMetaService, translate, errorHandlingService, projectService) {\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.model = model;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\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\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 this.loadProject();\n return this.loadRoles();\n };\n\n RolesController.prototype.forceLoadProject = function() {\n return this.projectService.fetchProject((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this));\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.forceLoadProject();\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.forceLoadProject();\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, 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.forceLoadProject();\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 return this.confirm.ask(title, subtitle, \"\").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\", \".edit-value\", 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: _.maxBy($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.forceLoadProject();\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, epicPermissions, 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 epicPermissions = [\n {\n key: \"view_epics\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS\"\n }, {\n key: \"add_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS\"\n }, {\n key: \"modify_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS\"\n }, {\n key: \"comment_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS\"\n }, {\n key: \"delete_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME\",\n permissions: setActivePermissions(epicPermissions)\n });\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: \"comment_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_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: \"comment_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_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: \"comment_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_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 target.toggleClass(\"open-drawer\");\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.forceLoadProject();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, GogsController, GogsWebhooksDirective, 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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WebhooksController(scope, repo, rs, params, location, navUrls, appMetaService, translate, errorHandlingService, projectService) {\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 this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WebhooksController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadWebhooks();\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(_.toPairs(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\").slideToggle();\n return updateShowHideHistoryText();\n });\n });\n } else {\n $el.find(\".webhooks-history\").toggleClass(\"open\").slideToggle();\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, $analytics) {\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 $analytics.trackEvent(\"webhooks\", \"create\", \"Create new webhook\", 1);\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 initializeNewValue();\n if ($scope.webhooks.length >= 1) {\n return formDOMNode.addClass(\"hidden\");\n }\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\", \"$tgAnalytics\", NewWebhookDirective]);\n\n GithubController = (function(superClass) {\n extend(GithubController, superClass);\n\n GithubController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GithubController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GithubController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return this.loadModules();\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\", \"tgProjectService\"];\n\n function GitlabController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GitlabController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\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\", \"tgProjectService\"];\n\n function BitbucketController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n BitbucketController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\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, $analytics) {\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 $analytics.trackEvent(\"github-webhook\", \"created-or-changed\", \"Create or changed github webhook\", 1);\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\", \"$tgAnalytics\", GithubWebhooksDirective]);\n\n GitlabWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\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 $analytics.trackEvent(\"gitlab-webhook\", \"created-or-changed\", \"Create or changed gitlab webhook\", 1);\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\", \"$tgAnalytics\", GitlabWebhooksDirective]);\n\n BitbucketWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\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 $analytics.trackEvent(\"bitbucket-webhook\", \"created-or-changed\", \"Create or changed bitbucket webhook\", 1);\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\", \"$tgAnalytics\", 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 GogsController = (function(superClass) {\n extend(GogsController, superClass);\n\n GogsController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GogsController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GOGS.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.GOGS.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 GogsController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gogs\").then((function(_this) {\n return function(gogs) {\n return _this.scope.gogs = gogs;\n };\n })(this));\n };\n\n GogsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GogsController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return GogsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n GogsWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\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.gogs, \"gogs\");\n promise.then(function() {\n $analytics.trackEvent(\"gogs-webhook\", \"create-or-change\", \"Create or change gogs webhook\", 1);\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 $el.on(\"submit\", \"form\", submit);\n return $el.on(\"click\", \".submit-button\", submit);\n };\n return {\n link: link\n };\n };\n\n module.controller(\"GogsController\", GogsController);\n\n module.directive(\"tgGogsWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GogsWebhooksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 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 DeleteProjectDirective = function($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService, $analytics) {\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 $analytics.trackEvent(\"projects\", \"delete\", \"Delete project\", 1);\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\", \"$tgAnalytics\", DeleteProjectDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, ContribUserSettingsController, 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\", \"tgProjectService\"];\n\n function ContribController(rootScope, scope, params, repo, rs, confirm, projectService) {\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.projectService = projectService;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.adminPlugins, {\n \"slug\": this.params.plugin\n }));\n this.scope.projectSlug = this.params.pslug;\n this.loadInitialData();\n }\n\n ContribController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\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\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 ContribUserSettingsController = (function(superClass) {\n extend(ContribUserSettingsController, superClass);\n\n ContribUserSettingsController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\"];\n\n function ContribUserSettingsController(rootScope, scope, params) {\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.userSettingsPlugins, {\n \"slug\": this.params.plugin\n }));\n }\n\n return ContribUserSettingsController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribUserSettingsController\", ContribUserSettingsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 = _.assign({}, options.headers || {}, this.headers());\n return this.http(options);\n };\n\n HttpService.prototype.get = function(url, params, options) {\n options = _.assign({\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 = _.assign({\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 = _.assign({\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 = _.assign({\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 = _.assign({\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.realClone = function() {\n var attrs, instance;\n attrs = _.cloneDeep(this._attrs);\n instance = new Model(this._name, attrs, this._dataTypes);\n instance._modifiedAttrs = _.cloneDeep(this._modifiedAttrs);\n instance._isModified = _.cloneDeep(this._isModified);\n return instance;\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, lightboxService) {\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 $scope.$apply();\n break;\n case 2:\n window.open(fullUrl);\n }\n return lightboxService.closeAll();\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\", \"lightboxService\", NavigationUrlsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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), extraParams);\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, params, options, returnHeaders) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n if (params == null) {\n params = {};\n }\n if (returnHeaders == null) {\n returnHeaders = false;\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, params, options);\n } else {\n promise = this.http.put(url, data, params, options);\n }\n promise.success((function(_this) {\n return function(data, status, headers, response) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n if (returnHeaders) {\n return defered.resolve([model, headers()]);\n } else {\n return defered.resolve(model);\n }\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 if (options.ref != null) {\n params.ref = options.ref;\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", [_.trimEnd(this.mainUrl, \"/\"), _.trimStart(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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 epic: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/epic\");\n }\n },\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 epic: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/epic\");\n }\n },\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/epics.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 = \"epics-queryparams\";\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(\"epics\", \"by_ref\", 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.upvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-upvote\", epicId);\n return $http.post(url);\n };\n service.downvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-downvote\", epicId);\n return $http.post(url);\n };\n service.watch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-watch\", epicId);\n return $http.post(url);\n };\n service.unwatch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-unwatch\", epicId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.epics = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgEpicsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.editComment = function(type, objectId, activityId, comment) {\n var commentData, params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/edit_comment\";\n params = {\n id: activityId\n };\n commentData = {\n comment: comment\n };\n return $http.post(url, commentData, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.getCommentHistory = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/comment_versions\";\n params = {\n id: activityId\n };\n return $http.get(url, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 hashSuffix, service;\n service = {};\n hashSuffix = \"issues-queryparams\";\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 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\": \"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_epics_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_epics_csv_uuid\";\n return $http.post(url);\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_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.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.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.deleteTag = function(projectId, tag) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/delete_tag\";\n return $http.post(url, {\n tag: tag\n });\n };\n service.createTag = function(projectId, tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/create_tag\";\n data = {};\n data.tag = tag;\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.editTag = function(projectId, from_tag, to_tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/edit_tag\";\n data = {};\n data.from_tag = from_tag;\n if (to_tag) {\n data.to_tag = to_tag;\n }\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.mixTags = function(projectId, to_tag, from_tags) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/mix_tags\";\n return $http.post(url, {\n to_tag: to_tag,\n from_tags: from_tags\n });\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 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 (evt.target.getResponseHeader('Taiga-Info-Project-Is-Private')) {\n response.headers = {\n isPrivate: evt.target.getResponseHeader('Taiga-Info-Project-Is-Private') === 'True',\n memberships: parseInt(evt.target.getResponseHeader('Taiga-Info-Project-Memberships'))\n };\n }\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", taskId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"tasks\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"task-filters\", null, params);\n };\n service.list = function(projectId, sprintId, userStoryId, params) {\n if (sprintId == null) {\n sprintId = null;\n }\n if (userStoryId == null) {\n userStoryId = null;\n }\n params = _.merge(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 milestone_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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $q) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"userstories-queryparams\";\n service.get = function(projectId, usId, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"userstories\", usId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n if (extraParams == null) {\n extraParams = {};\n }\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\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, pageSize) {\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\", _.extend(params, {\n page_size: pageSize\n }), {\n enablePagination: true\n }, true);\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.bulkUpdateMilestone = function(projectId, milestoneId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-milestone\");\n params = {\n project_id: projectId,\n milestone_id: milestoneId,\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\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.list = function(projectId) {\n return $repo.queryMany(\"wiki\", {\n project: projectId\n });\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 form, submit, submitButton;\n form = new checksley.Form($el.find(\"form\"));\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 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, submitButton;\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 currentLoading, promise;\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.remove($scope.user);\n promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $auth.logout();\n return $location.path($navUrls.resolve(\"login\"));\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n $el.on(\"click\", \".button-red\", debounce(2000, function(event) {\n event.preventDefault();\n return submit();\n }));\n return submitButton = $el.find(\".button-red\");\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\", \"$tgLoading\", DeleteUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\"];\n\n function UserSettingsController(scope, rootscope, config, repo, confirm, rs, params, q, location, navUrls, auth, translate, errorHandlingService) {\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.errorHandlingService = errorHandlingService;\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.errorHandlingService.permissionDenied();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\"];\n\n function UserNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, errorHandlingService) {\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.errorHandlingService = errorHandlingService;\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-2017 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-2017 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-2017 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: history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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: utils.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUtils\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaWikiHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedItemDirective;\n\n AssignedItemDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n templateUrl: \"components/assigned-to/assigned-item/assigned-item.html\",\n scope: {\n member: \"=\"\n },\n link: link\n };\n };\n\n AssignedItemDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedItem\", AssignedItemDirective);\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: assigned-to-selector.controller.coffee\n */\n\n(function() {\n var AssignedToSelectorController;\n\n AssignedToSelectorController = (function() {\n AssignedToSelectorController.$inject = [];\n\n function AssignedToSelectorController() {\n if (this.assigned) {\n this._getAssignedMember();\n }\n this._filterAssignedMember();\n }\n\n AssignedToSelectorController.prototype._getAssignedMember = function() {\n return this.assignedMember = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id === _this.assigned.get('id');\n };\n })(this));\n };\n\n AssignedToSelectorController.prototype._filterAssignedMember = function() {\n if (this.assigned) {\n return this.nonAssignedMembers = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id !== _this.assigned.get('id');\n };\n })(this));\n } else {\n return this.nonAssignedMembers = this.project.members;\n }\n };\n\n return AssignedToSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToSelectorCtrl', AssignedToSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedToSelectorDirective;\n\n AssignedToSelectorDirective = function() {\n return {\n controller: \"AssignedToSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to-selector/assigned-to-selector.html\",\n scope: {\n assigned: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToSelectorDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToSelector\", AssignedToSelectorDirective);\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: assigned-to.controller.coffee\n */\n\n(function() {\n var AssignedToController;\n\n AssignedToController = (function() {\n AssignedToController.$inject = [\"tgLightboxFactory\", \"lightboxService\"];\n\n function AssignedToController(lightboxFactory, lightboxService) {\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.has_permissions = _.includes(this.project.my_permissions, 'modify_epic');\n }\n\n AssignedToController.prototype._closeAndRemoveAssigned = function() {\n this.lightboxService.closeAll();\n return this.onRemoveAssigned();\n };\n\n AssignedToController.prototype._closeAndAssign = function(member) {\n this.lightboxService.closeAll();\n return this.onAssignTo({\n 'member': member\n });\n };\n\n AssignedToController.prototype.onSelectAssignedTo = function(assigned, project) {\n return this.lightboxFactory.create('tg-assigned-to-selector', {\n \"class\": \"lightbox lightbox-assigned-to-selector open\",\n \"assigned\": \"assigned\",\n \"project\": \"project\",\n \"on-remove-assigned\": \"onRemoveAssigned()\",\n \"on-assign-to\": \"assignTo(member)\"\n }, {\n \"assigned\": this.assignedTo,\n \"project\": this.project,\n \"onRemoveAssigned\": this._closeAndRemoveAssigned.bind(this),\n \"assignTo\": this._closeAndAssign.bind(this)\n });\n };\n\n return AssignedToController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToCtrl', AssignedToController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: assigned-to.directive.coffee\n */\n\n(function() {\n var AssignedToDirective;\n\n AssignedToDirective = function() {\n return {\n controller: \"AssignedToCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to.html\",\n scope: {\n assignedTo: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToComponent\", AssignedToDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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, attachmentsPreviewService, lightboxService) {\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 lightboxService.open($('tg-attachments-preview'));\n return attachmentsPreviewService.fileId = attachment.getIn(['file', 'id']);\n });\n } else if (taiga.isPdf(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return window.open(attachment.getIn(['file', 'url']));\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\", \"tgAttachmentsPreviewService\", \"lightboxService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentLink\", AttachmentLinkDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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\", \"tgProjectService\", \"tgAttachmentsPreviewService\"];\n\n function AttachmentsFullController(translate, confirm, config, storage, attachmentsFullService, projectService, attachmentsPreviewService) {\n this.translate = translate;\n this.confirm = confirm;\n this.config = config;\n this.storage = storage;\n this.attachmentsFullService = attachmentsFullService;\n this.projectService = projectService;\n this.attachmentsPreviewService = attachmentsPreviewService;\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 this.attachmentsPreviewService.fileId = null;\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 AttachmentsFullController.prototype._isEditable = function() {\n if (this.projectService.project) {\n return this.projectService.hasPermission(this.editPermission);\n }\n return false;\n };\n\n AttachmentsFullController.prototype.showAttachments = function() {\n return this._isEditable() || this.attachmentsFullService.attachments.size;\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 editPermission: \"@\"\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-2017 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, comment) {\n if (editable == null) {\n editable = true;\n }\n if (comment == null) {\n comment = false;\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, comment);\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 from_comment: comment\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(new Error(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-preview.controller.coffee\n */\n\n(function() {\n var AttachmentsPreviewController;\n\n AttachmentsPreviewController = (function() {\n AttachmentsPreviewController.$inject = [\"tgAttachmentsPreviewService\"];\n\n function AttachmentsPreviewController(attachmentsPreviewService) {\n this.attachmentsPreviewService = attachmentsPreviewService;\n taiga.defineImmutableProperty(this, \"current\", (function(_this) {\n return function() {\n if (!_this.attachmentsPreviewService.fileId) {\n return null;\n }\n return _this.getCurrent();\n };\n })(this));\n }\n\n AttachmentsPreviewController.prototype.hasPagination = function() {\n var images;\n images = this.attachments.filter((function(_this) {\n return function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n };\n })(this));\n return images.size > 1;\n };\n\n AttachmentsPreviewController.prototype.getCurrent = function() {\n var attachment, file;\n attachment = this.attachments.find((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n file = attachment.get('file');\n return file;\n };\n\n AttachmentsPreviewController.prototype.getIndex = function() {\n return this.attachments.findIndex((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n };\n\n AttachmentsPreviewController.prototype.next = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(attachmentIndex + 1).find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n AttachmentsPreviewController.prototype.previous = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(0, attachmentIndex).findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n return AttachmentsPreviewController;\n\n })();\n\n angular.module('taigaComponents').controller('AttachmentsPreview', AttachmentsPreviewController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-preview.directive.coffee\n */\n\n(function() {\n var AttachmentPreviewLightboxDirective;\n\n AttachmentPreviewLightboxDirective = function(lightboxService, attachmentsPreviewService) {\n var link;\n link = function($scope, el, attrs, ctrl) {\n $(document.body).on(\"keydown.image-preview\", function(e) {\n if (attachmentsPreviewService.fileId) {\n if (e.keyCode === 39) {\n ctrl.next();\n } else if (e.keyCode === 37) {\n ctrl.previous();\n }\n }\n return $scope.$digest();\n });\n return $scope.$on('$destroy', function() {\n return $(document.body).off('.image-preview');\n });\n };\n return {\n scope: {},\n controller: 'AttachmentsPreview',\n templateUrl: 'components/attachments-preview/attachments-preview.html',\n link: link,\n controllerAs: \"vm\",\n bindToController: {\n attachments: \"=\"\n }\n };\n };\n\n angular.module('taigaComponents').directive(\"tgAttachmentsPreview\", [\"lightboxService\", \"tgAttachmentsPreviewService\", AttachmentPreviewLightboxDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-preview.service.coffee\n */\n\n(function() {\n var AttachmentsPreviewService,\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 AttachmentsPreviewService = (function(superClass) {\n extend(AttachmentsPreviewService, superClass);\n\n AttachmentsPreviewService.$inject = [];\n\n function AttachmentsPreviewService() {}\n\n return AttachmentsPreviewService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsPreviewService\", AttachmentsPreviewService);\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-2017 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, drake, scroll;\n callback = $parse(attrs.tgAttachmentsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var attachment, newIndex;\n item = $(item);\n attachment = item.scope().attachment;\n newIndex = item.index();\n return scope.$apply(function() {\n return callback(scope, {\n attachment: attachment,\n index: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\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-2017 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-2017 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: avatar.directive.coffee\n */\n\n(function() {\n var AvatarDirective;\n\n AvatarDirective = function(avatarService) {\n var link;\n link = function(scope, el, attrs) {\n var attributeName;\n if (attrs.tgAvatarBig) {\n attributeName = 'avatarBig';\n } else {\n attributeName = 'avatar';\n }\n return scope.$watch(attributeName, function(user) {\n var avatar;\n avatar = avatarService.getAvatar(user, attributeName);\n el.attr('src', avatar.url);\n return el.css('background', avatar.bg || \"\");\n });\n };\n return {\n link: link,\n scope: {\n avatar: \"=tgAvatar\",\n avatarBig: \"=tgAvatarBig\"\n }\n };\n };\n\n AvatarDirective.$inject = ['tgAvatarService'];\n\n angular.module(\"taigaComponents\").directive(\"tgAvatar\", AvatarDirective);\n\n angular.module(\"taigaComponents\").directive(\"tgAvatarBig\", AvatarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: belong-to-epics.directive.coffee\n */\n\n(function() {\n var BelongToEpicsDirective, module;\n\n module = angular.module('taigaEpics');\n\n BelongToEpicsDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs) {\n return scope.$watch('epics', function(epics) {\n if (epics && !epics.isIterable) {\n return scope.immutable_epics = Immutable.fromJS(epics);\n }\n });\n };\n templateUrl = function(el, attrs) {\n if (attrs.format) {\n return \"components/belong-to-epics/belong-to-epics-\" + attrs.format + \".html\";\n }\n return \"components/belong-to-epics/belong-to-epics-pill.html\";\n };\n return {\n link: link,\n scope: {\n epics: '='\n },\n templateUrl: templateUrl\n };\n };\n\n module.directive(\"tgBelongToEpics\", BelongToEpicsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/bind-code.directive.coffee\n */\n\n(function() {\n var BindCode;\n\n BindCode = function($sce, $parse, $compile, wysiwygService, wysiwygCodeHightlighterService) {\n return {\n restrict: 'A',\n compile: function(tElement, tAttrs) {\n var tgBindCodeGetter, tgBindCodeWatch;\n tgBindCodeGetter = $parse(tAttrs.tgBindCode);\n tgBindCodeWatch = $parse(tAttrs.tgBindCode, function(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n return function(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.tgBindCode);\n return scope.$watch(tgBindCodeWatch, function() {\n var html;\n html = wysiwygService.getHTML(tgBindCodeGetter(scope));\n element.html($sce.getTrustedHtml(html) || '');\n return wysiwygCodeHightlighterService.addHightlighter(element);\n });\n };\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgBindCode\", [\"$sce\", \"$parse\", \"$compile\", \"tgWysiwygService\", \"tgWysiwygCodeHightlighterService\", BindCode]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: board-zoom.directive.coffee\n */\n\n(function() {\n var BoardZoomDirective;\n\n BoardZoomDirective = function() {\n return {\n scope: {\n levels: \"=\",\n value: \"=\"\n },\n templateUrl: 'components/board-zoom/board-zoom.html'\n };\n };\n\n angular.module('taigaComponents').directive(\"tgBoardZoom\", [BoardZoomDirective]);\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: card-slideshow.controller.coffee\n */\n\n(function() {\n var CardSlideshowController;\n\n CardSlideshowController = (function() {\n CardSlideshowController.$inject = [];\n\n function CardSlideshowController() {\n this.index = 0;\n }\n\n CardSlideshowController.prototype.next = function() {\n this.index++;\n if (this.index >= this.images.size) {\n return this.index = 0;\n }\n };\n\n CardSlideshowController.prototype.previous = function() {\n this.index--;\n if (this.index < 0) {\n return this.index = this.images.size - 1;\n }\n };\n\n return CardSlideshowController;\n\n })();\n\n angular.module('taigaComponents').controller('CardSlideshow', CardSlideshowController);\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: card.directive.coffee\n */\n\n(function() {\n var cardSlideshowDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardSlideshowDirective = function() {\n return {\n controller: \"CardSlideshow\",\n templateUrl: \"components/card-slideshow/card-slideshow.html\",\n bindToController: true,\n controllerAs: \"vm\",\n scope: {\n images: \"=\"\n }\n };\n };\n\n module.directive('tgCardSlideshow', cardSlideshowDirective);\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: card.controller.coffee\n */\n\n(function() {\n var CardController;\n\n CardController = (function() {\n function CardController() {}\n\n CardController.$inject = [];\n\n CardController.prototype.visible = function(name) {\n return this.zoom.indexOf(name) !== -1;\n };\n\n CardController.prototype.hasTasks = function() {\n var tasks;\n tasks = this.item.getIn(['model', 'tasks']);\n return tasks && tasks.size > 0;\n };\n\n CardController.prototype.hasVisibleAttachments = function() {\n return this.item.get('images').size > 0;\n };\n\n CardController.prototype.toggleFold = function() {\n return this.onToggleFold({\n id: this.item.get('id')\n });\n };\n\n CardController.prototype.getClosedTasks = function() {\n return this.item.getIn(['model', 'tasks']).filter(function(task) {\n return task.get('is_closed');\n });\n };\n\n CardController.prototype.closedTasksPercent = function() {\n return this.getClosedTasks().size * 100 / this.item.getIn(['model', 'tasks']).size;\n };\n\n CardController.prototype.getPermissionsKey = function() {\n if (this.type === 'task') {\n return 'modify_task';\n } else {\n return 'modify_us';\n }\n };\n\n CardController.prototype._setVisibility = function() {\n var visibility;\n visibility = {\n related: this.visible('related_tasks'),\n slides: this.visible('attachments')\n };\n if (!_.isUndefined(this.item.get('foldStatusChanged'))) {\n if (this.visible('related_tasks') && this.visible('attachments')) {\n visibility.related = !this.item.get('foldStatusChanged');\n visibility.slides = !this.item.get('foldStatusChanged');\n } else if (this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n } else if (!this.visible('related_tasks') && !this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n }\n }\n if (!this.item.getIn(['model', 'tasks']) || !this.item.getIn(['model', 'tasks']).size) {\n visibility.related = false;\n }\n if (!this.item.get('images') || !this.item.get('images').size) {\n visibility.slides = false;\n }\n return visibility;\n };\n\n CardController.prototype.isRelatedTasksVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.related;\n };\n\n CardController.prototype.isSlideshowVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.slides;\n };\n\n CardController.prototype.getNavKey = function() {\n if (this.type === 'task') {\n return 'project-tasks-detail';\n } else {\n return 'project-userstories-detail';\n }\n };\n\n return CardController;\n\n })();\n\n angular.module('taigaComponents').controller('Card', CardController);\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: card.directive.coffee\n */\n\n(function() {\n var cardDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardDirective = function() {\n return {\n link: function(scope) {},\n controller: \"Card\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/card/card.html\",\n scope: {\n onToggleFold: \"&\",\n onClickAssignedTo: \"&\",\n onClickEdit: \"&\",\n project: \"=\",\n item: \"=\",\n zoom: \"=\",\n zoomLevel: \"=\",\n archived: \"=\",\n type: \"@\"\n }\n };\n };\n\n module.directive('tgCard', cardDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/click-input-file.directive.coffee\n */\n\n(function() {\n var ClickInputFile;\n\n ClickInputFile = function() {\n return {\n link: function(scope, el) {\n el.on('click', function(e) {\n var inputFile;\n if (!$(e.target).is('input')) {\n e.preventDefault();\n inputFile = el.find('input[type=\"file\"]');\n inputFile.val('');\n return inputFile.trigger('click');\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgClickInputFile\", [ClickInputFile]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: color-selector.controller.coffee\n */\n\n(function() {\n var ColorSelectorController, getDefaulColorList, taiga;\n\n taiga = this.taiga;\n\n getDefaulColorList = taiga.getDefaulColorList;\n\n ColorSelectorController = (function() {\n ColorSelectorController.$inject = [\"tgProjectService\"];\n\n function ColorSelectorController(projectService) {\n this.projectService = projectService;\n this.colorList = getDefaulColorList();\n this.checkIsColorRequired();\n this.displayColorList = false;\n }\n\n ColorSelectorController.prototype.userCanChangeColor = function() {\n if (!this.requiredPerm) {\n return true;\n }\n return this.projectService.hasPermission(this.requiredPerm);\n };\n\n ColorSelectorController.prototype.checkIsColorRequired = function() {\n if (!this.isColorRequired) {\n return this.colorList = _.dropRight(this.colorList);\n }\n };\n\n ColorSelectorController.prototype.setColor = function(color) {\n this.color = color;\n return this.customColor = color;\n };\n\n ColorSelectorController.prototype.resetColor = function() {\n if (this.isColorRequired && !this.color) {\n return this.color = this.initColor;\n }\n };\n\n ColorSelectorController.prototype.toggleColorList = function() {\n this.displayColorList = !this.displayColorList;\n this.customColor = this.color;\n return this.resetColor();\n };\n\n ColorSelectorController.prototype.onSelectDropdownColor = function(color) {\n this.color = color;\n this.onSelectColor({\n color: color\n });\n return this.toggleColorList();\n };\n\n ColorSelectorController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n if (this.customColor || !this.isColorRequired) {\n this.onSelectDropdownColor(this.customColor);\n }\n return event.preventDefault();\n }\n };\n\n return ColorSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller(\"ColorSelectorCtrl\", ColorSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: color-selector.directive.coffee\n */\n\n(function() {\n var ColorSelectorDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n ColorSelectorDirective = function($timeout) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var _timeout, cancel, close;\n _timeout = null;\n cancel = function() {\n $timeout.cancel(_timeout);\n return _timeout = null;\n };\n close = function() {\n if (_timeout) {\n return;\n }\n return _timeout = $timeout((function() {\n ctrl.displayColorList = false;\n return ctrl.resetColor();\n }), 400);\n };\n el.find('.color-selector').mouseenter(cancel).mouseleave(close);\n el.find('.color-selector-dropdown').mouseenter(cancel).mouseleave(close);\n return scope.$watch('vm.initColor', function(color) {\n return ctrl.setColor(color);\n });\n };\n return {\n link: link,\n templateUrl: \"components/color-selector/color-selector.html\",\n controller: \"ColorSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n isColorRequired: \"=\",\n onSelectColor: \"&\",\n initColor: \"=\",\n requiredPerm: \"@\"\n },\n scope: {}\n };\n };\n\n ColorSelectorDirective.$inject = [\"$timeout\"];\n\n angular.module('taigaComponents').directive(\"tgColorSelector\", ColorSelectorDirective);\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: story-header.controller.coffee\n */\n\n(function() {\n var StoryHeaderController, module;\n\n module = angular.module(\"taigaUserStories\");\n\n StoryHeaderController = (function() {\n StoryHeaderController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\", \"$tgNavUrls\", \"$window\"];\n\n function StoryHeaderController(rootScope, confirm, modelTransform, navUrls, window) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.navUrls = navUrls;\n this.window = window;\n this.editMode = false;\n this.loadingSubject = false;\n this.originalSubject = this.item.subject;\n }\n\n StoryHeaderController.prototype._checkNav = function() {\n var ctx, ref, ref1;\n if (((ref = this.item.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.previous.ref\n };\n this.previousUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n if (((ref1 = this.item.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.next.ref\n };\n return this.nextUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n };\n\n StoryHeaderController.prototype._checkPermissions = function() {\n return this.permissions = {\n canEdit: _.includes(this.project.my_permissions, this.requiredPerm)\n };\n };\n\n StoryHeaderController.prototype.editSubject = function(value) {\n var selection;\n selection = this.window.getSelection();\n if (selection.type !== \"Range\") {\n if (value) {\n this.editMode = true;\n }\n if (!value) {\n return this.editMode = false;\n }\n }\n };\n\n StoryHeaderController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n this.saveSubject();\n }\n if (event.which === 27) {\n this.item.subject = this.originalSubject;\n return this.editSubject(false);\n }\n };\n\n StoryHeaderController.prototype.saveSubject = function() {\n var item, onEditSubjectError, onEditSubjectSuccess, transform;\n onEditSubjectSuccess = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n _this.rootScope.$broadcast(\"object:updated\");\n _this.confirm.notify('success');\n return _this.originalSubject = _this.item.subject;\n };\n })(this);\n onEditSubjectError = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n return _this.confirm.notify('error');\n };\n })(this);\n this.editMode = false;\n this.loadingSubject = true;\n item = this.item;\n transform = this.modelTransform.save(function(item) {\n return item;\n });\n return transform.then(onEditSubjectSuccess, onEditSubjectError);\n };\n\n return StoryHeaderController;\n\n })();\n\n module.controller(\"StoryHeaderCtrl\", StoryHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: story-header.directive.coffee\n */\n\n(function() {\n var DetailHeaderDirective, module;\n\n module = angular.module('taigaUserStories');\n\n DetailHeaderDirective = function() {\n var link;\n this.$inject = [];\n link = function(scope, el, attrs, ctrl) {\n ctrl._checkPermissions();\n return ctrl._checkNav();\n };\n return {\n link: link,\n controller: \"StoryHeaderCtrl\",\n bindToController: true,\n scope: {\n item: \"=\",\n project: \"=\",\n requiredPerm: \"@\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/detail/header/detail-header.html\"\n };\n };\n\n module.directive(\"tgDetailHeader\", DetailHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 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-2017 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: filter-utils.service.coffee\n */\n\n(function() {\n var FilterRemoteStorageService, generateHash,\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 generateHash = taiga.generateHash;\n\n FilterRemoteStorageService = (function(superClass) {\n extend(FilterRemoteStorageService, superClass);\n\n FilterRemoteStorageService.$inject = [\"$q\", \"$tgUrls\", \"$tgHttp\"];\n\n function FilterRemoteStorageService(q, urls, http) {\n this.q = q;\n this.urls = urls;\n this.http = http;\n }\n\n FilterRemoteStorageService.prototype.storeFilters = function(projectId, myFilters, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n if (_.isEmpty(myFilters)) {\n promise = this.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 = this.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(_this) {\n return function(data) {\n var innerPromise;\n innerPromise = _this.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 })(this));\n }\n return deferred.promise;\n };\n\n FilterRemoteStorageService.prototype.getFilters = function(projectId, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n promise = this.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\n return FilterRemoteStorageService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgFilterRemoteStorageService\", FilterRemoteStorageService);\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: filter.-slide-down.controller.coffee\n */\n\n(function() {\n var FilterSlideDownDirective;\n\n FilterSlideDownDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var filter;\n filter = $('tg-filter');\n return scope.$watch(attrs.ngIf, function(value) {\n var contentHeight, wrapperHeight;\n if (value) {\n filter.find('.filter-list').hide();\n wrapperHeight = filter.height();\n contentHeight = 0;\n filter.children().each(function() {\n return contentHeight += $(this).outerHeight(true);\n });\n return $(el.context.nextSibling).css({\n \"max-height\": wrapperHeight - contentHeight,\n \"display\": \"block\"\n });\n }\n });\n };\n return {\n priority: 900,\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilterSlideDown\", [FilterSlideDownDirective]);\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: filter.controller.coffee\n */\n\n(function() {\n var FilterController;\n\n FilterController = (function() {\n FilterController.$inject = [];\n\n function FilterController() {\n this.opened = null;\n this.customFilterForm = false;\n this.customFilterName = '';\n }\n\n FilterController.prototype.toggleFilterCategory = function(filterName) {\n if (this.opened === filterName) {\n return this.opened = null;\n } else {\n return this.opened = filterName;\n }\n };\n\n FilterController.prototype.isOpen = function(filterName) {\n return this.opened === filterName;\n };\n\n FilterController.prototype.saveCustomFilter = function() {\n this.onSaveCustomFilter({\n name: this.customFilterName\n });\n this.customFilterForm = false;\n this.opened = 'custom-filter';\n return this.customFilterName = '';\n };\n\n FilterController.prototype.changeQ = function() {\n return this.onChangeQ({\n q: this.q\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectFilter = function(filterCategory, filter) {\n filter = {\n category: filterCategory,\n filter: filter\n };\n return this.onAddFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.removeCustomFilter = function(filter) {\n return this.onRemoveCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectCustomFilter = function(filter) {\n return this.onSelectCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.isFilterSelected = function(filterCategory, filter) {\n return !!_.find(this.selectedFilters, function(it) {\n return filter.id === it.id && filterCategory.dataType === it.dataType;\n });\n };\n\n return FilterController;\n\n })();\n\n angular.module('taigaComponents').controller('Filter', FilterController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: filter.directive.coffee\n */\n\n(function() {\n var FilterDirective;\n\n FilterDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var unwatch;\n unwatch = scope.$watch(\"vm.defaultQ\", function(q) {\n if (q && !scope.vm.filtersForm.$dirty) {\n scope.vm.q = q;\n return unwatch();\n } else if (scope.vm.filtersForm.$dirty) {\n return unwatch();\n }\n });\n return attrs.$observe(\"open\", function(open) {\n open = scope.$eval(open);\n if (open) {\n return el.addClass('open');\n } else {\n return el.removeClass('open');\n }\n });\n };\n return {\n scope: {\n onChangeQ: \"&\",\n onAddFilter: \"&\",\n onSelectCustomFilter: \"&\",\n onRemoveFilter: \"&\",\n onRemoveCustomFilter: \"&\",\n onSaveCustomFilter: \"&\",\n customFilters: \"<\",\n defaultQ: \"=q\",\n filters: \"<\",\n customFilters: \"<\",\n selectedFilters: \"<\"\n },\n bindToController: true,\n controller: \"Filter\",\n controllerAs: \"vm\",\n templateUrl: 'components/filter/filter.html',\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilter\", [FilterDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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: '.add-action',\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-2017 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: kanban-board-zoom.directive.coffee\n */\n\n(function() {\n var KanbanBoardZoomDirective;\n\n KanbanBoardZoomDirective = function(storage, projectService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, unwatch, zooms;\n scope.zoomIndex = storage.get(\"kanban_zoom\") || 2;\n scope.levels = 5;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\"], [\"related_tasks\", \"empty_extra_info\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"kanban_zoom\") !== zoomIndex) {\n storage.set(\"kanban_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n return unwatch = scope.$watch(function() {\n return projectService.project;\n }, function(project) {\n if (project) {\n if (project.get('my_permissions').indexOf(\"view_tasks\") === -1) {\n scope.levels = 4;\n }\n return unwatch();\n }\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgKanbanBoardZoom\", [\"$tgStorage\", \"tgProjectService\", KanbanBoardZoomDirective]);\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-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 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-big-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoBigSrcDirective;\n\n ProjectLogoBigSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return 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 = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoBigSrc\"\n }\n };\n };\n\n ProjectLogoBigSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoBigSrc\", ProjectLogoBigSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-small-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoSmallSrcDirective;\n\n ProjectLogoSmallSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return 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 = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoSmallSrc\"\n }\n };\n };\n\n ProjectLogoSmallSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoSmallSrc\", ProjectLogoSmallSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 epics: false,\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n });\n if (this.project.get(\"is_epics_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_epics\") !== -1) {\n this.menu = this.menu.set(\"epics\", true);\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 } 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\") + \"-\" + taiga.slugify(this.project.get(\"videoconferences_extra_data\"));\n } else {\n url = this.project.get(\"slug\");\n }\n if (this.project.get(\"videoconferences\") === \"jitsi\") {\n url = url.replace(/-/g, \"\");\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-2017 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-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagOptionDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagOptionDirective = function() {\n var dispatch, link, select, stop;\n select = function(selected) {\n var containerHeight, diff, selectedPosition;\n selected.addClass('selected');\n selectedPosition = selected.position().top + selected.outerHeight();\n containerHeight = selected.parent().outerHeight();\n if (selectedPosition > containerHeight) {\n diff = selectedPosition - containerHeight;\n return selected.parent().scrollTop(selected.parent().scrollTop() + diff);\n } else if (selected.position().top < 0) {\n return selected.parent().scrollTop(selected.parent().scrollTop() + selected.position().top);\n }\n };\n dispatch = function(el, code, scope) {\n var activeElement, next, prev;\n activeElement = el.find(\".selected\");\n if (code === 40) {\n if (!activeElement.length) {\n return select(el.find('li:first'));\n } else {\n next = activeElement.next('li');\n if (next.length) {\n activeElement.removeClass('selected');\n return select(next);\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return select(el.find('li:last'));\n } else {\n prev = activeElement.prev('li');\n if (prev.length) {\n activeElement.removeClass('selected');\n return select(prev);\n }\n }\n }\n };\n stop = function() {\n return $(document).off(\".tags-keyboard-navigation\");\n };\n link = function(scope, el) {\n stop();\n $(el).parent().on(\"keydown.tags-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) {\n event.preventDefault();\n return dispatch(el, code, scope);\n }\n };\n })(this));\n return scope.$on(\"$destroy\", stop);\n };\n return {\n link: link,\n templateUrl: \"components/tags/tag-dropdown/tag-dropdown.html\",\n scope: {\n onSelectTag: \"&\",\n colorArray: \"=\",\n tag: \"=\"\n }\n };\n };\n\n module.directive(\"tgTagsDropdown\", TagOptionDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineCommonController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonController = (function() {\n TagLineCommonController.$inject = [\"tgTagLineService\"];\n\n function TagLineCommonController(tagLineService) {\n this.tagLineService = tagLineService;\n this.disableColorSelection = false;\n this.newTag = {\n name: \"\",\n color: null\n };\n this.colorArray = [];\n this.addTag = false;\n }\n\n TagLineCommonController.prototype.checkPermissions = function() {\n return this.tagLineService.checkPermissions(this.project.my_permissions, this.permissions);\n };\n\n TagLineCommonController.prototype._createColorsArray = function(projectTagColors) {\n return this.colorArray = this.tagLineService.createColorsArray(projectTagColors);\n };\n\n TagLineCommonController.prototype.displayTagInput = function() {\n return this.addTag = true;\n };\n\n TagLineCommonController.prototype.addNewTag = function(name, color) {\n this.newTag.name = \"\";\n this.newTag.color = null;\n if (!name.length) {\n return;\n }\n if (this.disableColorSelection) {\n if (name.length) {\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n } else {\n if (this.project.tags_colors[name]) {\n color = this.project.tags_colors[name];\n }\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n };\n\n TagLineCommonController.prototype.selectColor = function(color) {\n return this.newTag.color = color;\n };\n\n return TagLineCommonController;\n\n })();\n\n module.controller(\"TagLineCommonCtrl\", TagLineCommonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineCommonDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n var unwatch;\n if (!_.isUndefined(attr.disableColorSelection)) {\n ctrl.disableColorSelection = true;\n }\n unwatch = scope.$watch(\"vm.project\", function(project) {\n if (!project || !Object.keys(project).length) {\n return;\n }\n unwatch();\n if (!ctrl.disableColorSelection) {\n return ctrl.colorArray = ctrl._createColorsArray(ctrl.project.tags_colors);\n }\n });\n return el.on(\"keydown\", \".tag-input\", function(event) {\n var tagName;\n if (event.keyCode === 27) {\n ctrl.addTag = false;\n ctrl.newTag.name = \"\";\n ctrl.newTag.color = \"\";\n event.stopPropagation();\n } else if (event.keyCode === 13) {\n event.preventDefault();\n if (el.find('.tags-dropdown .selected').length) {\n tagName = $('.tags-dropdown .selected .tags-dropdown-name').text();\n ctrl.addNewTag(tagName, null);\n } else {\n ctrl.addNewTag(ctrl.newTag.name, ctrl.newTag.color);\n }\n }\n return scope.$apply();\n });\n };\n return {\n link: link,\n scope: {\n permissions: \"@\",\n loadingAddTag: \"=\",\n loadingRemoveTag: \"=\",\n tags: \"=\",\n project: \"=\",\n onAddTag: \"&\",\n onDeleteTag: \"&\"\n },\n templateUrl: \"components/tags/tag-line-common/tag-line-common.html\",\n controller: \"TagLineCommonCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLineCommon\", TagLineCommonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineController = (function() {\n TagLineController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\"];\n\n function TagLineController(rootScope, confirm, modelTransform) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.loadingAddTag = false;\n }\n\n TagLineController.prototype.onDeleteTag = function(tag) {\n var onDeleteTagError, onDeleteTagSuccess, tagName, transform;\n this.loadingRemoveTag = tag[0];\n onDeleteTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.loadingRemoveTag = false;\n return item;\n };\n })(this);\n onDeleteTagError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.loadingRemoveTag = false;\n };\n })(this);\n tagName = trim(tag[0].toLowerCase());\n transform = this.modelTransform.save(function(item) {\n var itemtags;\n itemtags = _.clone(item.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === tagName;\n });\n item.tags = itemtags;\n return item;\n });\n return transform.then(onDeleteTagSuccess, onDeleteTagError);\n };\n\n TagLineController.prototype.onAddTag = function(tag, color) {\n var onAddTagError, onAddTagSuccess, transform;\n this.loadingAddTag = true;\n onAddTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.addTag = false;\n _this.loadingAddTag = false;\n return item;\n };\n })(this);\n onAddTagError = (function(_this) {\n return function() {\n _this.loadingAddTag = false;\n return _this.confirm.notify(\"error\");\n };\n })(this);\n transform = this.modelTransform.save((function(_this) {\n return function(item) {\n var itemtags, value;\n value = trim(tag.toLowerCase());\n itemtags = _.clone(item.tags);\n itemtags.push([tag, color]);\n item.tags = itemtags;\n return item;\n };\n })(this));\n return transform.then(onAddTagSuccess, onAddTagError);\n };\n\n return TagLineController;\n\n })();\n\n module.controller(\"TagLineCtrl\", TagLineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineDirective = function() {\n return {\n scope: {\n item: \"=\",\n permissions: \"@\",\n project: \"=\"\n },\n templateUrl: \"components/tags/tag-line-detail/tag-line-detail.html\",\n controller: \"TagLineCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLine\", TagLineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.service.coffee\n */\n\n(function() {\n var TagLineService, 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('taigaCommon');\n\n TagLineService = (function(superClass) {\n extend(TagLineService, superClass);\n\n TagLineService.$inject = [];\n\n function TagLineService() {}\n\n TagLineService.prototype.checkPermissions = function(myPermissions, projectPermissions) {\n return _.includes(myPermissions, projectPermissions);\n };\n\n TagLineService.prototype.createColorsArray = function(projectTagColors) {\n return _.map(projectTagColors, function(index, value) {\n return [value, index];\n });\n };\n\n return TagLineService;\n\n })(taiga.Service);\n\n module.service(\"tgTagLineService\", TagLineService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagDirective = function() {\n return {\n templateUrl: \"components/tags/tag/tag.html\",\n scope: {\n tag: \"<\",\n loadingRemoveTag: \"<\",\n onDeleteTag: \"&\",\n hasPermissions: \"@\"\n }\n };\n };\n\n module.directive(\"tgTag\", TagDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: taskboard-zoom.directive.coffee\n */\n\n(function() {\n var TaskboardZoomDirective;\n\n TaskboardZoomDirective = function(storage) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, zooms;\n scope.zoomIndex = storage.get(\"taskboard_zoom\") || 2;\n scope.levels = 4;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\", \"empty_extra_info\"], [\"related_tasks\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"taskboard_zoom\") !== zoomIndex) {\n storage.set(\"taskboard_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n return scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgTaskboardZoom\", [\"$tgStorage\", TaskboardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-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: tribe-button.directive.coffee\n */\n\n(function() {\n var TribeButtonDirective;\n\n TribeButtonDirective = function(configService, locationService) {\n var link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.url = (locationService.protocol()) + \"://\" + (locationService.host());\n if (locationService.protocol() === \"http\" && locationService.port() !== 80) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n } else if (locationService.protocol() === \"https\" && locationService.port() !== 443) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n }\n };\n return {\n scope: {\n usId: \"=\",\n projectSlug: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/tribe-button/tribe-button.html\",\n link: link\n };\n };\n\n TribeButtonDirective.$inject = [\"$tgConfig\", \"$tgLocation\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeButton\", TribeButtonDirective);\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: tribe-linked.directive.coffee\n */\n\n(function() {\n var TribeLinkedDirective;\n\n TribeLinkedDirective = function(configService) {\n var directive, link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.show = function() {\n return scope.vm.open = true;\n };\n return scope.vm.hide = function(event) {\n return scope.vm.open = false;\n };\n };\n directive = {\n templateUrl: \"components/tribe-button/tribe-linked.html\",\n scope: {\n gigTitle: \"=\",\n gigId: \"=\"\n },\n link: link\n };\n return directive;\n };\n\n TribeLinkedDirective.$inject = [\"$tgConfig\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeLinked\", TribeLinkedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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 epics: 'modify_epic'\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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentEditWysiwyg;\n\n CommentEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
\\n \\n \\n
\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentEditWysiwyg\", [\"tgAttachmentsFullService\", CommentEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/comment-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentWysiwyg;\n\n CommentWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n $scope.editableDescription = false;\n $scope.saveComment = function(description, cb) {\n $scope.content = '';\n $scope.vm.type.comment = description;\n return $scope.vm.onAddComment({\n callback: cb\n });\n };\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.type.id, types[$scope.vm.type._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.onChange = function(markdown) {\n return $scope.vm.type.comment = markdown;\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.content = '';\n return $scope.$watch(\"vm.type\", function(value) {\n if (!value) {\n return;\n }\n return $scope.storageKey = \"comment-\" + value.project + \"-\" + value.id + \"-\" + value._name;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
\\n \\n \\n
\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentWysiwyg\", [\"tgAttachmentsFullService\", CommentWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CustomFieldEditWysiwyg;\n\n CustomFieldEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
\\n \\n \\n
\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCustomFieldEditWysiwyg\", [\"tgAttachmentsFullService\", CustomFieldEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/item-wysiwyg.directive.coffee\n */\n\n(function() {\n var ItemWysiwyg;\n\n ItemWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = function(description, cb) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.description = description;\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](cb);\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, $attrs.type, file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-\" + $attrs.type;\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
\\n \\n \\n\\n
\\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n \\n\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgItemWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$translate\", ItemWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg-code-hightlighter.service.coffee\n */\n\n(function() {\n var WysiwygCodeHightlighterService;\n\n WysiwygCodeHightlighterService = (function() {\n function WysiwygCodeHightlighterService() {\n Prism.plugins.customClass.prefix('prism-');\n Prism.plugins.customClass.map({});\n }\n\n WysiwygCodeHightlighterService.prototype.getLanguages = function() {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (_this.languages) {\n return resolve(_this.languages);\n } else if (_this.loadPromise) {\n return _this.loadPromise.then(function() {\n return resolve(_this.languages);\n });\n } else {\n return _this.loadPromise = $.getJSON(\"/\" + window._version + \"/prism/prism-languages.json\").then(function(_languages_) {\n _this.loadPromise = null;\n _this.languages = _.map(_languages_, function(it) {\n it.url = (\"/\" + window._version + \"/prism/\") + it.file;\n return it;\n });\n return resolve(_this.languages);\n });\n }\n };\n })(this));\n };\n\n WysiwygCodeHightlighterService.prototype.getLanguageInClassList = function(classes) {\n var lan;\n lan = _.find(this.languages, function(it) {\n return !!_.find(classes, function(className) {\n return 'language-' + it.name === className;\n });\n });\n if (lan) {\n return lan.name;\n } else {\n return null;\n }\n };\n\n WysiwygCodeHightlighterService.prototype.loadLanguage = function(lan) {\n return new Promise(function(resolve) {\n if (!Prism.languages[lan]) {\n return ljs.load(\"/\" + window._version + \"/prism/prism-\" + lan + \".min.js\", resolve);\n } else {\n return resolve();\n }\n });\n };\n\n WysiwygCodeHightlighterService.prototype.replaceCodeBrToNl = function(code) {\n return $(code).find('br').replaceWith('\\n');\n };\n\n WysiwygCodeHightlighterService.prototype.hightlightCode = function(code) {\n var lan;\n this.replaceCodeBrToNl(code);\n lan = this.getLanguageInClassList(code.classList);\n if (lan) {\n return this.loadLanguage(lan).then(function() {\n return Prism.highlightElement(code);\n });\n }\n };\n\n WysiwygCodeHightlighterService.prototype.addHightlighter = function(element) {\n var codes;\n codes = $(element).find('code');\n return codes.each((function(_this) {\n return function(index, code) {\n return _this.hightlightCode(code);\n };\n })(this));\n };\n\n return WysiwygCodeHightlighterService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygCodeHightlighterService\", WysiwygCodeHightlighterService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.directive.coffee\n */\n\n(function() {\n var WysiwygCodeLightbox;\n\n WysiwygCodeLightbox = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n scope.open = true;\n lightboxService.open(el, null, scope.onClose);\n return scope.$applyAsync(function() {\n var textarea;\n textarea = el[0].querySelector('textarea');\n if (textarea) {\n return textarea.select();\n }\n });\n } else if (!visible && el.hasClass('open')) {\n scope.open = false;\n return lightboxService.close(el);\n }\n });\n };\n return {\n scope: {\n languages: '<',\n codeLanguage: '<',\n code: '<',\n visible: '<',\n onClose: '&',\n onSave: '&'\n },\n link: link,\n templateUrl: \"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwygCodeLightbox\", [\"lightboxService\", WysiwygCodeLightbox]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg-mention.service.coffee\n */\n\n(function() {\n var WysiwygMentionService;\n\n WysiwygMentionService = (function() {\n WysiwygMentionService.$inject = [\"tgProjectService\", \"tgWysiwygService\", \"$tgNavUrls\", \"$tgResources\"];\n\n function WysiwygMentionService(projectService, wysiwygService, navurls, rs) {\n this.projectService = projectService;\n this.wysiwygService = wysiwygService;\n this.navurls = navurls;\n this.rs = rs;\n this.cancelablePromise = null;\n }\n\n WysiwygMentionService.prototype.searchEmoji = function(name, cb) {\n var filteredEmojis;\n filteredEmojis = this.wysiwygService.searchEmojiByName(name);\n filteredEmojis = filteredEmojis.slice(0, 10);\n return cb(filteredEmojis);\n };\n\n WysiwygMentionService.prototype.searchUser = function(term, cb) {\n var searchProps, users;\n searchProps = ['username', 'full_name', 'full_name_display'];\n users = this.projectService.project.toJS().members.filter((function(_this) {\n return function(user) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(user[prop]).indexOf(term) >= 0) {\n return true;\n } else if (user[prop].indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this));\n users = users.slice(0, 10).map((function(_this) {\n return function(it) {\n it.url = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: it.username\n });\n return it;\n };\n })(this));\n return cb(users);\n };\n\n WysiwygMentionService.prototype.searchItem = function(term) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var filter, searchProps, searchTypes, urls;\n term = taiga.slugify(term);\n searchTypes = ['issues', 'tasks', 'userstories'];\n urls = {\n issues: \"project-issues-detail\",\n tasks: \"project-tasks-detail\",\n userstories: \"project-userstories-detail\"\n };\n searchProps = ['ref', 'subject'];\n filter = function(item) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(item[prop]).indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n if (_this.cancelablePromise) {\n _this.cancelablePromise.abort();\n }\n _this.cancelablePromise = _this.rs.search[\"do\"](_this.projectService.project.get('id'), term);\n return _this.cancelablePromise.then(function(res) {\n var i, items, len, result, type;\n if (res.count < 1 || res.count === res.wikipages.length) {\n return resolve([]);\n } else {\n result = [];\n for (i = 0, len = searchTypes.length; i < len; i++) {\n type = searchTypes[i];\n if (res[type] && res[type].length > 0) {\n items = res[type].filter(filter);\n items = items.map(function(it) {\n it.url = _this.navurls.resolve(urls[type], {\n project: _this.projectService.project.get('slug'),\n ref: it.ref\n });\n return it;\n });\n result = result.concat(items);\n }\n }\n result = _.sortBy(result, [\"ref\"]);\n return resolve(result.slice(0, 10));\n }\n });\n };\n })(this));\n };\n\n WysiwygMentionService.prototype.search = function(mention) {\n return new Promise((function(_this) {\n return function(resolve) {\n if ('#'.indexOf(mention[0]) !== -1) {\n return _this.searchItem(mention.replace('#', '')).then(resolve);\n } else if ('@'.indexOf(mention[0]) !== -1) {\n return _this.searchUser(mention.replace('@', ''), resolve);\n } else if (':'.indexOf(mention[0]) !== -1) {\n return _this.searchEmoji(mention.replace(':', ''), resolve);\n }\n };\n })(this));\n };\n\n return WysiwygMentionService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygMentionService\", WysiwygMentionService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg.directive.coffee\n */\n\n(function() {\n var Medium, bindOnce, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n Medium = function($translate, $confirm, $storage, wysiwygService, animationFrame, tgLoader, wysiwygCodeHightlighterService, wysiwygMentionService, analytics, $location) {\n var AlignRightButton, CodeButton, CustomPasteHandler, addCodeBlockAndHightlight, getIcon, getRangeCodeBlock, isCodeBlockSelected, link, oldIsBlockContainer, refreshCodeBlocks, removeCodeBlockAndHightlight, removeSelections;\n removeSelections = function() {\n if (window.getSelection) {\n if (window.getSelection().empty) {\n return window.getSelection().empty();\n }\n } else if (window.getSelection().removeAllRanges) {\n return window.getSelection().removeAllRanges();\n } else if (document.selection) {\n return document.selection.empty();\n }\n };\n getRangeCodeBlock = function(range) {\n return $(range.endContainer).parentsUntil('.editor', 'code');\n };\n isCodeBlockSelected = function(range) {\n return !!getRangeCodeBlock(range).length;\n };\n removeCodeBlockAndHightlight = function(selection, mediumInstance) {\n var code, p, pre;\n if ($(selection).is('code')) {\n code = selection;\n } else {\n code = $(selection).closest('code')[0];\n }\n pre = code.parentNode;\n p = document.createElement('p');\n p.innerText = code.innerText;\n pre.parentNode.replaceChild(p, pre);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n addCodeBlockAndHightlight = function(range, mediumInstance) {\n var code, extract, pre, start;\n pre = document.createElement('pre');\n code = document.createElement('code');\n if (!range.startContainer.parentNode.nextSibling) {\n $('
').insertAfter(range.startContainer.parentNode);\n }\n start = range.endContainer.parentNode.nextSibling;\n extract = range.extractContents();\n code.appendChild(extract);\n pre.appendChild(code);\n start.parentNode.insertBefore(pre, start);\n refreshCodeBlocks(mediumInstance);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n refreshCodeBlocks = function(mediumInstance) {\n var i, j, len, len1, mainChildren, p, pre, preList, ref, results;\n if (!mediumInstance) {\n return;\n }\n ref = mediumInstance.elements[0].children;\n for (i = 0, len = ref.length; i < len; i++) {\n mainChildren = ref[i];\n if (mainChildren && mainChildren.tagName.toLowerCase() === 'p' && !mainChildren.innerHTML.trim().length) {\n mainChildren.parentNode.removeChild(mainChildren);\n }\n }\n preList = mediumInstance.elements[0].querySelectorAll('pre');\n results = [];\n for (j = 0, len1 = preList.length; j < len1; j++) {\n pre = preList[j];\n pre.setAttribute('contenteditable', false);\n pre.setAttribute('title', $translate.instant(\"COMMON.WYSIWYG.DB_CLICK\"));\n pre.addEventListener('mousedown', function(e) {\n return e.preventDefault();\n });\n if (pre.nextElementSibling && pre.nextElementSibling.nodeName.toLowerCase() === 'p' && !pre.nextElementSibling.children.length) {\n results.push(pre.nextElementSibling.appendChild(document.createElement('br')));\n } else if (!pre.nextElementSibling || ['p', 'ul', 'h1', 'h2', 'h3'].indexOf(pre.nextElementSibling.nodeName.toLowerCase()) === -1) {\n p = document.createElement('p');\n p.appendChild(document.createElement('br'));\n results.push(pre.parentNode.insertBefore(p, pre.nextSibling));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n AlignRightButton = MediumEditor.extensions.button.extend({\n name: 'rtl',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'rtl';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'RTL';\n this.button.title = 'RTL';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n handleClick: function(event) {\n var range;\n range = MediumEditor.selection.getSelectionRange(document);\n if (range.commonAncestorContainer.parentNode.style.textAlign === 'right') {\n return document.execCommand('justifyLeft', false);\n } else {\n return document.execCommand('justifyRight', false);\n }\n }\n });\n getIcon = function(icon) {\n return \"\\n \\n\";\n };\n CodeButton = MediumEditor.extensions.button.extend({\n name: 'code',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'code';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'Code';\n this.button.title = 'Code';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n tagNames: ['code'],\n handleClick: function(event) {\n var range, toolbar;\n range = MediumEditor.selection.getSelectionRange(self.document);\n if (isCodeBlockSelected(range, this.base)) {\n removeCodeBlockAndHightlight(range.endContainer, this.base);\n } else {\n addCodeBlockAndHightlight(range, this.base);\n removeSelections();\n }\n toolbar = this.base.getExtensionByName('toolbar');\n if (toolbar) {\n return toolbar.hideToolbar();\n }\n }\n });\n CustomPasteHandler = MediumEditor.extensions.paste.extend({\n doPaste: function(pastedHTML, pastedPlain, editable) {\n var html;\n html = MediumEditor.util.htmlEntities(pastedPlain);\n return MediumEditor.util.insertHTMLCommand(this.document, html);\n }\n });\n oldIsBlockContainer = MediumEditor.util.isBlockContainer;\n MediumEditor.util.isBlockContainer = function(element) {\n var tagName;\n if (!element) {\n return oldIsBlockContainer(element);\n }\n if (element.tagName) {\n tagName = element.tagName;\n } else {\n tagName = element.parentNode.tagName;\n }\n if (tagName.toLowerCase() === 'code') {\n return true;\n }\n return oldIsBlockContainer(element);\n };\n link = function($scope, $el, $attrs) {\n var cancelWithConfirmation, change, clean, codeBlockSelected, create, discardLocalStorage, editorMarkdown, editorMedium, getCurrentContent, isDraft, isEditOnly, isOutdated, localSave, mediumInstance, notPersist, replaceCodeBrToNl, saveEnd, setEditMode, setHtmlMedium, throttleChange, unwatch, updateMarkdownWithCurrentHtml, uploadEnd;\n mediumInstance = null;\n editorMedium = $el.find('.medium');\n editorMarkdown = $el.find('.markdown');\n codeBlockSelected = null;\n isEditOnly = !!$attrs.$attr.editonly;\n notPersist = !!$attrs.$attr.notPersist;\n $scope.required = !!$attrs.$attr.required;\n $scope.editMode = isEditOnly || false;\n $scope.mode = $storage.get('editor-mode', 'html');\n $scope.markdown = '';\n $scope.codeEditorVisible = false;\n $scope.codeLans = [];\n wysiwygCodeHightlighterService.getLanguages().then(function(codeLans) {\n return $scope.codeLans = codeLans;\n });\n setEditMode = function(editMode) {\n return $scope.editMode = editMode;\n };\n setHtmlMedium = function(markdown) {\n var html;\n html = wysiwygService.getHTML(markdown);\n editorMedium.html(html);\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n if ($scope.editMode) {\n return refreshCodeBlocks(mediumInstance);\n }\n };\n $scope.saveSnippet = function(lan, code) {\n var codePre;\n $scope.codeEditorVisible = false;\n codeBlockSelected.innerText = code;\n codePre = codeBlockSelected.parentNode;\n if (lan === 'remove-formating') {\n codeBlockSelected.className = '';\n codePre.className = '';\n removeCodeBlockAndHightlight(codeBlockSelected, mediumInstance);\n } else if (_.trim(code).length) {\n if (lan) {\n codeBlockSelected.className = 'language-' + lan;\n codePre.className = 'language-' + lan;\n } else {\n codeBlockSelected.className = '';\n codePre.className = '';\n }\n wysiwygCodeHightlighterService.hightlightCode(codeBlockSelected);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n } else {\n codeBlockSelected.parentNode.parentNode.removeChild(codeBlockSelected.parentNode);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n }\n throttleChange();\n return null;\n };\n $scope.setMode = function(mode) {\n $storage.set('editor-mode', mode);\n if (mode === 'markdown') {\n updateMarkdownWithCurrentHtml();\n } else {\n setHtmlMedium($scope.markdown);\n }\n $scope.mode = mode;\n return mediumInstance.trigger('editableBlur', {}, editorMedium[0]);\n };\n $scope.save = function(e) {\n if (e) {\n e.preventDefault();\n }\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n setHtmlMedium($scope.markdown);\n if ($scope.required && !$scope.markdown.length) {\n return;\n }\n $scope.saving = true;\n $scope.outdated = false;\n $scope.onSave({\n text: $scope.markdown,\n cb: saveEnd\n });\n };\n $scope.cancel = function(e) {\n if (e) {\n e.preventDefault();\n }\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n } else if ($scope.mode === 'html') {\n setHtmlMedium($scope.content || null);\n }\n $scope.markdown = $scope.content;\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n $scope.outdated = false;\n refreshCodeBlocks(mediumInstance);\n $scope.onCancel();\n };\n clean = function() {\n $scope.markdown = '';\n return editorMedium.html('');\n };\n saveEnd = function() {\n $scope.saving = false;\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n }\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n return analytics.trackEvent('develop', 'save wysiwyg', $scope.mode, 1);\n };\n uploadEnd = function(name, url) {\n if (taiga.isImage(name)) {\n return mediumInstance.pasteHTML(\"
\");\n } else {\n name = $('
').text(name).html();\n return mediumInstance.pasteHTML(\"\" + name + \"
\");\n }\n };\n isOutdated = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store && store.version && store.version !== $scope.version) {\n return true;\n }\n return false;\n };\n isDraft = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return true;\n }\n return false;\n };\n getCurrentContent = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return store.text;\n }\n return $scope.content;\n };\n discardLocalStorage = function() {\n return $storage.remove($scope.storageKey);\n };\n cancelWithConfirmation = function() {\n var message, title;\n if ($scope.content === $scope.markdown) {\n $scope.cancel();\n document.activeElement.blur();\n document.body.click();\n return null;\n }\n title = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE\");\n message = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE\");\n return $confirm.ask(title, null, message).then(function(askResponse) {\n $scope.cancel();\n return askResponse.finish();\n });\n };\n replaceCodeBrToNl = function() {\n var html;\n html = $('
').html(editorMedium.html());\n html.find('code br').replaceWith('\\n');\n return html.html();\n };\n updateMarkdownWithCurrentHtml = function() {\n var html;\n html = replaceCodeBrToNl();\n return $scope.markdown = wysiwygService.getMarkdown(html);\n };\n localSave = function(markdown) {\n var store;\n if ($scope.storageKey) {\n store = {};\n store.version = $scope.version || 0;\n store.text = markdown;\n return $storage.set($scope.storageKey, store);\n }\n };\n change = function() {\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n localSave($scope.markdown);\n return $scope.onChange({\n markdown: $scope.markdown\n });\n };\n throttleChange = _.throttle(change, 200);\n create = function(text, editMode) {\n var html;\n if (editMode == null) {\n editMode = false;\n }\n if (text.length) {\n html = wysiwygService.getHTML(text);\n editorMedium.html(html);\n }\n mediumInstance = new MediumEditor(editorMedium[0], {\n imageDragging: false,\n placeholder: {\n text: $scope.placeholder\n },\n toolbar: {\n buttons: [\n {\n name: 'bold',\n contentDefault: getIcon('editor-bold')\n }, {\n name: 'italic',\n contentDefault: getIcon('editor-italic')\n }, {\n name: 'strikethrough',\n contentDefault: getIcon('editor-cross-out')\n }, {\n name: 'anchor',\n contentDefault: getIcon('editor-link')\n }, {\n name: 'image',\n contentDefault: getIcon('editor-image')\n }, {\n name: 'orderedlist',\n contentDefault: getIcon('editor-list-n')\n }, {\n name: 'unorderedlist',\n contentDefault: getIcon('editor-list-o')\n }, {\n name: 'h1',\n contentDefault: getIcon('editor-h1')\n }, {\n name: 'h2',\n contentDefault: getIcon('editor-h2')\n }, {\n name: 'h3',\n contentDefault: getIcon('editor-h3')\n }, {\n name: 'quote',\n contentDefault: getIcon('editor-quote')\n }, {\n name: 'removeFormat',\n contentDefault: getIcon('editor-no-format')\n }, {\n name: 'rtl',\n contentDefault: getIcon('editor-rtl')\n }, {\n name: 'code',\n contentDefault: getIcon('editor-code')\n }\n ]\n },\n extensions: {\n paste: new CustomPasteHandler(),\n code: new CodeButton(),\n autolist: new AutoList(),\n alignright: new AlignRightButton(),\n mediumMention: new MentionExtension({\n getItems: function(mention, mentionCb) {\n return wysiwygMentionService.search(mention).then(mentionCb);\n }\n })\n }\n });\n $scope.changeMarkdown = throttleChange;\n mediumInstance.subscribe('editableInput', function(e) {\n return $scope.$applyAsync(throttleChange);\n });\n mediumInstance.subscribe(\"editableClick\", function(e) {\n var r;\n r = new RegExp('^(?:[a-z]+:)?//', 'i');\n if (e.target.href) {\n if (r.test(e.target.getAttribute('href')) || e.target.getAttribute('target') === '_blank') {\n e.stopPropagation();\n return window.open(e.target.href);\n } else {\n return $location.url(e.target.href);\n }\n }\n });\n mediumInstance.subscribe('editableDrop', function(event) {\n return $scope.onUploadFile({\n files: event.dataTransfer.files,\n cb: uploadEnd\n });\n });\n mediumInstance.subscribe('editableKeydown', function(e) {\n var code, mention;\n code = e.keyCode ? e.keyCode : e.which;\n mention = $('.medium-mention');\n if ((code === 40 || code === 38) && mention.length) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n if ($scope.editMode && code === 27) {\n e.stopPropagation();\n return $scope.$applyAsync(cancelWithConfirmation);\n } else if (code === 27) {\n return editorMedium.blur();\n }\n });\n setEditMode(editMode);\n return $scope.$applyAsync(function() {\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n return refreshCodeBlocks(mediumInstance);\n });\n };\n $(editorMedium[0]).on('mousedown', function(e) {\n if (e.target.href) {\n e.preventDefault();\n return e.stopPropagation();\n } else {\n return $scope.$applyAsync(function() {\n if (!$scope.editMode) {\n setEditMode(true);\n return refreshCodeBlocks(mediumInstance);\n }\n });\n }\n });\n $(editorMedium[0]).on('dblclick', 'pre', function(e) {\n return $scope.$applyAsync(function() {\n $scope.codeEditorVisible = true;\n codeBlockSelected = e.currentTarget.querySelector('code');\n $scope.currentCodeLanguage = wysiwygCodeHightlighterService.getLanguageInClassList(codeBlockSelected.classList);\n return $scope.code = codeBlockSelected.innerText;\n });\n });\n unwatch = $scope.$watch('content', function(content) {\n var unwatchLoader;\n if (!_.isUndefined(content)) {\n $scope.outdated = isOutdated();\n if (!mediumInstance && isDraft()) {\n setEditMode(true);\n }\n if (($scope.markdown.length || content.length) && $scope.markdown === content) {\n return;\n }\n content = getCurrentContent();\n $scope.markdown = content;\n if (mediumInstance) {\n mediumInstance.destroy();\n }\n if (tgLoader.open()) {\n unwatchLoader = tgLoader.onEnd(function() {\n create(content, $scope.editMode);\n return unwatchLoader();\n });\n } else {\n create(content, $scope.editMode);\n }\n return unwatch();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n if (mediumInstance) {\n if (editorMedium.length) {\n $(editorMedium[0]).off();\n }\n return mediumInstance.destroy();\n }\n });\n };\n return {\n templateUrl: \"common/components/wysiwyg-toolbar.html\",\n scope: {\n placeholder: '@',\n version: '<',\n storageKey: '<',\n content: '<',\n onCancel: '&',\n onSave: '&',\n onUploadFile: '&',\n onChange: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwyg\", [\"$translate\", \"$tgConfirm\", \"$tgStorage\", \"tgWysiwygService\", \"animationFrame\", \"tgLoader\", \"tgWysiwygCodeHightlighterService\", \"tgWysiwygMentionService\", \"$tgAnalytics\", \"$location\", Medium]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg.service.coffee\n */\n\n(function() {\n var WysiwygService;\n\n WysiwygService = (function() {\n WysiwygService.$inject = [\"tgWysiwygCodeHightlighterService\", \"tgProjectService\", \"$tgNavUrls\", \"$tgEmojis\"];\n\n function WysiwygService(wysiwygCodeHightlighterService, projectService, navurls, emojis) {\n this.wysiwygCodeHightlighterService = wysiwygCodeHightlighterService;\n this.projectService = projectService;\n this.navurls = navurls;\n this.emojis = emojis;\n }\n\n WysiwygService.prototype.searchEmojiByName = function(name) {\n return this.emojis.searchByName(name);\n };\n\n WysiwygService.prototype.pipeLinks = function(text) {\n return text.replace(/\\[\\[(.*?)\\]\\]/g, function(match, p1, offset, str) {\n var link, linkParams, title;\n linkParams = p1.split('|');\n link = linkParams[0];\n title = linkParams[1] || linkParams[0];\n return '[' + title + '](' + link + ')';\n });\n };\n\n WysiwygService.prototype.replaceUrls = function(html) {\n var el, i, len, link, links;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/profile/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n } else if (link.getAttribute('href').indexOf('/t/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.searchWikiLinks = function(html) {\n var el, i, len, link, links, url;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/') === -1) {\n url = this.navurls.resolve('project-wiki-page', {\n project: this.projectService.project.get('slug'),\n slug: link.getAttribute('href')\n });\n link.setAttribute('href', url);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.removeTrailingListBr = function(text) {\n return text.replace(/
  • (.*?)
    <\\/li>/g, '
  • $1
  • ');\n };\n\n WysiwygService.prototype.getMarkdown = function(html) {\n var cleanIssueConverter, codeLanguageConverter, markdown;\n cleanIssueConverter = {\n filter: ['html', 'body', 'span', 'div'],\n replacement: function(innerHTML) {\n return innerHTML;\n }\n };\n codeLanguageConverter = {\n filter: (function(_this) {\n return function(node) {\n return node.nodeName === 'PRE' && node.firstChild && node.firstChild.nodeName === 'CODE';\n };\n })(this),\n replacement: (function(_this) {\n return function(content, node) {\n var lan;\n lan = _this.wysiwygCodeHightlighterService.getLanguageInClassList(node.firstChild.classList);\n if (!lan) {\n lan = '';\n }\n return '\\n\\n```' + lan + '\\n' + _.trim(node.firstChild.textContent) + '\\n```\\n\\n';\n };\n })(this)\n };\n html = html.replace(/ (<\\/.*>)/g, \"$1\");\n html = this.emojis.replaceImgsByEmojiName(html);\n html = this.replaceUrls(html);\n html = this.removeTrailingListBr(html);\n markdown = toMarkdown(html, {\n gfm: true,\n converters: [cleanIssueConverter, codeLanguageConverter]\n });\n return markdown;\n };\n\n WysiwygService.prototype.parseMentionMatches = function(text) {\n var m, matches, offset, prevChar, regex, serviceName, tagBuilder;\n serviceName = 'twitter';\n tagBuilder = this.tagBuilder;\n matches = [];\n regex = /@[^\\s]{1,50}[^.\\s]/g;\n m = regex.exec(text);\n while (m !== null) {\n offset = m.index;\n prevChar = text.charAt(offset - 1);\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n m.forEach(function(match, groupIndex) {\n return matches.push(new Autolinker.match.Mention({\n tagBuilder: tagBuilder,\n matchedText: match,\n offset: offset,\n serviceName: serviceName,\n mention: match.slice(1)\n }));\n });\n m = regex.exec(text);\n }\n return matches;\n };\n\n WysiwygService.prototype.autoLinkHTML = function(html) {\n var autolinker, matchRegexStr;\n matchRegexStr = String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter);\n if (matchRegexStr.indexOf('.') === -1) {\n matchRegexStr = '@[^\\s]{1,50}[^.\\s]';\n }\n autolinker = new Autolinker({\n mention: 'twitter',\n hashtag: 'twitter',\n replaceFn: (function(_this) {\n return function(match) {\n var profileUrl, url;\n if (match.getType() === 'mention') {\n profileUrl = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: match.getMention()\n });\n return '@' + match.getMention() + '';\n } else if (match.getType() === 'hashtag') {\n url = _this.navurls.resolve('project-detail-ref', {\n project: _this.projectService.project.get('slug'),\n ref: match.getHashtag()\n });\n return '#' + match.getHashtag() + '';\n }\n };\n })(this)\n });\n Autolinker.matcher.Mention.prototype.parseMatches = this.parseMentionMatches.bind(autolinker);\n return autolinker.link(html);\n };\n\n WysiwygService.prototype.getHTML = function(text) {\n var md, options, result;\n if (!text || !text.length) {\n return \"\";\n }\n options = {\n breaks: true\n };\n text = this.emojis.replaceEmojiNameByImgs(text);\n text = this.pipeLinks(text);\n md = window.markdownit({\n breaks: true\n });\n md.use(window.markdownitLazyHeaders);\n result = md.render(text);\n result = this.searchWikiLinks(result);\n result = this.autoLinkHTML(result);\n return result;\n };\n\n return WysiwygService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygService\", WysiwygService);\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 compile: function(element, attrs) {\n if (!attrs.q) {\n return attrs.q = '';\n }\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', '$tgLocation', '$tgAnalytics', 'tgAppMetaService', '$translate'];\n\n function DiscoverSearchController(routeParams, discoverProjectsService, route, location, analytics, appMetaService, translate) {\n var description, title;\n this.routeParams = routeParams;\n this.discoverProjectsService = discoverProjectsService;\n this.route = route;\n this.location = location;\n this.analytics = analytics;\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 this.analytics.trackPage(this.location.url(), \"Discover Search\");\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 this.analytics.trackPage(this.location.url(), \"Discover Search\");\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 this.analytics.trackPage(this.location.url(), \"Discover Search\");\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-2017 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 var _discoverParams;\n\n extend(DiscoverProjectsService, superClass);\n\n DiscoverProjectsService.$inject = [\"tgResources\", \"tgProjectsService\"];\n\n _discoverParams = {\n discover_mode: true\n };\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 var _params;\n _params = _.extend({}, _discoverParams, 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 var _params;\n _params = _.extend({}, _discoverParams, 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 = _.extend({}, _discoverParams);\n _params.is_featured = true;\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 var _params;\n _params = _.extend({}, _discoverParams, 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-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: create-epic.controller.coffee\n */\n\n(function() {\n var CreateEpicController, getRandomDefaultColor, taiga, trim;\n\n taiga = this.taiga;\n\n trim = taiga.trim;\n\n getRandomDefaultColor = taiga.getRandomDefaultColor;\n\n CreateEpicController = (function() {\n CreateEpicController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"$tgAnalytics\"];\n\n function CreateEpicController(confirm, projectService, epicsService, analytics) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.analytics = analytics;\n this.project = this.projectService.project.toJS();\n this.newEpic = {\n color: getRandomDefaultColor(),\n status: this.project.default_epic_status,\n tags: []\n };\n this.attachments = Immutable.List();\n this.loading = false;\n }\n\n CreateEpicController.prototype.createEpic = function() {\n if (!this.validateForm()) {\n return;\n }\n this.loading = true;\n return this.epicsService.createEpic(this.newEpic, this.attachments).then((function(_this) {\n return function(response) {\n _this.analytics.trackEvent(\"epic\", \"create\", \"create epic\", 1);\n _this.onCreateEpic();\n return _this.loading = false;\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n _this.setFormErrors(response.data);\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n CreateEpicController.prototype.selectColor = function(color) {\n return this.newEpic.color = color;\n };\n\n CreateEpicController.prototype.addTag = function(name, color) {\n name = trim(name.toLowerCase());\n if (!_.find(this.newEpic.tags, function(it) {\n return it[0] === name;\n })) {\n return this.newEpic.tags.push([name, color]);\n }\n };\n\n CreateEpicController.prototype.deleteTag = function(tag) {\n return _.remove(this.newEpic.tags, function(it) {\n return it[0] === tag[0];\n });\n };\n\n CreateEpicController.prototype.addAttachment = function(attachment) {\n return this.attachments.push(attachment);\n };\n\n return CreateEpicController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"CreateEpicCtrl\", CreateEpicController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: create-epic.directive.coffee\n */\n\n(function() {\n var CreateEpicDirective;\n\n CreateEpicDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var form;\n form = el.find(\"form\").checksley();\n ctrl.validateForm = (function(_this) {\n return function() {\n return form.validate();\n };\n })(this);\n return ctrl.setFormErrors = (function(_this) {\n return function(errors) {\n return form.setErrors(errors);\n };\n })(this);\n };\n return {\n link: link,\n templateUrl: \"epics/create-epic/create-epic.html\",\n controller: \"CreateEpicCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n onCreateEpic: '&'\n },\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgCreateEpic\", CreateEpicDirective);\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: epics-table.controller.coffee\n */\n\n(function() {\n var EpicRowController;\n\n EpicRowController = (function() {\n EpicRowController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\"];\n\n function EpicRowController(confirm, projectService, epicsService) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.displayUserStories = false;\n this.displayAssignedTo = false;\n this.displayStatusList = false;\n this.loadingStatus = false;\n this.project = this.projectService.project.toJS();\n this._calculateProgressBar();\n }\n\n EpicRowController.prototype._calculateProgressBar = function() {\n var progress, total;\n if (this.epic.getIn(['status_extra_info', 'is_closed']) === true) {\n return this.percentage = \"100%\";\n } else {\n progress = this.epic.getIn(['user_stories_counts', 'progress']);\n total = this.epic.getIn(['user_stories_counts', 'total']);\n if (total === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (progress * 100 / total) + \"%\";\n }\n }\n };\n\n EpicRowController.prototype.canEditEpics = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n EpicRowController.prototype.toggleUserStoryList = function() {\n if (!this.displayUserStories) {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userStories) {\n _this.epicStories = userStories;\n return _this.displayUserStories = true;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this));\n } else {\n return this.displayUserStories = false;\n }\n };\n\n EpicRowController.prototype.updateStatus = function(statusId) {\n this.displayStatusList = false;\n this.loadingStatus = true;\n return this.epicsService.updateEpicStatus(this.epic, statusId)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loadingStatus = false;\n };\n })(this));\n };\n\n EpicRowController.prototype.updateAssignedTo = function(member) {\n this.assignLoader = true;\n return this.epicsService.updateEpicAssignedTo(this.epic, (member != null ? member.id : void 0) || null)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.assignLoader = false;\n };\n })(this));\n };\n\n return EpicRowController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicRowCtrl\", EpicRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-table.directive.coffee\n */\n\n(function() {\n var EpicRowDirective;\n\n EpicRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epic-row/epic-row.html\",\n controller: \"EpicRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n epic: '=',\n column: '='\n }\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicRow\", EpicRowDirective);\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: epics.dashboard.controller.coffee\n */\n\n(function() {\n var EpicsDashboardController, taiga;\n\n taiga = this.taiga;\n\n EpicsDashboardController = (function() {\n EpicsDashboardController.$inject = [\"$routeParams\", \"tgErrorHandlingService\", \"tgLightboxFactory\", \"lightboxService\", \"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"tgAppMetaService\", \"$translate\"];\n\n function EpicsDashboardController(params, errorHandlingService, lightboxFactory, lightboxService, confirm, projectService, epicsService, appMetaService, translate) {\n this.params = params;\n this.errorHandlingService = errorHandlingService;\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.sectionName = \"EPICS.SECTION_NAME\";\n taiga.defineImmutableProperty(this, 'project', (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n EpicsDashboardController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\"),\n projectDescription: this.project.get(\"description\")\n };\n return {\n title: this.translate.instant(\"EPICS.PAGE_TITLE\", ctx),\n description: this.translate.instant(\"EPICS.PAGE_DESCRIPTION\", ctx)\n };\n };\n\n EpicsDashboardController.prototype.loadInitialData = function() {\n this.epicsService.clear();\n return this.projectService.setProjectBySlug(this.params.pslug).then((function(_this) {\n return function() {\n if (!_this.projectService.isEpicsDashboardEnabled()) {\n return _this.errorHandlingService.notFound();\n }\n if (!_this.projectService.hasPermission(\"view_epics\")) {\n return _this.errorHandlingService.permissionDenied();\n }\n return _this.epicsService.fetchEpics();\n };\n })(this));\n };\n\n EpicsDashboardController.prototype.canCreateEpics = function() {\n return this.projectService.hasPermission(\"add_epic\");\n };\n\n EpicsDashboardController.prototype.onCreateEpic = function() {\n var onCreateEpic;\n onCreateEpic = (function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.confirm.notify(\"success\");\n };\n })(this);\n return this.lightboxFactory.create('tg-create-epic', {\n \"class\": \"lightbox lightbox-create-epic open\",\n \"on-create-epic\": \"onCreateEpic()\"\n }, {\n \"onCreateEpic\": onCreateEpic.bind(this)\n });\n };\n\n return EpicsDashboardController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsDashboardCtrl\", EpicsDashboardController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-sortable.directive.coffee\n */\n\n(function() {\n var EpicsSortableDirective;\n\n EpicsSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgEpicsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div.epics-table-body-row');\n }\n });\n drake.on('dragend', function(item) {\n var epic, itemEl, newIndex;\n itemEl = $(item);\n epic = itemEl.scope().epic;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n epic: epic,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n EpicsSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgEpicsSortable\", EpicsSortableDirective);\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: epics-table.controller.coffee\n */\n\n(function() {\n var EpicsTableController, generateHash, taiga;\n\n taiga = this.taiga;\n\n generateHash = this.taiga.generateHash;\n\n EpicsTableController = (function() {\n EpicsTableController.$inject = [\"$tgConfirm\", \"tgEpicsService\", \"$timeout\", \"$tgStorage\", \"tgProjectService\"];\n\n function EpicsTableController(confirm, epicsService, timeout, storage, projectService) {\n this.confirm = confirm;\n this.epicsService = epicsService;\n this.timeout = timeout;\n this.storage = storage;\n this.projectService = projectService;\n this.hash = generateHash([this.projectService.project.get('id'), 'epics']);\n this.displayOptions = false;\n this.displayVotes = true;\n this.column = this.storage.get(this.hash, {\n votes: true,\n name: true,\n project: true,\n sprint: true,\n assigned: true,\n status: true,\n progress: true\n });\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'disabledEpicsPagination', (function(_this) {\n return function() {\n return _this.epicsService._disablePagination;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'loadingEpics', (function(_this) {\n return function() {\n return _this.epicsService._loadingEpics;\n };\n })(this));\n }\n\n EpicsTableController.prototype.toggleEpicTableOptions = function() {\n return this.displayOptions = !this.displayOptions;\n };\n\n EpicsTableController.prototype.reorderEpic = function(epic, newIndex) {\n if (epic.get('epics_order') === newIndex) {\n return null;\n }\n return this.epicsService.reorderEpic(epic, newIndex).then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n EpicsTableController.prototype.nextPage = function() {\n return this.epicsService.nextPage();\n };\n\n EpicsTableController.prototype.hoverEpicTableOption = function() {\n if (this.timer) {\n return this.timeout.cancel(this.timer);\n }\n };\n\n EpicsTableController.prototype.hideEpicTableOption = function() {\n return this.timer = this.timeout(((function(_this) {\n return function() {\n return _this.displayOptions = false;\n };\n })(this)), 400);\n };\n\n EpicsTableController.prototype.updateViewOptions = function() {\n return this.storage.set(this.hash, this.column);\n };\n\n return EpicsTableController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsTableCtrl\", EpicsTableController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-table.directive.coffee\n */\n\n(function() {\n var EpicsTableDirective;\n\n EpicsTableDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epics-table/epics-table.html\",\n controller: \"EpicsTableCtrl\",\n controllerAs: \"vm\",\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicsTable\", EpicsTableDirective);\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: epics-table.controller.coffee\n */\n\n(function() {\n var StoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n StoryRowController = (function() {\n StoryRowController.$inject = [];\n\n function StoryRowController() {\n this._calculateProgressBar();\n }\n\n StoryRowController.prototype._calculateProgressBar = function() {\n var totalTasks, totalTasksCompleted;\n if (this.story.get('is_closed') === true) {\n return this.percentage = \"100%\";\n } else {\n totalTasks = this.story.get('tasks').size;\n totalTasksCompleted = this.story.get('tasks').filter(function(it) {\n return it.get(\"is_closed\");\n }).size;\n if (totalTasks === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (totalTasksCompleted * 100 / totalTasks) + \"%\";\n }\n }\n };\n\n return StoryRowController;\n\n })();\n\n module.controller(\"StoryRowCtrl\", StoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-table.directive.coffee\n */\n\n(function() {\n var StoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n StoryRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/story-row/story-row.html\",\n controller: \"StoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n story: '=',\n column: '='\n }\n };\n };\n\n module.directive(\"tgStoryRow\", StoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics.service.coffee\n */\n\n(function() {\n var EpicsService, taiga;\n\n taiga = this.taiga;\n\n EpicsService = (function() {\n EpicsService.$inject = ['tgProjectService', 'tgAttachmentsService', 'tgResources', 'tgXhrErrorService'];\n\n function EpicsService(projectService, attachmentsService, resources, xhrError) {\n this.projectService = projectService;\n this.attachmentsService = attachmentsService;\n this.resources = resources;\n this.xhrError = xhrError;\n this.clear();\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this._epics;\n };\n })(this));\n }\n\n EpicsService.prototype.clear = function() {\n this._loadingEpics = false;\n this._disablePagination = false;\n this._page = 1;\n return this._epics = Immutable.List();\n };\n\n EpicsService.prototype.fetchEpics = function(reset) {\n if (reset == null) {\n reset = false;\n }\n this._loadingEpics = true;\n this._disablePagination = true;\n return this.resources.epics.list(this.projectService.project.get('id'), this._page).then((function(_this) {\n return function(result) {\n if (reset) {\n _this.clear();\n _this._epics = result.list;\n } else {\n _this._epics = _this._epics.concat(result.list);\n }\n _this._loadingEpics = false;\n return _this._disablePagination = !result.headers('x-pagination-next');\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n EpicsService.prototype.nextPage = function() {\n this._page++;\n return this.fetchEpics();\n };\n\n EpicsService.prototype.listRelatedUserStories = function(epic) {\n return this.resources.userstories.listInEpic(epic.get('id'));\n };\n\n EpicsService.prototype.createEpic = function(epicData, attachments) {\n epicData.project = this.projectService.project.get('id');\n return this.resources.epics.post(epicData).then((function(_this) {\n return function(epic) {\n var promises;\n promises = _.map(attachments.toJS(), function(attachment) {\n return _this.attachmentsService.upload(attachment.file, epic.get('id'), epic.get('project'), 'epic');\n });\n return Promise.all(promises).then(_this.fetchEpics.bind(_this, true));\n };\n })(this));\n };\n\n EpicsService.prototype.reorderEpic = function(epic, newIndex) {\n var afterDestination, beforeDestination, data, newOrder, orderList, previous, previousWithTheSameOrder, setOrders, withoutMoved;\n orderList = {};\n this._epics.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order');\n });\n withoutMoved = this.epics.filter((function(_this) {\n return function(it) {\n return it.get('id') !== epic.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n afterDestination = withoutMoved.slice(newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epics_order') + 1;\n orderList[epic.get('id')] = newOrder;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epics_order') === previous.get('epics_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epics_order')];\n };\n })(this)).toJS());\n afterDestination.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order') + 1;\n });\n this._epics = this._epics.map(function(it) {\n return it.set('epics_order', orderList[it.get('id')]);\n });\n this._epics = this._epics.sortBy(function(it) {\n return it.get('epics_order');\n });\n data = {\n epics_order: newOrder,\n version: epic.get('version')\n };\n return this.resources.epics.reorder(epic.get('id'), data, setOrders).then((function(_this) {\n return function(newEpic) {\n return _this._epics = _this._epics.map(function(it) {\n if (it.get('id') === newEpic.get('id')) {\n return newEpic;\n }\n return it;\n });\n };\n })(this));\n };\n\n EpicsService.prototype.reorderRelatedUserstory = function(epic, epicUserstories, userstory, newIndex) {\n var beforeDestination, data, epicId, newOrder, previous, previousWithTheSameOrder, setOrders, userstoryId, withoutMoved;\n withoutMoved = epicUserstories.filter((function(_this) {\n return function(it) {\n return it.get('id') !== userstory.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epic_order') + 1;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epic_order') === previous.get('epic_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epic_order')];\n };\n })(this)).toJS());\n data = {\n order: newOrder\n };\n epicId = epic.get('id');\n userstoryId = userstory.get('id');\n return this.resources.epics.reorderRelatedUserstory(epicId, userstoryId, data, setOrders).then((function(_this) {\n return function() {\n return _this.listRelatedUserStories(epic);\n };\n })(this));\n };\n\n EpicsService.prototype.replaceEpic = function(epic) {\n return this._epics = this._epics.map(function(it) {\n if (it.get('id') === epic.get('id')) {\n return epic;\n }\n return it;\n });\n };\n\n EpicsService.prototype.updateEpicStatus = function(epic, statusId) {\n var data;\n data = {\n status: statusId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n EpicsService.prototype.updateEpicAssignedTo = function(epic, userId) {\n var data;\n data = {\n assigned_to: userId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n return EpicsService;\n\n })();\n\n angular.module('taigaEpics').service('tgEpicsService', EpicsService);\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: related-userstories.controller.coffee\n */\n\n(function() {\n var RelatedUserStoriesController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserStoriesController = (function() {\n RelatedUserStoriesController.$inject = [\"tgProjectService\", \"tgEpicsService\"];\n\n function RelatedUserStoriesController(projectService, epicsService) {\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.sectionName = \"Epics\";\n this.showCreateRelatedUserstoriesLightbox = false;\n }\n\n RelatedUserStoriesController.prototype.showRelatedUserStoriesSection = function() {\n var ref;\n return this.projectService.hasPermission(\"view_epics\") || ((ref = this.userstories) != null ? ref.length : void 0) > 0;\n };\n\n RelatedUserStoriesController.prototype.userCanSort = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n RelatedUserStoriesController.prototype.loadRelatedUserstories = function() {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n RelatedUserStoriesController.prototype.reorderRelatedUserstory = function(us, newIndex) {\n return this.epicsService.reorderRelatedUserstory(this.epic, this.userstories, us, newIndex).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n return RelatedUserStoriesController;\n\n })();\n\n module.controller(\"RelatedUserStoriesCtrl\", RelatedUserStoriesController);\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: related-userstory-create.controller.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoriesCreateController = (function() {\n RelatedUserstoriesCreateController.$inject = [\"tgCurrentUserService\", \"tgResources\", \"$tgConfirm\", \"$tgAnalytics\"];\n\n function RelatedUserstoriesCreateController(currentUserService, rs, confirm, analytics) {\n this.currentUserService = currentUserService;\n this.rs = rs;\n this.confirm = confirm;\n this.analytics = analytics;\n this.projects = null;\n this.projectUserstories = Immutable.List();\n this.loading = false;\n }\n\n RelatedUserstoriesCreateController.prototype.loadProjects = function() {\n if (this.projects === null) {\n return this.projects = this.currentUserService.projects.get(\"all\");\n }\n };\n\n RelatedUserstoriesCreateController.prototype.filterUss = function(selectedProjectId, filterText) {\n var promise;\n promise = this.rs.userstories.listInAllProjects({\n project: selectedProjectId,\n q: filterText\n }, true).then((function(_this) {\n return function(data) {\n var excludeIds, filteredData;\n excludeIds = _this.epicUserstories.map(function(us) {\n return us.get('id');\n });\n filteredData = data.filter(function(us) {\n return excludeIds.indexOf(us.get('id')) === -1;\n });\n return _this.projectUserstories = filteredData;\n };\n })(this));\n return promise;\n };\n\n RelatedUserstoriesCreateController.prototype.saveRelatedUserStory = function(selectedUserstoryId, onSavedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateExistingUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setExistingUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onSavedRelatedUserstory) {\n onSavedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.addRelatedUserstory(epicId, selectedUserstoryId).then(onSuccess, onError);\n };\n\n RelatedUserstoriesCreateController.prototype.bulkCreateRelatedUserStories = function(selectedProjectId, userstoriesText, onCreatedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateNewUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setNewUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onCreatedRelatedUserstory) {\n onCreatedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.bulkCreateRelatedUserStories(epicId, selectedProjectId, userstoriesText).then(onSuccess, onError);\n };\n\n return RelatedUserstoriesCreateController;\n\n })();\n\n module.controller(\"RelatedUserstoriesCreateCtrl\", RelatedUserstoriesCreateController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstory-create.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateDirective, debounceLeading, module;\n\n module = angular.module('taigaEpics');\n\n debounceLeading = this.taiga.debounceLeading;\n\n RelatedUserstoriesCreateDirective = function(lightboxService1) {\n var link;\n this.lightboxService = lightboxService1;\n link = function(scope, el, attrs, ctrl) {\n var existingUserstoryForm, newUserstoryForm;\n newUserstoryForm = el.find(\".new-user-story-form\").checksley();\n existingUserstoryForm = el.find(\".existing-user-story-form\").checksley();\n ctrl.validateNewUserstoryForm = (function(_this) {\n return function() {\n return newUserstoryForm.validate();\n };\n })(this);\n ctrl.setNewUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return newUserstoryForm.setErrors(errors);\n };\n })(this);\n ctrl.validateExistingUserstoryForm = (function(_this) {\n return function() {\n return existingUserstoryForm.validate();\n };\n })(this);\n ctrl.setExistingUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return existingUserstoryForm.setErrors(errors);\n };\n })(this);\n scope.showLightbox = function(selectedProjectId) {\n ctrl.loadProjects();\n return scope.selectProject(selectedProjectId).then((function(_this) {\n return function() {\n return lightboxService.open(el.find(\".lightbox-create-related-user-stories\"));\n };\n })(this));\n };\n scope.closeLightbox = function() {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n scope.relatedUserstoriesText = \"\";\n return lightboxService.close(el.find(\".lightbox-create-related-user-stories\"));\n };\n scope.$watch('vm.project', function(project) {\n if (project != null) {\n return scope.selectedProject = project.get('id');\n }\n });\n scope.selectProject = function(selectedProjectId) {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n return ctrl.filterUss(selectedProjectId, scope.searchUserstory);\n };\n return scope.onUpdateSearchUserstory = debounceLeading(300, function() {\n scope.selectedUserstory = null;\n return ctrl.filterUss(scope.selectedProject, scope.searchUserstory);\n });\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstories-create/related-userstories-create.html\",\n controller: \"RelatedUserstoriesCreateCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n showCreateRelatedUserstoriesLightbox: \"=\",\n project: \"=\",\n epic: \"=\",\n epicUserstories: \"=\",\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoriesCreateDirective.$inject = [\"lightboxService\"];\n\n module.directive(\"tgRelatedUserstoriesCreate\", RelatedUserstoriesCreateDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstories-sortable.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesSortableDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoriesSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgRelatedUserstoriesSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('tg-related-userstory-row');\n }\n });\n drake.on('dragend', function(item) {\n var itemEl, newIndex, us;\n itemEl = $(item);\n us = itemEl.scope().us;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n us: us,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n RelatedUserstoriesSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n module.directive(\"tgRelatedUserstoriesSortable\", RelatedUserstoriesSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstories.directive.coffee\n */\n\n(function() {\n var RelatedUserStoriesDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserStoriesDirective = function() {\n return {\n templateUrl: \"epics/related-userstories/related-userstories.html\",\n controller: \"RelatedUserStoriesCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstories: '=',\n project: '=',\n epic: '='\n }\n };\n };\n\n RelatedUserStoriesDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstories\", RelatedUserStoriesDirective);\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: reñated-userstory-row.controller.coffee\n */\n\n(function() {\n var RelatedUserstoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoryRowController = (function() {\n RelatedUserstoryRowController.$inject = [\"tgAvatarService\", \"$translate\", \"$tgConfirm\", \"tgResources\"];\n\n function RelatedUserstoryRowController(avatarService, translate, confirm, rs) {\n this.avatarService = avatarService;\n this.translate = translate;\n this.confirm = confirm;\n this.rs = rs;\n }\n\n RelatedUserstoryRowController.prototype.setAvatarData = function() {\n var member;\n member = this.userstory.get('assigned_to_extra_info');\n return this.avatar = this.avatarService.getAvatar(member);\n };\n\n RelatedUserstoryRowController.prototype.getAssignedToFullNameDisplay = function() {\n if (this.userstory.get('assigned_to')) {\n return this.userstory.getIn(['assigned_to_extra_info', 'full_name_display']);\n }\n return this.translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\");\n };\n\n RelatedUserstoryRowController.prototype.onDeleteRelatedUserstory = function() {\n var message, title;\n title = this.translate.instant('EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY');\n message = this.translate.instant('EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY', {\n subject: this.userstory.get('subject')\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var epicId, onError, onSuccess, userstoryId;\n onError = function() {\n message = _this.translate.instant('EPIC.ERROR_UNLINK_RELATED_USERSTORY', {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n _this.loadRelatedUserstories();\n return askResponse.finish();\n };\n epicId = _this.epic.get('id');\n userstoryId = _this.userstory.get('id');\n return _this.rs.epics.deleteRelatedUserstory(epicId, userstoryId).then(onSuccess, onError);\n };\n })(this));\n };\n\n return RelatedUserstoryRowController;\n\n })();\n\n module.controller(\"RelatedUserstoryRowCtrl\", RelatedUserstoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstory-row.directive.coffee\n */\n\n(function() {\n var RelatedUserstoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoryRowDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.setAvatarData();\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstory-row/related-userstory-row.html\",\n controller: \"RelatedUserstoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstory: '=',\n epic: '=',\n project: '=',\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoryRowDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstoryRow\", RelatedUserstoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-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: history.controller.coffee\n */\n\n(function() {\n var CommentController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentController = (function() {\n CommentController.$inject = [\"tgCurrentUserService\", \"tgCheckPermissionsService\", \"tgLightboxFactory\"];\n\n function CommentController(currentUserService, permissionService, lightboxFactory) {\n this.currentUserService = currentUserService;\n this.permissionService = permissionService;\n this.lightboxFactory = lightboxFactory;\n this.hiddenDeletedComment = true;\n }\n\n CommentController.prototype.showDeletedComment = function() {\n return this.hiddenDeletedComment = false;\n };\n\n CommentController.prototype.hideDeletedComment = function() {\n return this.hiddenDeletedComment = true;\n };\n\n CommentController.prototype.checkCancelComment = function(event) {\n if (event.keyCode === 27) {\n return this.onEditMode({\n commentId: this.comment.id\n });\n }\n };\n\n CommentController.prototype.canEditDeleteComment = function() {\n if (this.currentUserService.getUser()) {\n this.user = this.currentUserService.getUser();\n return this.user.get('id') === this.comment.user.pk || this.permissionService.check('modify_project');\n }\n };\n\n CommentController.prototype.saveComment = function(text, cb) {\n return this.onEditComment({\n commentId: this.comment.id,\n commentData: text,\n callback: cb\n });\n };\n\n CommentController.prototype.displayCommentHistory = function() {\n return this.lightboxFactory.create('tg-lb-display-historic', {\n \"class\": \"lightbox lightbox-display-historic\",\n \"comment\": \"comment\",\n \"name\": \"name\",\n \"object\": \"object\"\n }, {\n \"comment\": this.comment,\n \"name\": this.name,\n \"object\": this.object\n });\n };\n\n return CommentController;\n\n })();\n\n module.controller(\"CommentCtrl\", CommentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comment.directive.coffee\n */\n\n(function() {\n var CommentDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentDirective = function() {\n return {\n scope: {\n name: \"@\",\n object: \"@\",\n comment: \"<\",\n type: \"<\",\n loading: \"<\",\n editing: \"<\",\n deleting: \"<\",\n objectId: \"<\",\n editMode: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onEditComment: \"&\"\n },\n templateUrl: \"history/comments/comment.html\",\n bindToController: true,\n controller: 'CommentCtrl',\n controllerAs: \"vm\"\n };\n };\n\n module.directive(\"tgComment\", CommentDirective);\n\n}).call(this);\n\n\n/*\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comments.controller.coffee\n */\n\n(function() {\n var CommentsController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentsController = (function() {\n CommentsController.$inject = [];\n\n function CommentsController() {}\n\n CommentsController.prototype.initializePermissions = function() {\n return this.canAddCommentPermission = 'comment_' + this.name;\n };\n\n return CommentsController;\n\n })();\n\n module.controller(\"CommentsCtrl\", CommentsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comments.directive.coffee\n */\n\n(function() {\n var CommentsDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentsDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initializePermissions();\n };\n return {\n scope: {\n type: \"<\",\n name: \"@\",\n object: \"@\",\n comments: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onAddComment: \"&\",\n onEditComment: \"&\",\n editMode: \"<\",\n loading: \"<\",\n deleting: \"<\",\n editing: \"<\",\n projectId: \"=\"\n },\n templateUrl: \"history/comments/comments.html\",\n bindToController: true,\n controller: 'CommentsCtrl',\n controllerAs: \"vm\",\n link: link\n };\n };\n\n module.directive(\"tgComments\", CommentsDirective);\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: history.controller.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricController, module;\n\n module = angular.module(\"taigaHistory\");\n\n LightboxDisplayHistoricController = (function() {\n LightboxDisplayHistoricController.$inject = [\"$tgResources\"];\n\n function LightboxDisplayHistoricController(rs) {\n this.rs = rs;\n }\n\n LightboxDisplayHistoricController.prototype._loadHistoric = function() {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.object;\n activityId = this.comment.id;\n return this.rs.history.getCommentHistory(type, objectId, activityId).then((function(_this) {\n return function(data) {\n return _this.commentHistoryEntries = data;\n };\n })(this));\n };\n\n return LightboxDisplayHistoricController;\n\n })();\n\n module.controller(\"LightboxDisplayHistoricCtrl\", LightboxDisplayHistoricController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comment.directive.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricDirective;\n\n LightboxDisplayHistoricDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._loadHistoric();\n return lightboxService.open(el);\n };\n return {\n scope: {},\n bindToController: {\n name: '=',\n object: '=',\n comment: '='\n },\n templateUrl: \"history/history-lightbox/comment-history-lightbox.html\",\n controller: \"LightboxDisplayHistoricCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n LightboxDisplayHistoricDirective.$inject = [\"lightboxService\"];\n\n angular.module('taigaHistory').directive(\"tgLbDisplayHistoric\", LightboxDisplayHistoricDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comment.directive.coffee\n */\n\n(function() {\n var HistoryEntryDirective;\n\n HistoryEntryDirective = function() {\n return {\n scope: {\n entry: \"<\"\n },\n templateUrl: \"history/history-lightbox/history-entry.html\"\n };\n };\n\n angular.module('taigaHistory').directive(\"tgHistoryEntry\", HistoryEntryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history-tabs.directive.coffee\n */\n\n(function() {\n var HistoryTabsDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryTabsDirective = function() {\n return {\n templateUrl: \"history/history-tabs/history-tabs.html\",\n scope: {\n showCommentTab: \"&\",\n showActivityTab: \"&\",\n onActiveComments: \"&\",\n onActiveActivities: \"&\",\n onOrderComments: \"&\",\n activeTab: \"<\",\n commentsNum: \"<\",\n activitiesNum: \"<\",\n onReverse: \"<\"\n }\n };\n };\n\n module.directive(\"tgHistoryTabs\", HistoryTabsDirective);\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: history.controller.coffee\n */\n\n(function() {\n var HistorySectionController, module;\n\n module = angular.module(\"taigaHistory\");\n\n HistorySectionController = (function() {\n HistorySectionController.$inject = [\"$tgResources\", \"$tgRepo\", \"$tgStorage\", \"tgProjectService\"];\n\n function HistorySectionController(rs, repo, storage, projectService) {\n this.rs = rs;\n this.repo = repo;\n this.storage = storage;\n this.projectService = projectService;\n this.editing = null;\n this.deleting = null;\n this.editMode = {};\n this.viewComments = true;\n this.reverse = this.storage.get(\"orderComments\");\n this._loadHistory();\n }\n\n HistorySectionController.prototype._loadHistory = function() {\n return this.rs.history.get(this.name, this.id).then((function(_this) {\n return function(history) {\n _this._getComments(history);\n return _this._getActivities(history);\n };\n })(this));\n };\n\n HistorySectionController.prototype._getComments = function(comments) {\n this.comments = _.filter(comments, function(item) {\n return item.comment !== \"\";\n });\n if (this.reverse) {\n this.comments - _.reverse(this.comments);\n }\n return this.commentsNum = this.comments.length;\n };\n\n HistorySectionController.prototype._getActivities = function(activities) {\n this.activities = _.filter(activities, function(item) {\n return Object.keys(item.values_diff).length > 0;\n });\n return this.activitiesNum = this.activities.length;\n };\n\n HistorySectionController.prototype.showHistorySection = function() {\n return this.showCommentTab() || this.showActivityTab();\n };\n\n HistorySectionController.prototype.showCommentTab = function() {\n return this.commentsNum > 0 || this.projectService.hasPermission(\"comment_\" + this.name);\n };\n\n HistorySectionController.prototype.showActivityTab = function() {\n return this.activitiesNum > 0;\n };\n\n HistorySectionController.prototype.toggleEditMode = function(commentId) {\n return this.editMode[commentId] = !this.editMode[commentId];\n };\n\n HistorySectionController.prototype.onActiveHistoryTab = function(active) {\n return this.viewComments = active;\n };\n\n HistorySectionController.prototype.deleteComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.deleting = commentId;\n return this.rs.history.deleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.deleting = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.editComment = function(commentId, comment) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.editComment(type, objectId, activityId, comment).then((function(_this) {\n return function() {\n _this._loadHistory();\n _this.toggleEditMode(commentId);\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.restoreDeletedComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.undeleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.addComment = function(cb) {\n return this.repo.save(this.type).then((function(_this) {\n return function() {\n _this._loadHistory();\n return cb();\n };\n })(this));\n };\n\n HistorySectionController.prototype.onOrderComments = function() {\n this.reverse = !this.reverse;\n this.storage.set(\"orderComments\", this.reverse);\n return this._loadHistory();\n };\n\n return HistorySectionController;\n\n })();\n\n module.controller(\"HistorySection\", HistorySectionController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history.directive.coffee\n */\n\n(function() {\n var HistorySectionDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistorySectionDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return scope.$on(\"object:updated\", function() {\n return ctrl._loadHistory(scope.type, scope.id);\n });\n };\n return {\n link: link,\n templateUrl: \"history/history.html\",\n controller: \"HistorySection\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: \"=\",\n name: \"@\",\n id: \"=\",\n projectId: \"=\"\n }\n };\n };\n\n HistorySectionDirective.$inject = [];\n\n module.directive(\"tgHistorySection\", HistorySectionDirective);\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: history.controller.coffee\n */\n\n(function() {\n var ActivitiesDiffController, module;\n\n module = angular.module(\"taigaHistory\");\n\n ActivitiesDiffController = (function() {\n ActivitiesDiffController.$inject = [];\n\n function ActivitiesDiffController() {}\n\n ActivitiesDiffController.prototype.diffTags = function() {\n if (this.type === 'tags') {\n this.diffRemoveTags = _.difference(this.diff[0], this.diff[1]).toString();\n return this.diffAddTags = _.difference(this.diff[1], this.diff[0]).toString();\n }\n };\n\n return ActivitiesDiffController;\n\n })();\n\n module.controller(\"ActivitiesDiffCtrl\", ActivitiesDiffController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history.directive.coffee\n */\n\n(function() {\n var HistoryDiffDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDiffDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.diffTags();\n };\n return {\n scope: {\n type: \"<\",\n diff: \"<\"\n },\n templateUrl: \"history/history/history-diff.html\",\n controller: \"ActivitiesDiffCtrl\",\n controllerAs: 'vm',\n bindToController: true,\n link: link\n };\n };\n\n module.directive(\"tgHistoryDiff\", HistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history.directive.coffee\n */\n\n(function() {\n var HistoryDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n scope: {\n activities: \"<\"\n },\n templateUrl: \"history/history/history.html\",\n link: link\n };\n };\n\n module.directive(\"tgHistory\", HistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 scope.vm.type = scope.type;\n return scope.vm.getDutyType = function() {\n if (scope.vm.duty) {\n if (scope.vm.duty.get('_name') === \"epics\") {\n return $translate.instant(\"COMMON.EPIC\");\n }\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 \"type\": \"@\"\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-2017 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, _getValidDutiesAndAttachProjectInfo, 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('project', project);\n duty = duty.set(\"_name\", objType);\n return duty;\n };\n })(this);\n _getValidDutiesAndAttachProjectInfo = function(duties, dutyType) {\n duties = duties.filter(function(duty) {\n return projectsById.get(String(duty.get('project')));\n });\n duties = duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, dutyType);\n });\n return duties;\n };\n assignedTo = workInProgress.get(\"assignedTo\");\n if (assignedTo.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"epics\"), \"epics\");\n assignedTo = assignedTo.set(\"epics\", _duties);\n }\n if (assignedTo.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"userStories\"), \"userstories\");\n assignedTo = assignedTo.set(\"userStories\", _duties);\n }\n if (assignedTo.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"tasks\"), \"tasks\");\n assignedTo = assignedTo.set(\"tasks\", _duties);\n }\n if (assignedTo.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"issues\"), \"issues\");\n assignedTo = assignedTo.set(\"issues\", _duties);\n }\n watching = workInProgress.get(\"watching\");\n if (watching.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"epics\"), \"epics\");\n watching = watching.set(\"epics\", _duties);\n }\n if (watching.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"userStories\"), \"userstories\");\n watching = watching.set(\"userStories\", _duties);\n }\n if (watching.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"tasks\"), \"tasks\");\n watching = watching.set(\"tasks\", _duties);\n }\n if (watching.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"issues\"), \"issues\");\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 assignedEpicsPromise, assignedIssuesPromise, assignedTasksPromise, assignedTo, assignedUserStoriesPromise, params_epics, params_issues, params_tasks, params_uss, projectsById, projectsPromise, watching, watchingEpicsPromise, 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_epics = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_uss = {\n is_closed: false,\n assigned_to: userId\n };\n params_tasks = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_issues = {\n status__is_closed: false,\n assigned_to: userId\n };\n assignedEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return assignedTo = assignedTo.set(\"epics\", epics);\n });\n assignedUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return assignedTo = assignedTo.set(\"userStories\", userstories);\n });\n assignedTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return assignedTo = assignedTo.set(\"tasks\", tasks);\n });\n assignedIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return assignedTo = assignedTo.set(\"issues\", issues);\n });\n params_epics = {\n status__is_closed: false,\n watchers: userId\n };\n params_uss = {\n is_closed: false,\n watchers: userId\n };\n params_tasks = {\n status__is_closed: false,\n watchers: userId\n };\n params_issues = {\n status__is_closed: false,\n watchers: userId\n };\n watching = Immutable.Map();\n watchingEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return watching = watching.set(\"epics\", epics);\n });\n watchingUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return watching = watching.set(\"userStories\", userstories);\n });\n watchingTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return watching = watching.set(\"tasks\", tasks);\n });\n watchingIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return watching = watching.set(\"issues\", issues);\n });\n workInProgress = Immutable.Map();\n return Promise.all([projectsPromise, assignedEpicsPromise, watchingEpicsPromise, assignedUserStoriesPromise, watchingUserStoriesPromise, assignedTasksPromise, watchingTasksPromise, assignedIssuesPromise, 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-2017 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) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n return taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\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\"];\n\n angular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 epics, issues, tasks, userStories;\n epics = workInProgress.get(\"assignedTo\").get(\"epics\");\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).concat(epics);\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 epics, issues, tasks, userStories;\n epics = workInProgress.get(\"watching\").get(\"epics\");\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).concat(epics);\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-2017 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-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: add-members.controller.coffee\n */\n\n(function() {\n var InviteMembersFormController, taiga;\n\n taiga = this.taiga;\n\n InviteMembersFormController = (function() {\n InviteMembersFormController.$inject = [\"tgProjectService\", \"$tgResources\", \"lightboxService\", \"$tgConfirm\", \"$rootScope\"];\n\n function InviteMembersFormController(projectService, rs, lightboxService, confirm, rootScope) {\n this.projectService = projectService;\n this.rs = rs;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.rootScope = rootScope;\n this.project = this.projectService.project;\n this.roles = this.projectService.project.get('roles');\n this.rolesValues = {};\n this.loading = false;\n this.defaultMaxInvites = 4;\n }\n\n InviteMembersFormController.prototype._areRolesValidated = function() {\n return Object.defineProperty(this, 'areRolesValidated', {\n get: (function(_this) {\n return function() {\n var roleIds;\n roleIds = _.filter(Object.values(_this.rolesValues), function(it) {\n return it;\n });\n return roleIds.length === _this.contactsToInvite.size + _this.emailsToInvite.size;\n };\n })(this)\n });\n };\n\n InviteMembersFormController.prototype._checkLimitMemberships = function() {\n var pendingMembersCount;\n if (this.project.get('max_memberships') === null) {\n this.membersLimit = this.defaultMaxInvites;\n } else {\n pendingMembersCount = Math.max(this.project.get('max_memberships') - this.project.get('total_memberships'), 0);\n this.membersLimit = Math.min(pendingMembersCount, this.defaultMaxInvites);\n }\n return this.showWarningMessage = this.membersLimit < this.defaultMaxInvites;\n };\n\n InviteMembersFormController.prototype.sendInvites = function() {\n this.setInvitedContacts = [];\n _.forEach(this.rolesValues, (function(_this) {\n return function(key, value) {\n return _this.setInvitedContacts.push({\n 'role_id': key,\n 'username': value\n });\n };\n })(this));\n this.loading = true;\n return this.rs.memberships.bulkCreateMemberships(this.project.get('id'), this.setInvitedContacts, this.inviteContactsMessage).then((function(_this) {\n return function(response) {\n return _this.projectService.fetchProject().then(function() {\n _this.loading = false;\n _this.lightboxService.closeAll();\n _this.rootScope.$broadcast(\"membersform:new:success\");\n return _this.confirm.notify('success');\n });\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n return InviteMembersFormController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"InviteMembersFormCtrl\", InviteMembersFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersFormDirective;\n\n InviteMembersFormDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._areRolesValidated();\n return ctrl._checkLimitMemberships();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/invite-members-form/invite-members-form.html\",\n controller: \"InviteMembersFormCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contactsToInvite: '<',\n emailsToInvite: '=',\n onDisplayContactList: '&',\n onRemoveInvitedContact: '&',\n onRemoveInvitedEmail: '&',\n onSendInvites: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgInviteMembersForm\", InviteMembersFormDirective);\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: add-members.controller.coffee\n */\n\n(function() {\n var AddMembersController, taiga;\n\n taiga = this.taiga;\n\n AddMembersController = (function() {\n AddMembersController.$inject = [\"tgUserService\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function AddMembersController(userService, currentUserService, projectService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n this.contactsToInvite = Immutable.List();\n this.emailsToInvite = Immutable.List();\n this.displayContactList = false;\n }\n\n AddMembersController.prototype._getContacts = function() {\n var excludeProjectId, userId;\n userId = this.currentUserService.getUser().get(\"id\");\n excludeProjectId = this.projectService.project.get(\"id\");\n return this.userService.getContacts(userId, excludeProjectId).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n AddMembersController.prototype._filterContacts = function(invited) {\n return this.contacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.get('id');\n };\n })(this));\n };\n\n AddMembersController.prototype.inviteSuggested = function(contact) {\n this.contactsToInvite = this.contactsToInvite.push(contact);\n this._filterContacts(contact);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeContact = function(invited) {\n this.contactsToInvite = this.contactsToInvite.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.id;\n };\n })(this));\n invited = Immutable.fromJS(invited);\n this.contacts = this.contacts.push(invited);\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.inviteEmail = function(email) {\n var emailData;\n emailData = Immutable.Map({\n 'email': email\n });\n this.emailsToInvite = this.emailsToInvite.push(emailData);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeEmail = function(invited) {\n this.emailsToInvite = this.emailsToInvite.filter((function(_this) {\n return function(email) {\n return email.get('email') !== invited.email;\n };\n })(this));\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.testEmptyContacts = function() {\n if (this.emailsToInvite.size + this.contactsToInvite.size === 0) {\n return this.displayContactList = false;\n }\n };\n\n return AddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"AddMembersCtrl\", AddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: add-member.directive.coffee\n */\n\n(function() {\n var LightboxAddMembersDirective;\n\n LightboxAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n lightboxService.open(el);\n return ctrl._getContacts();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/lightbox-add-members.html\",\n controller: \"AddMembersCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgLbAddMembers\", [\"lightboxService\", LightboxAddMembersDirective]);\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: suggest-add-members.controller.coffee\n */\n\n(function() {\n var SuggestAddMembersController, taiga;\n\n taiga = this.taiga;\n\n SuggestAddMembersController = (function() {\n SuggestAddMembersController.$inject = [];\n\n function SuggestAddMembersController() {\n this.contactQuery = \"\";\n }\n\n SuggestAddMembersController.prototype.isEmail = function() {\n return taiga.isEmail(this.contactQuery);\n };\n\n SuggestAddMembersController.prototype.filterContacts = function() {\n return this.filteredContacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('full_name_display').toLowerCase().includes(_this.contactQuery.toLowerCase()) || contact.get('username').toLowerCase().includes(_this.contactQuery.toLowerCase());\n };\n })(this)).slice(0, 12);\n };\n\n SuggestAddMembersController.prototype.setInvited = function(contact) {\n return this.onInviteSuggested({\n 'contact': contact\n });\n };\n\n return SuggestAddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"SuggestAddMembersCtrl\", SuggestAddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: suggest-add-member.directive.coffee\n */\n\n(function() {\n var SuggestAddMembersDirective;\n\n SuggestAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch(\"vm.contacts\", (function(_this) {\n return function(contacts) {\n if (contacts) {\n return ctrl.filterContacts();\n }\n };\n })(this));\n };\n return {\n scope: {},\n templateUrl: \"invite-members/suggest-add-members/suggest-add-members.html\",\n controller: \"SuggestAddMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contacts: '=',\n onInviteSuggested: '&',\n onInviteEmail: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgSuggestAddMembers\", [\"lightboxService\", SuggestAddMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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, $rootScope) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\");\n scope.vm.supportUrl = configService.get(\"supportUrl\");\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 scope.vm.sendFeedback = function() {\n return feedbackService.sendFeedback();\n };\n return scope.vm.userSettingsPlugins = _.filter($rootScope.userSettingsPlugins, {\n userMenu: true\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\", \"$rootScope\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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, config) {\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 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.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\n scope.vm.supportUrl = config.get(\"supportUrl\");\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.$on(\"$routeChangeSuccess\", function() {\n if (locationService.path() === \"/\") {\n return scope.vm.active = true;\n } else {\n return scope.vm.active = false;\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\", \"$tgConfig\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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.enableFilterByEpics = 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.showEpicsOnly = function() {\n if (this.type !== \"epic\") {\n this.type = \"epic\";\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.tabName = 'likes';\n this.enableFilterByAll = false;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = 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.tabName = 'upvotes';\n this.enableFilterByAll = true;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = true;\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.tabName = 'watchers';\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-2017 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-2017 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://tree.taiga.io/support/admin/import-export-projects/\"\n }, {\n url: \"https://tree.taiga.io/support/admin/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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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: blocked-project-explanation.directive.coffee\n */\n\n(function() {\n var BlockedProjectExplanationDirective;\n\n BlockedProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/project/blocked-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgBlockedProjectExplanation\", BlockedProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 ContactProjectButtonController;\n\n ContactProjectButtonController = (function() {\n ContactProjectButtonController.$inject = ['tgLightboxFactory'];\n\n function ContactProjectButtonController(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n ContactProjectButtonController.prototype.launchContactForm = function() {\n return this.lightboxFactory.create('tg-lb-contact-project', {\n \"class\": \"lightbox lightbox-contact-project e2e-lightbox-contact-project\",\n \"project\": \"project\"\n }, {\n \"project\": this.project\n });\n };\n\n return ContactProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectButtonCtrl\", ContactProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: contact-project-button.directive.coffee\n */\n\n(function() {\n var ContactProjectButtonDirective;\n\n ContactProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"ContactProjectButtonCtrl\",\n bindToController: {\n project: '=',\n layout: '@'\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/contact-project-button/contact-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgContactProjectButton\", ContactProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: lb-contact-team.controller.coffee\n */\n\n(function() {\n var ContactProjectLbController;\n\n ContactProjectLbController = (function() {\n ContactProjectLbController.$inject = [\"lightboxService\", \"tgResources\", \"$tgConfirm\"];\n\n function ContactProjectLbController(lightboxService, rs, confirm) {\n this.lightboxService = lightboxService;\n this.rs = rs;\n this.confirm = confirm;\n this.contact = {};\n }\n\n ContactProjectLbController.prototype.contactProject = function() {\n var message, project, promise;\n project = this.project.get('id');\n message = this.contact.message;\n promise = this.rs.projects.contactProject(project, message);\n this.sendingFeedback = true;\n return promise.then((function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.sendingFeedback = false;\n return _this.confirm.notify(\"success\");\n };\n })(this));\n };\n\n return ContactProjectLbController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectLbCtrl\", ContactProjectLbController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: lb-contact-team.directive.coffee\n */\n\n(function() {\n var ContactProjectLbDirective;\n\n ContactProjectLbDirective = function(lightboxService) {\n var link;\n this.inject = ['lightboxService'];\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n controller: \"ContactProjectLbCtrl\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/lb-contact-project/lb-contact-project.html\",\n link: link\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLbContactProject\", [\"lightboxService\", ContactProjectLbDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-2017 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 drake, itemEl, scroll;\n itemEl = null;\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).hasClass('list-itemtype-project');\n }\n });\n drake.on('dragend', function(item) {\n var i, index, len, project, sortData, sorted_project_ids, value;\n itemEl = $(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 scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\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-2017 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-2017 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-2017 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-2017 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: asana-import-project-form.controller.coffee\n */\n\n(function() {\n var AsanaImportProjectFormController;\n\n AsanaImportProjectFormController = (function() {\n AsanaImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function AsanaImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Asana\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"scrum\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n AsanaImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n AsanaImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n AsanaImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n AsanaImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return AsanaImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportProjectFormCtrl', AsanaImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import-project-form.directive.coffee\n */\n\n(function() {\n var AsanaImportProjectFormDirective;\n\n AsanaImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/asana-import/asana-import-project-form/asana-import-project-form.html\",\n controller: \"AsanaImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n AsanaImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImportProjectForm\", AsanaImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import.controller.coffee\n */\n\n(function() {\n var AsanaImportController;\n\n AsanaImportController = (function() {\n AsanaImportController.$inject = ['tgAsanaImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function AsanaImportController(asanaImportService, confirm, translate, importProjectService) {\n this.asanaImportService = asanaImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-asana';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.asanaImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.asanaImportService.projectUsers;\n };\n })(this));\n }\n\n AsanaImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-asana';\n return this.asanaImportService.fetchProjects();\n };\n\n AsanaImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-asana';\n this.project = project;\n this.fetchingUsers = true;\n return this.asanaImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n AsanaImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-asana';\n };\n\n AsanaImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-asana';\n };\n\n AsanaImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.asanaImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n AsanaImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return AsanaImportController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportCtrl', AsanaImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import.directive.coffee\n */\n\n(function() {\n var AsanaImportDirective;\n\n AsanaImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/asana-import/asana-import.html\",\n controller: \"AsanaImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n AsanaImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImport\", AsanaImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import.service.coffee\n */\n\n(function() {\n var AsanaImportService,\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 AsanaImportService = (function(superClass) {\n extend(AsanaImportService, superClass);\n\n AsanaImportService.$inject = ['tgResources', '$location'];\n\n function AsanaImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n AsanaImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n AsanaImportService.prototype.fetchProjects = function() {\n return this.resources.asanaImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n AsanaImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.asanaImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n AsanaImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.asanaImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n AsanaImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.asanaImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n AsanaImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.asanaImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return AsanaImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgAsanaImportService\", AsanaImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: create-project-form.controller.coffee\n */\n\n(function() {\n var CreatetProjectFormController;\n\n CreatetProjectFormController = (function() {\n CreatetProjectFormController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$projectUrl\", \"$location\", \"$tgNavUrls\", \"$tgAnalytics\"];\n\n function CreatetProjectFormController(currentUserService, projectsService, projectUrl, location, navUrls, analytics) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.projectUrl = projectUrl;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.projectForm = {\n is_private: false\n };\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n if (this.type === 'scrum') {\n this.projectForm.creation_template = 1;\n } else {\n this.projectForm.creation_template = 2;\n }\n }\n\n CreatetProjectFormController.prototype.submit = function() {\n this.formSubmitLoading = true;\n return this.projectsService.create(this.projectForm).then((function(_this) {\n return function(project) {\n _this.analytics.trackEvent(\"project\", \"create\", \"project creation\", {\n slug: project.get('slug'),\n id: project.get('id')\n });\n return _this.location.url(_this.projectUrl.get(project));\n };\n })(this));\n };\n\n CreatetProjectFormController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n CreatetProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n CreatetProjectFormController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n return CreatetProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('CreateProjectFormCtrl', CreatetProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: create-project-form.directive.coffee\n */\n\n(function() {\n var CreateProjectFormDirective;\n\n CreateProjectFormDirective = function() {\n return {\n templateUrl: \"projects/create/create-project-form/create-project-form.html\",\n controller: \"CreateProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCreateProjectForm\", CreateProjectFormDirective);\n\n}).call(this);\n\n(function() {\n var createProjectMembersRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectMembersRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n limitMembersPrivateProject: '=',\n limitMembersPublicProject: '='\n },\n templateUrl: \"projects/create/create-project-members-restrictions/create-project-members-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectMembersRestrictions', [createProjectMembersRestrictionsDirective]);\n\n}).call(this);\n\n(function() {\n var createProjectRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n canCreatePrivateProjects: '=',\n canCreatePublicProjects: '='\n },\n templateUrl: \"projects/create/create-project-restrictions/create-project-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectRestrictions', [createProjectRestrictionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 CreateProjectController;\n\n CreateProjectController = (function() {\n CreateProjectController.$inject = [\"tgAppMetaService\", \"$translate\", \"tgProjectService\", \"$location\", \"$tgAuth\"];\n\n function CreateProjectController(appMetaService, translate, projectService, location, authService) {\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n this.authService.refresh();\n this.displayScrumDesc = false;\n this.displayKanbanDesc = false;\n }\n\n CreateProjectController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\n };\n\n CreateProjectController.prototype.displayHelp = function(type, $event) {\n $event.stopPropagation();\n $event.preventDefault();\n if (type === 'scrum') {\n this.displayScrumDesc = !this.displayScrumDesc;\n }\n if (type === 'kanban') {\n return this.displayKanbanDesc = !this.displayKanbanDesc;\n }\n };\n\n return CreateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"CreateProjectCtrl\", CreateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 DuplicateProjectController;\n\n DuplicateProjectController = (function() {\n DuplicateProjectController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$tgLocation\", \"$tgNavUrls\"];\n\n function DuplicateProjectController(currentUserService, projectsService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.location = location;\n this.navUrls = navUrls;\n this.user = this.currentUserService.getUser();\n this.members = Immutable.List();\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n this.projectForm = {\n is_private: false\n };\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n DuplicateProjectController.prototype.refreshReferenceProject = function(slug) {\n return this.projectsService.getProjectBySlug(slug).then((function(_this) {\n return function(project) {\n _this.referenceProject = project;\n _this.members = project.get('members').filter(function(it) {\n return it.get('id') !== _this.user.get('id');\n });\n _this.invitedMembers = _this.members.map(function(it) {\n return it.get('id');\n });\n return _this.checkUsersLimit();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.toggleInvitedMember = function(member) {\n if (this.invitedMembers.includes(member)) {\n this.invitedMembers = this.invitedMembers.filter(function(it) {\n return it !== member;\n });\n } else {\n this.invitedMembers = this.invitedMembers.push(member);\n }\n return this.checkUsersLimit();\n };\n\n DuplicateProjectController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.invitedMembers.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.invitedMembers.size + 1);\n };\n\n DuplicateProjectController.prototype.submit = function() {\n var data, projectId;\n projectId = this.referenceProject.get('id');\n data = this.projectForm;\n data.users = this.invitedMembers;\n this.formSubmitLoading = true;\n return this.projectsService.duplicate(projectId, data).then((function(_this) {\n return function(newProject) {\n _this.formSubmitLoading = false;\n _this.location.path(_this.navUrls.resolve(\"project\", {\n project: newProject.data.slug\n }));\n return _this.currentUserService.loadProjects();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid && this.limitMembersPrivateProject.valid;\n } else {\n return this.canCreatePublicProjects.valid && this.limitMembersPublicProject.valid;\n }\n };\n\n DuplicateProjectController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n DuplicateProjectController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n return DuplicateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"DuplicateProjectCtrl\", DuplicateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: duplicate-project.directive.coffee\n */\n\n(function() {\n var DuplicateProjectDirective;\n\n DuplicateProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/duplicate/duplicate-project.html\",\n controller: \"DuplicateProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n DuplicateProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgDuplicateProject\", DuplicateProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import-project-form.controller.coffee\n */\n\n(function() {\n var GithubImportProjectFormController;\n\n GithubImportProjectFormController = (function() {\n GithubImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function GithubImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Github\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"kanban\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n GithubImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n GithubImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n GithubImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n GithubImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return GithubImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportProjectFormCtrl', GithubImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import-project-form.directive.coffee\n */\n\n(function() {\n var GithubImportProjectFormDirective;\n\n GithubImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/github-import/github-import-project-form/github-import-project-form.html\",\n controller: \"GithubImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n GithubImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImportProjectForm\", GithubImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import.controller.coffee\n */\n\n(function() {\n var GithubImportController;\n\n GithubImportController = (function() {\n GithubImportController.$inject = ['tgGithubImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function GithubImportController(githubImportService, confirm, translate, importProjectService) {\n this.githubImportService = githubImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-github';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.githubImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.githubImportService.projectUsers;\n };\n })(this));\n }\n\n GithubImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-github';\n return this.githubImportService.fetchProjects();\n };\n\n GithubImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-github';\n this.project = project;\n this.fetchingUsers = true;\n return this.githubImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n GithubImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-github';\n };\n\n GithubImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-github';\n };\n\n GithubImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.githubImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n GithubImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return GithubImportController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportCtrl', GithubImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import.directive.coffee\n */\n\n(function() {\n var GithubImportDirective;\n\n GithubImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/github-import/github-import.html\",\n controller: \"GithubImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n GithubImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImport\", GithubImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import.service.coffee\n */\n\n(function() {\n var GithubImportService,\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 GithubImportService = (function(superClass) {\n extend(GithubImportService, superClass);\n\n GithubImportService.$inject = ['tgResources'];\n\n function GithubImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n GithubImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n GithubImportService.prototype.fetchProjects = function() {\n return this.resources.githubImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n GithubImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.githubImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n GithubImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.githubImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n GithubImportService.prototype.getAuthUrl = function(callbackUri) {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.githubImporter.getAuthUrl(callbackUri).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n GithubImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.githubImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return GithubImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgGithubImportService\", GithubImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-members.controller.coffee\n */\n\n(function() {\n var ImportProjectMembersController;\n\n ImportProjectMembersController = (function() {\n ImportProjectMembersController.$inject = ['tgCurrentUserService', 'tgUserService'];\n\n function ImportProjectMembersController(currentUserService, userService) {\n this.currentUserService = currentUserService;\n this.userService = userService;\n this.selectImportUserLightbox = false;\n this.warningImportUsers = false;\n this.displayEmailSelector = true;\n this.cancelledUsers = Immutable.List();\n this.selectedUsers = Immutable.List();\n this.selectableUsers = Immutable.List();\n this.userContacts = Immutable.List();\n }\n\n ImportProjectMembersController.prototype.fetchUser = function() {\n this.currentUser = this.currentUserService.getUser();\n return this.userService.getContacts(this.currentUser.get('id')).then((function(_this) {\n return function(userContacts) {\n _this.userContacts = userContacts;\n return _this.refreshSelectableUsers();\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.searchUser = function(user) {\n this.selectImportUserLightbox = true;\n return this.searchingUser = user;\n };\n\n ImportProjectMembersController.prototype.beforeSubmitUsers = function() {\n if (this.selectedUsers.size !== this.members.size) {\n return this.warningImportUsers = true;\n } else {\n return this.submit();\n }\n };\n\n ImportProjectMembersController.prototype.confirmUser = function(externalUser, taigaUser) {\n var user;\n this.selectImportUserLightbox = false;\n user = Immutable.Map();\n user = user.set('user', externalUser);\n user = user.set('taigaUser', taigaUser);\n this.selectedUsers = this.selectedUsers.push(user);\n this.discardSuggestedUser(externalUser);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.unselectUser = function(user) {\n var index;\n index = this.selectedUsers.findIndex(function(it) {\n return it.getIn(['user', 'id']) === user.get('id');\n });\n this.selectedUsers = this.selectedUsers[\"delete\"](index);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.discardSuggestedUser = function(member) {\n return this.cancelledUsers = this.cancelledUsers.push(member.get('id'));\n };\n\n ImportProjectMembersController.prototype.getSelectedMember = function(member) {\n return this.selectedUsers.find(function(it) {\n return it.getIn(['user', 'id']) === member.get('id');\n });\n };\n\n ImportProjectMembersController.prototype.isMemberSelected = function(member) {\n return !!this.getSelectedMember(member);\n };\n\n ImportProjectMembersController.prototype.getUser = function(user) {\n var userSelected;\n userSelected = this.getSelectedMember(user);\n if (userSelected) {\n return userSelected.get('taigaUser');\n } else {\n return null;\n }\n };\n\n ImportProjectMembersController.prototype.submit = function() {\n var users;\n this.warningImportUsers = false;\n users = Immutable.Map();\n this.selectedUsers.map(function(it) {\n var id;\n id = '';\n if (_.isString(it.get('taigaUser'))) {\n id = it.get('taigaUser');\n } else {\n id = it.getIn(['taigaUser', 'id']);\n }\n return users = users.set(it.getIn(['user', 'id']), id);\n });\n return this.onSubmit({\n users: users\n });\n };\n\n ImportProjectMembersController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size + 1);\n };\n\n ImportProjectMembersController.prototype.showSuggestedMatch = function(member) {\n return member.get('user') && this.cancelledUsers.indexOf(member.get('id')) === -1 && !this.isMemberSelected(member);\n };\n\n ImportProjectMembersController.prototype.getDistinctSelectedTaigaUsers = function() {\n var ids, users;\n ids = [];\n users = this.selectedUsers.filter(function(it) {\n var id;\n id = it.getIn(['taigaUser', 'id']);\n if (ids.indexOf(id) === -1) {\n ids.push(id);\n return true;\n }\n return false;\n });\n return users.filter((function(_this) {\n return function(it) {\n return it.getIn(['taigaUser', 'id']) !== _this.currentUser.get('id');\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.refreshSelectableUsers = function() {\n var users;\n this.importMoreUsersDisabled = this.isImportMoreUsersDisabled();\n if (this.importMoreUsersDisabled) {\n users = this.getDistinctSelectedTaigaUsers();\n this.selectableUsers = users.map(function(it) {\n return it.get('taigaUser');\n });\n this.displayEmailSelector = false;\n } else {\n this.selectableUsers = this.userContacts;\n this.displayEmailSelector = true;\n }\n return this.selectableUsers = this.selectableUsers.push(this.currentUser);\n };\n\n ImportProjectMembersController.prototype.isImportMoreUsersDisabled = function() {\n var total, users;\n users = this.getDistinctSelectedTaigaUsers();\n total = users.size + 2;\n if (this.project.get('is_private')) {\n return !this.currentUserService.canAddMembersPrivateProject(total).valid;\n } else {\n return !this.currentUserService.canAddMembersPublicProject(total).valid;\n }\n };\n\n return ImportProjectMembersController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectMembersCtrl', ImportProjectMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-form.directive.coffee\n */\n\n(function() {\n var ImportProjectMembersDirective;\n\n ImportProjectMembersDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n ctrl.fetchUser();\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/import-project-members/import-project-members.html\",\n controller: \"ImportProjectMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSubmit: '&',\n platform: '@',\n logo: '@',\n onCancel: '&'\n }\n };\n };\n\n ImportProjectMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectMembers\", ImportProjectMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-selector.controller.coffee\n */\n\n(function() {\n var ImportProjectSelectorController;\n\n ImportProjectSelectorController = (function() {\n function ImportProjectSelectorController() {}\n\n ImportProjectSelectorController.prototype.selectProject = function(project) {\n return this.onSelectProject({\n project: Immutable.fromJS(project)\n });\n };\n\n return ImportProjectSelectorController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectSelectorCtrl', ImportProjectSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-selector.directive.coffee\n */\n\n(function() {\n var ImportProjectSelectorDirective;\n\n ImportProjectSelectorDirective = function() {\n return {\n templateUrl: \"projects/create/import-project-selector/import-project-selector.html\",\n controller: \"ImportProjectSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n projects: '<',\n onCancel: '&',\n onSelectProject: '&',\n logo: '@',\n noProjectsMsg: '@',\n search: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectSelector\", ImportProjectSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.controller.coffee\n */\n\n(function() {\n var ImportTaigaController;\n\n ImportTaigaController = (function() {\n ImportTaigaController.$inject = ['$tgConfirm', '$tgResources', 'tgImportProjectService', '$translate', '$tgAnalytics'];\n\n function ImportTaigaController(confirm, rs, importProjectService, translate, analytics) {\n this.confirm = confirm;\n this.rs = rs;\n this.importProjectService = importProjectService;\n this.translate = translate;\n this.analytics = analytics;\n }\n\n ImportTaigaController.prototype.importTaiga = function(files) {\n var file, loader, promise;\n this.analytics.trackEvent(\"import\", \"taiga\", \"Start import from taiga\", 1);\n file = files[0];\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.rs.projects[\"import\"](file, loader.update);\n this.importProjectService.importPromise(promise)[\"finally\"]((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n return ImportTaigaController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportTaigaCtrl\", ImportTaigaController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-taiga.directive.coffee\n */\n\n(function() {\n var ImportTaigaDirective;\n\n ImportTaigaDirective = function() {\n return {\n templateUrl: \"projects/create/import-taiga/import-taiga.html\",\n controller: \"ImportTaigaCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportTaiga\", ImportTaigaDirective);\n\n}).call(this);\n\n(function() {\n var LbImportErrorDirective;\n\n LbImportErrorDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs) {\n lightboxService.open(el);\n return scope.close = function() {\n lightboxService.close(el);\n };\n };\n return {\n templateUrl: \"projects/create/import/import-project-error-lb.html\",\n link: link\n };\n };\n\n LbImportErrorDirective.$inject = [\"lightboxService\"];\n\n angular.module(\"taigaProjects\").directive(\"tgLbImportError\", LbImportErrorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.controller.coffee\n */\n\n(function() {\n var ImportProjectController;\n\n ImportProjectController = (function() {\n ImportProjectController.$inject = ['tgTrelloImportService', 'tgJiraImportService', 'tgGithubImportService', 'tgAsanaImportService', '$location', '$window', '$routeParams', '$tgNavUrls', '$tgConfig', '$tgConfirm', '$tgAnalytics'];\n\n function ImportProjectController(trelloService, jiraService, githubService, asanaService, location, window, routeParams, tgNavUrls, config, confirm, analytics) {\n this.trelloService = trelloService;\n this.jiraService = jiraService;\n this.githubService = githubService;\n this.asanaService = asanaService;\n this.location = location;\n this.window = window;\n this.routeParams = routeParams;\n this.tgNavUrls = tgNavUrls;\n this.config = config;\n this.confirm = confirm;\n this.analytics = analytics;\n }\n\n ImportProjectController.prototype.start = function() {\n var asanaOauthToken, githubOauthToken, jiraOauthToken, jiraOauthVerifier, locationSearch, trelloOauthToken;\n this.token = null;\n this.from = this.routeParams.platform;\n locationSearch = this.location.search();\n if (this.from) {\n this.analytics.trackEvent(\"import\", this.from, \"Start import from \" + this.from, 1);\n }\n if (this.from === \"asana\") {\n asanaOauthToken = locationSearch.code;\n if (locationSearch.code) {\n asanaOauthToken = locationSearch.code;\n return this.asanaService.authorize(asanaOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: encodeURIComponent(JSON.stringify(token))\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = JSON.parse(decodeURIComponent(locationSearch.token));\n this.asanaService.setToken(this.token);\n }\n }\n if (this.from === 'trello') {\n if (locationSearch.oauth_verifier) {\n trelloOauthToken = locationSearch.oauth_verifier;\n return this.trelloService.authorize(trelloOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.trelloService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"github\") {\n if (locationSearch.code) {\n githubOauthToken = locationSearch.code;\n return this.githubService.authorize(githubOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.githubService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"jira\") {\n jiraOauthToken = locationSearch.oauth_token;\n if (jiraOauthToken) {\n jiraOauthVerifier = locationSearch.oauth_verifier;\n return this.jiraService.authorize(jiraOauthVerifier).then(((function(_this) {\n return function(data) {\n return _this.location.search({\n token: data.token,\n url: data.url\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = locationSearch.token;\n return this.jiraService.setToken(locationSearch.token, locationSearch.url);\n }\n }\n };\n\n ImportProjectController.prototype.select = function(from) {\n var callbackUri;\n if (from === \"trello\") {\n return this.trelloService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"jira\") {\n return this.jiraService.getAuthUrl(this.jiraUrl).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this), (function(_this) {\n return function(err) {\n return _this.confirm.notify('error', err);\n };\n })(this));\n } else if (from === \"github\") {\n callbackUri = this.location.absUrl() + \"/github\";\n return this.githubService.getAuthUrl(callbackUri).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"asana\") {\n return this.asanaService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else {\n return this.from = from;\n }\n };\n\n ImportProjectController.prototype.unfoldOptions = function(options) {\n return this.unfoldedOptions = options;\n };\n\n ImportProjectController.prototype.isActiveImporter = function(importer) {\n if (this.config.get('importers').indexOf(importer) === -1) {\n return false;\n }\n return true;\n };\n\n ImportProjectController.prototype.cancelCurrentImport = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project-import'));\n };\n\n ImportProjectController.prototype.backToCreate = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project'));\n };\n\n return ImportProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportProjectCtrl\", ImportProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.directive.coffee\n */\n\n(function() {\n var ImportProjectDirective;\n\n ImportProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return ctrl.start();\n };\n return {\n link: link,\n templateUrl: \"projects/create/import/import-project.html\",\n controller: \"ImportProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancelImport: '&'\n }\n };\n };\n\n ImportProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProject\", ImportProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.service.coffee\n */\n\n(function() {\n var ImportProjectService,\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 ImportProjectService = (function(superClass) {\n extend(ImportProjectService, superClass);\n\n ImportProjectService.$inject = ['tgCurrentUserService', '$tgAuth', 'tgLightboxFactory', '$translate', '$tgConfirm', '$location', '$tgNavUrls'];\n\n function ImportProjectService(currentUserService, tgAuth, lightboxFactory, translate, confirm, location, tgNavUrls) {\n this.currentUserService = currentUserService;\n this.tgAuth = tgAuth;\n this.lightboxFactory = lightboxFactory;\n this.translate = translate;\n this.confirm = confirm;\n this.location = location;\n this.tgNavUrls = tgNavUrls;\n }\n\n ImportProjectService.prototype.importPromise = function(promise) {\n return promise.then(this.importSuccess.bind(this), this.importError.bind(this));\n };\n\n ImportProjectService.prototype.importSuccess = function(result) {\n var promise;\n promise = this.currentUserService.loadProjects();\n promise.then((function(_this) {\n return function() {\n var ctx, message, msg, title;\n if (result.status === 202) {\n title = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE');\n message = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE');\n _this.location.path(_this.tgNavUrls.resolve('home'));\n return _this.confirm.success(title, message);\n } else {\n ctx = {\n project: result.data.slug\n };\n _this.location.path(_this.tgNavUrls.resolve('project-admin-project-profile-details', ctx));\n msg = _this.translate.instant('PROJECT.IMPORT.SYNC_SUCCESS');\n return _this.confirm.notify('success', msg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.importError = function(result) {\n var promise;\n promise = this.tgAuth.refresh();\n promise.then((function(_this) {\n return function() {\n var errorMsg, ref, restrictionError;\n restrictionError = _this.getRestrictionError(result);\n if (restrictionError) {\n return _this.lightboxFactory.create('tg-lb-import-error', {\n \"class\": 'lightbox lightbox-import-error'\n }, restrictionError);\n } else {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {\n error_message: result.data._error_message\n });\n }\n return _this.confirm.notify(\"error\", errorMsg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.getRestrictionError = function(result) {\n var errorKey, maxMemberships, membersError, privateError, publicError, user;\n if (result.headers) {\n errorKey = '';\n user = this.currentUserService.getUser();\n maxMemberships = null;\n if (result.headers.isPrivate) {\n privateError = !this.currentUserService.canCreatePrivateProjects().valid;\n if (user.get('max_memberships_private_projects') !== null && result.headers.memberships >= user.get('max_memberships_private_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (privateError && membersError) {\n errorKey = 'private-space-members';\n maxMemberships = user.get('max_memberships_private_projects');\n } else if (privateError) {\n errorKey = 'private-space';\n } else if (membersError) {\n errorKey = 'private-members';\n maxMemberships = user.get('max_memberships_private_projects');\n }\n } else {\n publicError = !this.currentUserService.canCreatePublicProjects().valid;\n if (user.get('max_memberships_public_projects') !== null && result.headers.memberships >= user.get('max_memberships_public_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (publicError && membersError) {\n errorKey = 'public-space-members';\n maxMemberships = user.get('max_memberships_public_projects');\n } else if (publicError) {\n errorKey = 'public-space';\n } else if (membersError) {\n errorKey = 'public-members';\n maxMemberships = user.get('max_memberships_public_projects');\n }\n }\n if (!errorKey) {\n return false;\n }\n return {\n key: errorKey,\n values: {\n max_memberships: maxMemberships,\n members: result.headers.memberships\n }\n };\n } else {\n return false;\n }\n };\n\n return ImportProjectService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgImportProjectService\", ImportProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: invite-members.controller.coffee\n */\n\n(function() {\n var InviteMembersController;\n\n InviteMembersController = (function() {\n function InviteMembersController() {}\n\n InviteMembersController.$inject = [];\n\n InviteMembersController.prototype.isDisabled = function(id) {\n return this.invitedMembers.indexOf(id) === -1;\n };\n\n return InviteMembersController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"InviteMembersCtrl\", InviteMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersDirective;\n\n InviteMembersDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/invite-members/invite-members.html\",\n controller: \"InviteMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n invitedMembers: '<',\n members: '<',\n onToggleInvitedMember: '&'\n }\n };\n };\n\n InviteMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgInviteMembers\", InviteMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: single-member.directive.coffee\n */\n\n(function() {\n var SingleMemberDirective;\n\n SingleMemberDirective = function() {\n return {\n templateUrl: \"projects/create/invite-members/single-member/single-member.html\",\n scope: {\n disabled: \"<\",\n avatar: \"=\"\n }\n };\n };\n\n SingleMemberDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgSingleMember\", SingleMemberDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import-project-form.controller.coffee\n */\n\n(function() {\n var JiraImportProjectFormController;\n\n JiraImportProjectFormController = (function() {\n JiraImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function JiraImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (this.projectForm.importer_type === \"agile\") {\n this.projectForm.project_type = null;\n } else {\n this.projectForm.project_type = \"scrum\";\n }\n this.projectForm.create_subissues = true;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n JiraImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n JiraImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n JiraImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n JiraImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return JiraImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportProjectFormCtrl', JiraImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import-project-form.directive.coffee\n */\n\n(function() {\n var JiraImportProjectFormDirective;\n\n JiraImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/jira-import/jira-import-project-form/jira-import-project-form.html\",\n controller: \"JiraImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n JiraImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImportProjectForm\", JiraImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import.controller.coffee\n */\n\n(function() {\n var JiraImportController;\n\n JiraImportController = (function() {\n JiraImportController.$inject = ['tgJiraImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function JiraImportController(jiraImportService, confirm, translate, importProjectService) {\n this.jiraImportService = jiraImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-jira';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.jiraImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.jiraImportService.projectUsers;\n };\n })(this));\n }\n\n JiraImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-jira';\n return this.jiraImportService.fetchProjects();\n };\n\n JiraImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-jira';\n this.project = project;\n this.fetchingUsers = true;\n return this.jiraImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n JiraImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-jira';\n };\n\n JiraImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-jira';\n };\n\n JiraImportController.prototype.startImport = function(users) {\n var loader, projectType, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n projectType = this.project.get('project_type');\n if (projectType === \"issues\" && this.project.get('create_subissues')) {\n projectType = \"issues-with-subissues\";\n }\n promise = this.jiraImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), projectType, this.project.get('importer_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n JiraImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return JiraImportController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportCtrl', JiraImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import.directive.coffee\n */\n\n(function() {\n var JiraImportDirective;\n\n JiraImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/jira-import/jira-import.html\",\n controller: \"JiraImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n JiraImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImport\", JiraImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import.service.coffee\n */\n\n(function() {\n var JiraImportService,\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 JiraImportService = (function(superClass) {\n extend(JiraImportService, superClass);\n\n JiraImportService.$inject = ['tgResources', '$location'];\n\n function JiraImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n JiraImportService.prototype.setToken = function(token, url) {\n this.token = token;\n return this.url = url;\n };\n\n JiraImportService.prototype.fetchProjects = function() {\n return this.resources.jiraImporter.listProjects(this.url, this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n JiraImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.jiraImporter.listUsers(this.url, this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n JiraImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n return this.resources.jiraImporter.importProject(this.url, this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType);\n };\n\n JiraImportService.prototype.getAuthUrl = function(url) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.getAuthUrl(url).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n }, function(err) {\n return reject(err.data._error_message);\n });\n };\n })(this));\n };\n\n JiraImportService.prototype.authorize = function(oauth_verifier) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.authorize(oauth_verifier).then((function(response) {\n _this.token = response.data.token;\n _this.url = response.data.url;\n return resolve(response.data);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return JiraImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgJiraImportService\", JiraImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import-project-members.controller.coffee\n */\n\n(function() {\n var SelectImportUserLightboxCtrl;\n\n SelectImportUserLightboxCtrl = (function() {\n SelectImportUserLightboxCtrl.$inject = [];\n\n function SelectImportUserLightboxCtrl() {}\n\n SelectImportUserLightboxCtrl.prototype.start = function() {\n this.mode = 'search';\n return this.invalid = false;\n };\n\n SelectImportUserLightboxCtrl.prototype.assignUser = function() {\n return this.onSelectUser({\n user: this.user,\n taigaUser: this.userEmail\n });\n };\n\n SelectImportUserLightboxCtrl.prototype.selectUser = function(taigaUser) {\n return this.onSelectUser({\n user: this.user,\n taigaUser: Immutable.fromJS(taigaUser)\n });\n };\n\n return SelectImportUserLightboxCtrl;\n\n })();\n\n angular.module('taigaProjects').controller('SelectImportUserLightboxCtrl', SelectImportUserLightboxCtrl);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: select-import-user-lightbox.directive.coffee\n */\n\n(function() {\n var SelectImportUserLightboxDirective;\n\n SelectImportUserLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('vm.visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n ctrl.start();\n return lightboxService.open(el, null, scope.vm.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el).then(function() {\n ctrl.userEmail = '';\n return ctrl.usersSearch = '';\n });\n }\n });\n };\n return {\n controller: \"SelectImportUserLightboxCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n user: '<',\n visible: '<',\n onClose: '&',\n onSelectUser: '&',\n selectableUsers: '<',\n isPrivate: '<',\n limitMembersPrivateProject: '<',\n limitMembersPublicProject: '<',\n displayEmailSelector: '<'\n },\n templateUrl: 'projects/create/select-import-user-lightbox/select-import-user-lightbox.html',\n link: link\n };\n };\n\n SelectImportUserLightboxDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgSelectImportUserLightbox\", SelectImportUserLightboxDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import-project-form.controller.coffee\n */\n\n(function() {\n var TrelloImportProjectFormController;\n\n TrelloImportProjectFormController = (function() {\n TrelloImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function TrelloImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Trello\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n TrelloImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n TrelloImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n TrelloImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n TrelloImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return TrelloImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportProjectFormCtrl', TrelloImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import-project-form.directive.coffee\n */\n\n(function() {\n var TrelloImportProjectFormDirective;\n\n TrelloImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/trello-import/trello-import-project-form/trello-import-project-form.html\",\n controller: \"TrelloImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n TrelloImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImportProjectForm\", TrelloImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import.controller.coffee\n */\n\n(function() {\n var TrelloImportController;\n\n TrelloImportController = (function() {\n TrelloImportController.$inject = ['tgTrelloImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function TrelloImportController(trelloImportService, confirm, translate, importProjectService) {\n this.trelloImportService = trelloImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.trelloImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.trelloImportService.projectUsers;\n };\n })(this));\n }\n\n TrelloImportController.prototype.startProjectSelector = function() {\n return this.trelloImportService.fetchProjects().then((function(_this) {\n return function() {\n return _this.step = 'project-select-trello';\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-trello';\n this.project = project;\n this.fetchingUsers = true;\n return this.trelloImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-trello';\n };\n\n TrelloImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-trello';\n };\n\n TrelloImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.trelloImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n TrelloImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return TrelloImportController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportCtrl', TrelloImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import.directive.coffee\n */\n\n(function() {\n var TrelloImportDirective;\n\n TrelloImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/trello-import/trello-import.html\",\n controller: \"TrelloImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n TrelloImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImport\", TrelloImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import.service.coffee\n */\n\n(function() {\n var TrelloImportService,\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 TrelloImportService = (function(superClass) {\n extend(TrelloImportService, superClass);\n\n TrelloImportService.$inject = ['tgResources'];\n\n function TrelloImportService(resources) {\n this.resources = resources;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n TrelloImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n TrelloImportService.prototype.fetchProjects = function() {\n return this.resources.trelloImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n TrelloImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.trelloImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n TrelloImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n return this.resources.trelloImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate);\n };\n\n TrelloImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.trelloImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n TrelloImportService.prototype.authorize = function(verifyCode) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.trelloImporter.authorize(verifyCode).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return TrelloImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgTrelloImportService\", TrelloImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: warning-user-import.directive.coffee\n */\n\n(function() {\n var WarningUserImportDirective;\n\n WarningUserImportDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n return {\n link: function(scope, el, attr) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n return lightboxService.open(el, scope.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el);\n }\n });\n },\n templateUrl: \"projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html\",\n scope: {\n visible: '<',\n onClose: '&',\n onConfirm: '&'\n }\n };\n };\n\n WarningUserImportDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgWarningUserImportLightbox\", WarningUserImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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\"];\n\n function ProjectsListingController(currentUserService) {\n this.currentUserService = currentUserService;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\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-2017 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 this.routeParams = routeParams;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\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() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\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-2017 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\"];\n\n function ProjectsService(rs, projectUrl) {\n this.rs = rs;\n this.projectUrl = projectUrl;\n }\n\n ProjectsService.prototype.create = function(data) {\n return this.rs.projects.create(data);\n };\n\n ProjectsService.prototype.duplicate = function(projectId, data) {\n return this.rs.projects.duplicate(projectId, data);\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 url;\n url = this.projectUrl.get(project.toJS());\n project = project.set(\"url\", url);\n return project;\n };\n\n ProjectsService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.rs.projects.bulkUpdateOrder(sortData);\n };\n\n ProjectsService.prototype.transferValidateToken = function(projectId, token) {\n return this.rs.projects.transferValidateToken(projectId, token);\n };\n\n ProjectsService.prototype.transferAccept = function(projectId, token, reason) {\n return this.rs.projects.transferAccept(projectId, token, reason);\n };\n\n ProjectsService.prototype.transferReject = function(projectId, token, reason) {\n return this.rs.projects.transferReject(projectId, token, reason);\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-2017 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: cant-own-project-explanation.directive.coffee\n */\n\n(function() {\n var CantOwnProjectExplanationDirective;\n\n CantOwnProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/transfer/cant-own-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCantOwnProjectExplanation\", CantOwnProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProject, module;\n\n module = angular.module('taigaProjects');\n\n TransferProject = (function() {\n TransferProject.$inject = [\"$routeParams\", \"tgProjectsService\", \"$location\", \"$tgAuth\", \"tgCurrentUserService\", \"$tgNavUrls\", \"$translate\", \"$tgConfirm\", \"tgErrorHandlingService\"];\n\n function TransferProject(routeParams, projectService, location, authService, currentUserService, navUrls, translate, confirmService, errorHandlingService) {\n this.routeParams = routeParams;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n this.currentUserService = currentUserService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.confirmService = confirmService;\n this.errorHandlingService = errorHandlingService;\n }\n\n TransferProject.prototype.initialize = function() {\n this.projectId = this.project.get(\"id\");\n this.token = this.routeParams.token;\n this.showAddComment = false;\n return this._refreshUserData();\n };\n\n TransferProject.prototype._validateToken = function() {\n return this.projectService.transferValidateToken(this.projectId, this.token).then(null, (function(_this) {\n return function(data, status) {\n return _this.errorHandlingService.notfound();\n };\n })(this));\n };\n\n TransferProject.prototype._refreshUserData = function() {\n return this.authService.refresh().then((function(_this) {\n return function() {\n _this._validateToken();\n _this._setProjectData();\n return _this._checkOwnerData();\n };\n })(this));\n };\n\n TransferProject.prototype._setProjectData = function() {\n return this.canBeOwnedByUser = this.currentUserService.canOwnProject(this.project);\n };\n\n TransferProject.prototype._checkOwnerData = function() {\n var currentUser, maxMemberships;\n currentUser = this.currentUserService.getUser();\n if (this.project.get('is_private')) {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PRIVATE';\n this.maxProjects = currentUser.get('max_private_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_private_projects');\n maxMemberships = currentUser.get('max_memberships_private_projects');\n } else {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PUBLIC';\n this.maxProjects = currentUser.get('max_public_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_public_projects');\n maxMemberships = currentUser.get('max_memberships_public_projects');\n }\n return this.validNumberOfMemberships = maxMemberships === null || this.project.get('total_memberships') <= maxMemberships;\n };\n\n TransferProject.prototype.transferAccept = function(token, reason) {\n this.loadingAccept = true;\n return this.projectService.transferAccept(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"project-admin-project-profile-details\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingAccept = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.ACCEPTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.transferReject = function(token, reason) {\n this.loadingReject = true;\n return this.projectService.transferReject(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"home\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingReject = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.REJECTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.addComment = function() {\n return this.showAddComment = true;\n };\n\n TransferProject.prototype.hideComment = function() {\n this.showAddComment = false;\n return this.reason = '';\n };\n\n return TransferProject;\n\n })();\n\n module.controller(\"TransferProjectController\", TransferProject);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProjectDirective, module;\n\n module = angular.module('taigaProjects');\n\n TransferProjectDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initialize();\n };\n return {\n link: link,\n scope: {},\n bindToController: {\n project: \"=\"\n },\n templateUrl: \"projects/transfer/transfer-project.html\",\n controller: 'TransferProjectController',\n controllerAs: 'vm'\n };\n };\n\n module.directive('tgTransferProject', TransferProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n * Copyright (C) 2014-2017 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, from_comment) {\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, 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 data.append(\"from_comment\", from_comment);\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-2017 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: epics-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(\"epics\");\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 service.list = function(projectId, page) {\n var params, url;\n if (page == null) {\n page = 0;\n }\n url = urlsService.resolve(\"epics\");\n params = {\n project: projectId,\n page: page\n };\n return http.get(url, params).then(function(result) {\n return {\n list: Immutable.fromJS(result.data),\n headers: result.headers\n };\n });\n };\n service.patch = function(id, patch) {\n var url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n return http.patch(url, patch).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.post = function(params) {\n var url;\n url = urlsService.resolve(\"epics\");\n return http.post(url, params).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.reorder = function(id, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.addRelatedUserstory = function(epicId, userstoryId) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId);\n params = {\n user_story: userstoryId,\n epic: epicId\n };\n return http.post(url, params);\n };\n service.reorderRelatedUserstory = function(epicId, userstoryId, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options);\n };\n service.bulkCreateRelatedUserStories = function(epicId, projectId, bulk_userstories) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories-bulk-create\", epicId);\n params = {\n bulk_userstories: bulk_userstories,\n project_id: projectId\n };\n return http.post(url, params);\n };\n service.deleteRelatedUserstory = function(epicId, userstoryId) {\n var url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n return http[\"delete\"](url);\n };\n return function() {\n return {\n \"epics\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgEpicsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/importers.coffee\n */\n\n(function() {\n var AsanaResource, GithubResource, JiraResource, TrelloResource, module, taiga;\n\n taiga = this.taiga;\n\n TrelloResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(url) {\n url = urlsService.resolve(\"importers-trello-auth-url\");\n return http.get(url);\n };\n service.authorize = function(verifyCode) {\n var url;\n url = urlsService.resolve(\"importers-trello-authorize\");\n return http.post(url, {\n code: verifyCode\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n var data, url;\n url = urlsService.resolve(\"importers-trello-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: \"kanban\"\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"trelloImporter\": service\n };\n };\n };\n\n TrelloResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n JiraResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(jira_url) {\n var url;\n url = urlsService.resolve(\"importers-jira-auth-url\") + \"?url=\" + jira_url;\n return http.get(url);\n };\n service.authorize = function(oauth_verifier) {\n var url;\n url = urlsService.resolve(\"importers-jira-authorize\");\n return http.post(url, {\n oauth_verifier: oauth_verifier\n });\n };\n service.listProjects = function(jira_url, token) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-projects\");\n return http.post(url, {\n url: jira_url,\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(jira_url, token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-users\");\n return http.post(url, {\n url: jira_url,\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(jira_url, token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n var data, projectTemplate, url;\n url = urlsService.resolve(\"importers-jira-import-project\");\n projectTemplate = \"kanban\";\n if (projectType !== \"kanban\") {\n projectTemplate = \"scrum\";\n }\n data = {\n url: jira_url,\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n project_type: projectType,\n importer_type: importerType,\n template: projectTemplate\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"jiraImporter\": service\n };\n };\n };\n\n JiraResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n GithubResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(callbackUri) {\n var url;\n url = urlsService.resolve(\"importers-github-auth-url\") + \"?uri=\" + callbackUri;\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-github-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-github-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-github-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-github-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"githubImporter\": service\n };\n };\n };\n\n GithubResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n AsanaResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function() {\n var url;\n url = urlsService.resolve(\"importers-asana-auth-url\");\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-asana-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-asana-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"asanaImporter\": service\n };\n };\n };\n\n AsanaResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTrelloImportResource\", TrelloResource);\n\n module.factory(\"tgJiraImportResource\", JiraResource);\n\n module.factory(\"tgGithubImportResource\", GithubResource);\n\n module.factory(\"tgAsanaImportResource\", AsanaResource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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.create = function(data) {\n var url;\n url = urlsService.resolve('projects');\n return http.post(url, JSON.stringify(data)).then((function(_this) {\n return function(result) {\n return Immutable.fromJS(result.data);\n };\n })(this));\n };\n service.duplicate = function(projectId, data) {\n var members, params, url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId + \"/duplicate\";\n members = data.users.map((function(_this) {\n return function(member) {\n return {\n \"id\": member\n };\n };\n })(this));\n params = {\n \"name\": data.name,\n \"description\": data.description,\n \"is_private\": data.is_private,\n \"users\": members\n };\n return http.post(url, params);\n };\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\": \"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 service.contactProject = function(projectId, message) {\n var params, url;\n params = {\n project: projectId,\n comment: message\n };\n url = urlsService.resolve(\"project-contact\");\n return http.post(url, params);\n };\n service.transferValidateToken = function(projectId, token) {\n var data, url;\n data = {\n token: token\n };\n url = urlsService.resolve(\"project-transfer-validate-token\", projectId);\n return http.post(url, data);\n };\n service.transferAccept = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-accept\", projectId);\n return http.post(url, data);\n };\n service.transferReject = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-reject\", projectId);\n return http.post(url, data);\n };\n service.transferRequest = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-transfer-request\", projectId);\n return http.post(url);\n };\n service.transferStart = function(projectId, userId, reason) {\n var data, url;\n data = {\n user: userId,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-start\", projectId);\n return http.post(url, data);\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-2017 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\", \"tgWikiHistory\", \"tgEpicsResource\", \"tgTrelloImportResource\", \"tgJiraImportResource\", \"tgGithubImportResource\", \"tgAsanaImportResource\"];\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.warn(\"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-2017 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-2017 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-2017 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, excludeProjectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"user-contacts\", userId);\n params = {};\n if (excludeProjectId != null) {\n params.exclude_project = excludeProjectId;\n }\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 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-2017 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, pagination) {\n var httpOptions, url;\n if (pagination == null) {\n pagination = false;\n }\n url = urlsService.resolve(\"userstories\");\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n }\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listAllInProject = function(projectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n project: projectId\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listInEpic = function(epicIid) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n epic: epicIid,\n order_by: 'epic_order',\n include_tasks: true\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-2017 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: wiki-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getWikiHistory = function(wikiId) {\n var httpOptions, url;\n url = urlsService.resolve(\"history/wiki\", wikiId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, null, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"wikiHistory\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgWikiHistory\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 = $(\"head 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 = $(\"head 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 = $(\"head 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 $(\"head 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, from_comment) {\n var promise;\n if (from_comment == null) {\n from_comment = false;\n }\n promise = this.rs.attachments.create(type, projectId, objId, file, from_comment);\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-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: avatar.service.coffee\n */\n\n(function() {\n var AvatarService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n AvatarService = (function() {\n function AvatarService(config) {\n var COLORS, IMAGES;\n this.config = config;\n IMAGES = [\"/\" + window._version + \"/images/user-avatars/user-avatar-01.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-02.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-03.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-04.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-05.png\"];\n COLORS = [\"rgba( 178, 176, 204, 1 )\", \"rgba( 183, 203, 131, 1 )\", \"rgba( 210, 198, 139, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 247, 154, 154, 1 )\"];\n this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n AvatarService.prototype.getDefault = function(key) {\n var idx, logo;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n AvatarService.prototype.getUnnamed = function() {\n return {\n url: \"/\" + window._version + \"/images/unnamed.png\"\n };\n };\n\n AvatarService.prototype.getAvatar = function(user, type) {\n var avatarParamName, gravatar, logo, logoUrl, photo, root;\n if (!user) {\n return this.getUnnamed();\n }\n avatarParamName = 'photo';\n if (type === 'avatarBig') {\n avatarParamName = 'big_photo';\n }\n photo = null;\n if (user instanceof Immutable.Map) {\n gravatar = user.get('gravatar_id');\n photo = user.get(avatarParamName);\n } else {\n gravatar = user.gravatar_id;\n photo = user[avatarParamName];\n }\n if (!gravatar) {\n return this.getUnnamed();\n }\n if (photo) {\n return {\n url: photo\n };\n } else if (location.host.indexOf('localhost') !== -1 || !this.config.get(\"gravatar\", true)) {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n return {\n url: root + logo.src,\n bg: logo.color\n };\n } else {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n logoUrl = encodeURIComponent(root + logo.src);\n return {\n url: 'https://www.gravatar.com/avatar/' + gravatar + \"?s=200&d=\" + logoUrl,\n bg: logo.color\n };\n }\n };\n\n return AvatarService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAvatarService\", [\"$tgConfig\", AvatarService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 CheckPermissionsService, taiga;\n\n taiga = this.taiga;\n\n CheckPermissionsService = (function() {\n CheckPermissionsService.$inject = [\"tgProjectService\"];\n\n function CheckPermissionsService(projectService) {\n this.projectService = projectService;\n }\n\n CheckPermissionsService.prototype.check = function(permission) {\n if (!this.projectService.project) {\n return false;\n }\n return this.projectService.project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n return CheckPermissionsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", CheckPermissionsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 (!this.isAuthenticated()) {\n return;\n }\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 CurrentUserService.prototype.canCreatePrivateProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_private_projects') !== null && user.get('total_private_projects') >= user.get('max_private_projects')) {\n return {\n valid: false,\n reason: 'max_private_projects',\n type: 'private_project',\n current: user.get('total_private_projects'),\n max: user.get('max_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canCreatePublicProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_public_projects') !== null && user.get('total_public_projects') >= user.get('max_public_projects')) {\n return {\n valid: false,\n reason: 'max_public_projects',\n type: 'public_project',\n current: user.get('total_public_projects'),\n max: user.get('max_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPublicProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_public_projects') !== null && totalMembers > user.get('max_memberships_public_projects')) {\n return {\n valid: false,\n reason: 'max_members_public_projects',\n type: 'public_project',\n current: totalMembers,\n max: user.get('max_memberships_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPrivateProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_private_projects') !== null && totalMembers > user.get('max_memberships_private_projects')) {\n return {\n valid: false,\n reason: 'max_members_private_projects',\n type: 'private_project',\n current: totalMembers,\n max: user.get('max_memberships_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canOwnProject = function(project) {\n var membersResult, result, user;\n user = this.getUser();\n if (project.get('is_private')) {\n result = this.canCreatePrivateProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPrivateProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n } else {\n result = this.canCreatePublicProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPublicProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n }\n return {\n valid: true\n };\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-2017 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: error-handling.service.coffee\n */\n\n(function() {\n var ErrorHandlingService, taiga;\n\n taiga = this.taiga;\n\n ErrorHandlingService = (function() {\n ErrorHandlingService.$inject = [\"$rootScope\"];\n\n function ErrorHandlingService(rootScope) {\n this.rootScope = rootScope;\n }\n\n ErrorHandlingService.prototype.init = function() {\n return this.rootScope.errorHandling = {};\n };\n\n ErrorHandlingService.prototype.notfound = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.notfound = true;\n };\n\n ErrorHandlingService.prototype.error = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.error = true;\n };\n\n ErrorHandlingService.prototype.permissionDenied = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.permissionDenied = true;\n };\n\n ErrorHandlingService.prototype.block = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.blocked = true;\n };\n\n return ErrorHandlingService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgErrorHandlingService\", ErrorHandlingService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-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: project-logo.service.coffee\n */\n\n(function() {\n var ProjectLogoService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n ProjectLogoService = (function() {\n function ProjectLogoService() {\n var COLORS, IMAGES;\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 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 this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n ProjectLogoService.prototype.getDefaultProjectLogo = function(slug, id) {\n var idx, key, logo;\n key = slug + \"-\" + id;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n return ProjectLogoService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectLogoService\", ProjectLogoService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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\", \"tgUserActivityService\", \"$interval\"];\n\n function ProjectService(projectsService, xhrError, userActivityService, interval) {\n this.projectsService = projectsService;\n this.xhrError = xhrError;\n this.userActivityService = userActivityService;\n this.interval = interval;\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 if (!window.localStorage.e2e) {\n this.autoRefresh();\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.autoRefresh = function() {\n var intervalId;\n intervalId = this.interval((function(_this) {\n return function() {\n return _this.fetchProject();\n };\n })(this), 60 * 10 * 1000);\n this.userActivityService.onInactive((function(_this) {\n return function() {\n return _this.interval.cancel(intervalId);\n };\n })(this));\n return this.userActivityService.onActive((function(_this) {\n return function() {\n _this.fetchProject();\n return _this.autoRefresh();\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.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.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.fetchProject = function() {\n var pslug;\n if (!this.project) {\n return;\n }\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 ProjectService.prototype.hasPermission = function(permission) {\n return this._project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n ProjectService.prototype.isEpicsDashboardEnabled = function() {\n return this._project.get(\"is_epics_activated\");\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-2017 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-2017 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-activity.service.coffee\n */\n\n(function() {\n var UserActivityService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n UserActivityService = (function() {\n UserActivityService.$inject = ['$timeout'];\n\n UserActivityService.prototype.idleTimeout = 60 * 5 * 1000;\n\n function UserActivityService(timeout) {\n this.timeout = timeout;\n if (window.localStorage.e2e) {\n return null;\n }\n window.addEventListener('mousemove', this.resetTimer.bind(this), false);\n window.addEventListener('mousedown', this.resetTimer.bind(this), false);\n window.addEventListener('keypress', this.resetTimer.bind(this), false);\n window.addEventListener('mousewheel', this.resetTimer.bind(this), false);\n window.addEventListener('touchmove', this.resetTimer.bind(this), false);\n this.subscriptionsActive = [];\n this.subscriptionsInactive = [];\n this.isActive = true;\n this.startTimer();\n }\n\n UserActivityService.prototype.startTimer = function() {\n return this.timerId = this.timeout(this._fireInactive.bind(this), this.idleTimeout);\n };\n\n UserActivityService.prototype.resetTimer = function() {\n if (!this.isActive) {\n this._fireActive();\n }\n this.timeout.cancel(this.timerId);\n this.startTimer();\n return this.isActive = true;\n };\n\n UserActivityService.prototype.onActive = function(cb) {\n this.subscriptionsActive.push(cb);\n return this._unSubscriptionsActive.bind(this, cb);\n };\n\n UserActivityService.prototype.onInactive = function(cb) {\n this.subscriptionsInactive.push(cb);\n return this._unSubscriptionsInactive.bind(this, cb);\n };\n\n UserActivityService.prototype._fireActive = function() {\n return this.subscriptionsActive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._fireInactive = function() {\n this.isActive = false;\n return this.subscriptionsInactive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._unSubscriptionsActive = function(cb) {\n return this.subscriptionsActive = this.subscriptionsActive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n UserActivityService.prototype._unSubscriptionsInactive = function(cb) {\n return this.subscriptionsInactive = this.subscriptionsInactive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n return UserActivityService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgUserActivityService\", UserActivityService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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, excludeProjectId) {\n return this.rs.users.getContacts(userId, excludeProjectId);\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-2017 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\", \"tgErrorHandlingService\"];\n\n function xhrError(q, errorHandlingService) {\n this.q = q;\n this.errorHandlingService = errorHandlingService;\n }\n\n xhrError.prototype.notFound = function() {\n return this.errorHandlingService.notfound();\n };\n\n xhrError.prototype.permissionDenied = function() {\n return this.errorHandlingService.permissionDenied();\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-2017 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-2017 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 'color': 'COMMON.FIELDS.COLOR'\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 related_us_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"userstory\"]);\n url = \"project-userstories-detail:project=timeline.getIn(['data', 'userstory', 'project', 'slug']),ref=timeline.getIn(['data', 'userstory', 'ref'])\";\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n epic_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"epic\"]);\n url = \"project-epics-detail:project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['data', 'epic', 'ref'])\";\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 \"epic\": [\"project-epics-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"]\n };\n return url[event.obj][0] + url[event.obj][1];\n };\n\n UserTimelineItemTitle.prototype._getLink = function(url, text, title) {\n var span;\n title = title || text;\n span = $('').attr('ng-non-bindable', true).text(text);\n return $('').attr('tg-nav', url).attr('title', title).append(span).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-2017 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 event.obj === 'epic' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'relateduserstory' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_RELATED_USERSTORY_CREATED',\n translate_params: ['username', 'project_name', 'related_us_name', 'epic_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.getIn(['data', 'comment']) && event.obj === 'epic';\n },\n key: 'TIMELINE.NEW_COMMENT_EPIC',\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 === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.EPIC_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'color';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_COLOR',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_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-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 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-2017 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', 'color'];\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\n/*\n * Copyright (C) 2014-2017 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: isolate-click.directive.coffee\n */\n\n(function() {\n var IsolateClickDirective;\n\n IsolateClickDirective = function() {\n var link;\n link = function(scope, el, attrs) {\n return el.on('click', (function(_this) {\n return function(e) {\n return e.stopPropagation();\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n angular.module(\"taigaUtils\").directive(\"tgIsolateClick\", IsolateClickDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDiffDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDiffDirective = function() {\n return {\n templateUrl: \"wiki/history/wiki-history-diff.html\",\n scope: {\n key: \"<\",\n diff: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryDiff\", WikiHistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryEntryDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryEntryDirective = function() {\n var link;\n link = function(scope, el, attr) {\n return scope.singleHistoryEntry = scope.historyEntry.toJS();\n };\n return {\n link: link,\n templateUrl: \"wiki/history/wiki-history-entry.html\",\n scope: {\n historyEntry: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryEntry\", WikiHistoryEntryDirective);\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: wiki-history.controller.coffee\n */\n\n(function() {\n var WikiHistoryController, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaWikiHistory\");\n\n WikiHistoryController = (function() {\n WikiHistoryController.$inject = [\"tgWikiHistoryService\"];\n\n function WikiHistoryController(wikiHistoryService) {\n this.wikiHistoryService = wikiHistoryService;\n taiga.defineImmutableProperty(this, 'historyEntries', (function(_this) {\n return function() {\n return _this.wikiHistoryService.historyEntries;\n };\n })(this));\n this.toggle = false;\n }\n\n WikiHistoryController.prototype.initializeHistoryEntries = function(wikiId) {\n if (wikiId) {\n this.wikiHistoryService.setWikiId(wikiId);\n }\n return this.wikiHistoryService.loadHistoryEntries();\n };\n\n return WikiHistoryController;\n\n })();\n\n module.controller(\"WikiHistoryCtrl\", WikiHistoryController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.wikiId', function(value) {\n return ctrl.initializeHistoryEntries(value);\n });\n };\n return {\n scope: {},\n bindToController: {\n wikiId: \"<\"\n },\n controller: \"WikiHistoryCtrl\",\n controllerAs: \"vm\",\n templateUrl: \"wiki/history/wiki-history.html\",\n link: link\n };\n };\n\n module.directive(\"tgWikiHistory\", WikiHistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.service.coffee\n */\n\n(function() {\n var WikiHistoryService, 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('taigaWikiHistory');\n\n WikiHistoryService = (function(superClass) {\n extend(WikiHistoryService, superClass);\n\n WikiHistoryService.$inject = [\"tgResources\", \"tgXhrErrorService\"];\n\n function WikiHistoryService(rs, xhrError) {\n this.rs = rs;\n this.xhrError = xhrError;\n this._wikiId = null;\n this._historyEntries = Immutable.List();\n taiga.defineImmutableProperty(this, \"wikiId\", (function(_this) {\n return function() {\n return _this._wikiId;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"historyEntries\", (function(_this) {\n return function() {\n return _this._historyEntries;\n };\n })(this));\n }\n\n WikiHistoryService.prototype.setWikiId = function(wikiId) {\n this._wikiId = wikiId;\n return this._historyEntries = Immutable.List();\n };\n\n WikiHistoryService.prototype.loadHistoryEntries = function() {\n if (!this._wikiId) {\n return;\n }\n return this.rs.wikiHistory.getWikiHistory(this._wikiId).then((function(_this) {\n return function(historyEntries) {\n if (historyEntries.size) {\n return _this._historyEntries = historyEntries.reverse();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n _;\n\n return WikiHistoryService;\n\n })(taiga.Service);\n\n module.service(\"tgWikiHistoryService\", WikiHistoryService);\n\n}).call(this);\n\n//# sourceMappingURL=maps/app.js.map\n"]} \ No newline at end of file diff --git a/dist/v-1520418874500/js/templates.js b/dist/v-1520418874500/js/templates.js deleted file mode 100644 index 34db0fe..0000000 --- a/dist/v-1520418874500/js/templates.js +++ /dev/null @@ -1,16 +0,0 @@ -angular.module("templates",[]).run(["$templateCache",function(t){t.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
    '),t.put("auth/forgot-password.html",'\n
    '),t.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
    '),t.put("auth/login-text.html",'\n'),t.put("auth/login.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
    '),t.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
    \n
    \n
    \n
    '),t.put("admin/admin-membership-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
    '),t.put("admin/admin-memberships-row-checkbox.html",'\n
    \n \n
    \n
    '),t.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
    '),t.put("admin/admin-project-change-owner.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.CHANGE_OWNER\' | translate }}'),t.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
    \n
    \n
    \n
    \n
    '),t.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
    '),t.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
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), -t.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
    {{ \'ADMIN.PROJECT_PROFILE.RECRUITING\' | translate }}\n \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.FEEDBACK\' | translate }}\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'),t.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
    \n
    '),t.put("admin/admin-project-request-ownership.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP\' | translate }}'),t.put("admin/admin-project-restrictions.html",'\n
    {{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS_MEMBERS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS_MEMBERS\' | translate }}
    '),t.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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    '), -t.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 \n
    {{ value.name }}
    \n
    {{ value.value }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-priorities.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 \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-severities.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 \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-status.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
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \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
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n
    \n \n
    \n
    {{ value.wip_limit }}
    \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
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \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
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '), -t.put("admin/admin-project-values-tags.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
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    {{\'BACKLOG.EMPTY\' | 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
    '),t.put("admin/admin-project-values-types.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 \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-roles.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

    {{ role.name }}\n

    \n
    \n
    \n

    {{ role.name }}

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-third-parties-bitbucket.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
    '),t.put("admin/admin-third-parties-github.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
    '),t.put("admin/admin-third-parties-gitlab.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
    '), -t.put("admin/admin-third-parties-gogs.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
    '),t.put("admin/admin-third-parties-webhooks.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
    '),t.put("admin/lightbox-add-members.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
    '),t.put("admin/memberships-row-avatar.html",'\n
    <%- full_name %>\n
    \n
    <%- full_name %><% if (isOwner) { %>\n <% } %>\n
    \n
    <% if (pending) { %><%- pending %><% } %>
    \n
    \n
    '),t.put("admin/memberships-warning-message.html",'\n

    \n

    '),t.put("admin/no-more-memberships-explanation.html",'\n

    \n

    '),t.put("admin/project-csv.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n \n \n
    \n
    '),t.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

    {{\'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 \n
    \n
    \n {{ ::us.total_voters }}\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

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

    \n \n
    \n
    {{\'BACKLOG.SPRINTS.EMPTY\' | translate}}\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
    {{ \'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
    '), -t.put("backlog/progress-bar.html",'\n
    \n
    \n
    '),t.put("backlog/sprint-header.html",'\n\n
    \n
    {{::estimatedDateRange}}
    \n
      \n
    • {{::closedPoints | number}}
    • \n
    • {{::totalPoints | number}}
    • \n
    \n
    '),t.put("backlog/us-role-points-popover.html",'\n'),t.put("common/lightbox-feedback.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("contrib/main.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("contrib/user-settings.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("custom-attributes/custom-attribute-value-edit.html",'\n
    \n
    \n <% if (description){ %><%- description %><% } %>\n
    \n
    <% if (type=="text") { %>\n <% } else if (type=="multiline") { %>\n <% } else if (type=="richtext") { %>\n <% } else if (type=="date") { %>\n <% } else if (type=="url") { %>\n <% } else { %>\n <% } %>\n
    <% if (type != "richtext") { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attribute-value.html",'\n
    \n
    <%- name %><% if (description){ %><%- description %><% } %>
    <% if (type=="url") { %>\n <% } else if (type=="richtext") { %>\n
    \n
    \n
    <% } else { %>\n
    <%- value %>
    <% } %>\n <% if (isEditable) { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attributes-values.html",'\n
    \n \n
    \n
    \n
    \n
    '),t.put("epic/epic-detail.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
    '),t.put("error/error.html",'\n
    \n
    TAIGA\n

    Taiga

    \n

    \n
    \n
    '),t.put("error/not-found.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("error/permission-denied.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.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
    {{ usByStatus.get(s.id.toString()).size }}0
    \n
    \n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '),t.put("issue/iocaine-button.html",'\n
    \n \n \n
    '),t.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
    '),t.put("issue/issue-priority-button.html",'\n
    <%- priority.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-severity-button.html",'\n
    <%- severity.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-status-inline-edition-selection.html",'\n'),t.put("issue/issue-type-button.html",'\n
    <%- type.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issues-detail.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
    '),t.put("issue/issues.html",'\n'), -t.put("issue/promote-issue-to-us-button.html",'\n '),t.put("search/lightbox-search.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.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
    '),t.put("task/related-task-create-form.html",'\n'),t.put("task/related-task-row-edit.html",'\n
    \n \n
    \n\n\n
    \n
    \n
    \n \n
    \n
    '),t.put("task/related-task-row.html",'\n\n
    <% if(perms.modify_task) { %>\n <% } %>\n <% if(perms.delete_task) { %>\n <% } %>\n
    \n\n
    \n
    \n
    <% if(perms.modify_task) { %>\n <% } %>\n
    \n
    '),t.put("task/task-detail.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
    '),t.put("taskboard/taskboard-user.html",'\n
    \n'),t.put("taskboard/taskboard.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
    {{rolePoint.points}}{{rolePoint.name}}
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n

    \n \n \n

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

    \n

    \n

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

    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '),t.put("team/leave-project.html",'\n {{ \'TEAM.ACTION_LEAVE_PROJECT\' | translate }}'), -t.put("team/team-filter.html",'\n'),t.put("team/team-member-current-user.html",'\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("team/team-member-stats.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("team/team-members.html",'\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("team/team.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

    {{filtersRole.name || ("TEAM.SECTION_FILTER_ALL" | translate)}}

    \n
    \n
    \n
    '),t.put("us/us-client-requirement-button.html",'\n\n'),t.put("us/us-detail.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 {{\'US.TRIBE.PUBLISH_INFO\' | translate}}\n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("us/us-team-requirement-button.html",'\n\n'),t.put("user/cancel-account.html",'\n'),t.put("user/change-email.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
    '),t.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
    '),t.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
    '),t.put("user/user-profile.html",'\n
    \n \n
    \n \n
    \n
    \n \n
    \n'),t.put("wiki/wiki-list.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{wikipage.editions}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("wiki/wiki-nav.html",'\n
    \n

    \n
    \n\n\n<% if (addWikiLinkPermission) { %>\n <% } %>\n'),t.put("wiki/wiki-summary.html",'\n
    \n
    <%- user.name %>
    \n
    <%- user.name %>
    \n
    \n
    <%- lastModifiedDate %>
    \n
    <%- totalEditions %>
    \n'),t.put("wiki/wiki.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n \n
    \n \n \n
    \n
    '),t.put("common/components/add-button.html",'\n '),t.put("common/components/assigned-to.html",'\n
    <%- fullName %><% if (isIocaine) { %>\n
    \n \n
    <% }; %>\n
    \n
    <% if (isUnassigned) { %>\n
    {{ "COMMON.ASSIGNED_TO.NOT_ASSIGNED" | translate }}
    <% } else { %>\n
    {{ "COMMON.FIELDS.ASSIGNED_TO" | translate }}
    <% }; %>\n
    <% if (!isEditable && fullNameVisible) { %><%- fullName %><% }; %>\n <% if (isEditable) { %>\n <% if (fullNameVisible) { %>\n <%- fullName %>\n <% }; %>\n <% if (!isUnassigned) { %>\n <% }; %><% }; %>\n <% if (isEditable && isUnassigned) { %> {{ "COMMON.ASSIGNED_TO.SELF" | translate }}<% }; %>\n
    <% if (isEditable && !isUnassigned) { %>\n <% } %>\n
    '), -t.put("common/components/block-button.html",'\n \n '),t.put("common/components/created-by.html",'\n
    \n
    {{date}}
    \n
    \n
    {{owner.full_name_display}}
    '),t.put("common/components/delete-button.html",'\n '),t.put("common/components/editable-description-msg-edit-mode.html",'\n

    '),t.put("common/components/editable-description-msg-read-mode.html",'\n

    '),t.put("common/components/editable-subject.html",'\n
    {{ item.subject }}\n \n
    \n
    \n \n \n
    '),t.put("common/components/kanban-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/level.html",'\n
    '),t.put("common/components/list-item-assigned-to-avatar.html",'\n
    <%- name %><%- name %>
    '),t.put("common/components/main-title.html",'{{ projectName }}{{ sectionName | translate }}'),t.put("common/components/progress-bar.html",'\n
    '),t.put("common/components/status-button.html",'<%- status.name %><% if(editable){ %>\n <% }%>\n'),t.put("common/components/status-display.html",'<% if (is_closed) { %><% } else { %><% } %>'),t.put("common/components/taskboard-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/user-display.html",'\n
    {{user.full_name_display}}
    {{user.full_name_display}}\n
    {{user.full_name_display}}
    {{user.full_name_display}}'),t.put("common/components/watchers.html",'\n
    \n
    {{watcher.full_name_display}}
    \n
    {{watcher.full_name_display}}\n \n
    \n
    '),t.put("common/components/wysiwyg-toolbar.html",'\n
    \n
    \n

    {{\'COMMON.WYSIWYG.OUTDATED\' | translate}}

    \n
    \n
    \n \n
    Markdown ModeHTML Mode\n
    \n
    \n\n'),t.put("common/estimation/us-estimation-points-per-role.html",'\n
      <% _.each(roles, function(role) { %>\n
    • <%- role.points %>\n <%- role.name %>
    • <% }); %>\n
    • <%- totalPoints %>
    • \n
    '),t.put("common/estimation/us-estimation-points.html",'\n'),t.put("common/estimation/us-estimation-total.html",'<%= text %><% if (editable) { %>\n <% } %>'),t.put("common/estimation/us-points-roles-popover.html",'\n'),t.put("common/lightbox/lightbox-assigned-to-users.html",'<% if (selected) { %>\n<% } %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
    <% } %>'),t.put("common/lightbox/lightbox-assigned-to.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    '),t.put("common/lightbox/lightbox-block.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("common/lightbox/lightbox-blocking-message-input.html",'\n'),t.put("common/lightbox/lightbox-change-owner.html",'\n\n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n \n
    '),t.put("common/lightbox/lightbox-leave-project-warning.html",'\n\n
    \n \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.TITLE\' | translate}}

    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.CURRENT_USER_OWNER.DESC\' | translate}}

    \n
    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.OTHER_USER_OWNER.DESC\' | translate}}

    \n
    \n
    '),t.put("common/lightbox/lightbox-request-ownership.html",'\n\n
    \n

    \n

    \n
    '),t.put("common/lightbox/lightbox-users.html",'\n\n
    \n

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

    \n

    \n
    \n
    '),t.put("projects/create/asana-import/asana-import-project-form/asana-import-project-form.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
    '),t.put("projects/create/github-import/github-import-project-form/github-import-project-form.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
    '),t.put("projects/create/invite-members/single-member/single-member.html",'\n'),t.put("projects/create/jira-import/jira-import-project-form/jira-import-project-form.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
    '),t.put("projects/create/trello-import/trello-import-project-form/trello-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("external-apps/external-app.html",'\n
    \n \n

    Taiga

    \n

    \n
    \n
    \n
    {{::vm.user.get(\'full_name_display\')}}
    \n
    \n

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

    \n

    {{ ::vm.user.get("email") }}

    \n
    \n
    \n
    \n
    \n
    \n
    {{::vm.application.get(\'name\')}}
    \n
    \n

    {{ ::vm.application.get("name") }}

    {{ ::vm.application.get(\'web\') }}\n

    {{ ::vm.application.get("description") }}

    \n
    \n
    \n
    \n
    '),t.put("history/history.html",'\n
    \n \n \n \n
    '), -t.put("home/home.html",'\n
    \n
    \n

    {{"HOME.DASHBOARD" | translate}}

    \n \n
    \n \n
    '),t.put("invite-members/lightbox-add-members.html",'\n\n
    \n

    \n \n \n
    '),t.put("navigation-bar/navigation-bar.html",'\n'),t.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
    '),t.put("components/assigned-to/assigned-to.html",'{{vm.assignedTo.get(\'full_name_display\')}}{{vm.assignedTo.get(\'full_name_display\')}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}'),t.put("components/attachment/attachment-gallery.html","\n"),t.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
    '),t.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 {{file.name}}\n
    \n
    {{file.size | sizeFormat}}
    \n
    {{file.progressMessage}}\n
    \n
    \n
    \n
    \n
    \n \n
    \n'),t.put("components/attachments-preview/attachments-preview.html",'\n
    \n \n \n
    '),t.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 {{attachment.get(\'name\')}}\n
    \n
    {{attachment.get(\'size\') | sizeFormat}}
    \n \n
    \n
    \n
    '),t.put("components/belong-to-epics/belong-to-epics-pill.html","\n
    "),t.put("components/belong-to-epics/belong-to-epics-text.html",""),t.put("components/board-zoom/board-zoom.html",'\n'),t.put("components/card/card.html",'\n
    \n
    \n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    \n \n
    {{"COMMON.FIELDS.POINTS" | translate}} {{vm.item.getIn([\'model\', \'total_points\'])}}\n
    \n
    \n \n
    \n
    \n {{vm.item.getIn([\'model\', \'total_voters\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'watchers\']).size}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'total_comments\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'attachments\']).size}}\n
    \n
    \n
    \n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn([\'model\', \'tasks\']).size}}\n
    \n
      \n
    • \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("components/card-slideshow/card-slideshow.html",'\n
    \n \n \n
    \n \n
    \n
    '),t.put("components/color-selector/color-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
      \n
    • \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("components/filter/filter.html",'\n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{it.name}}\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    '), -t.put("components/live-announcement/live-announcement.html",'\n
    \n
    Loading...\n
    \n

    {{vm.title}}

    \n

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

    '),t.put("components/tribe-button/tribe-button.html",'{{ \'US.TRIBE.PUBLISH\' | translate }}'),t.put("components/tribe-button/tribe-linked.html",'\n'),t.put("components/vote-button/vote-button.html",'\n {{ vm.item.total_voters }}\n {{ ::vm.item.total_voters }}'),t.put("components/watch-button/watch-button-ticket.html",'\n
    {{ vm.item.watchers.length }} {{\'COMMON.WATCHERS.WATCHERS\' | translate}}
    \n'),t.put("components/watch-button/watch-button.html",'\n {{ vm.item.watchers.length }}\n {{ vm.item.watchers.length }}'),t.put("epics/create-epic/create-epic.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
    '),t.put("epics/dashboard/epics-dashboard.html",'\n
    \n \n
    \n
    \n

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

    \n

    \n \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories.html",'\n'),t.put("discover/discover-home/discover-home.html",'\n
    \n
    \n \n
    \n
    \n \n \n
    \n \n
    '),t.put("discover/discover-search/discover-search.html",'\n
    \n \n
    {{ DISCOVER.EMPTY | translate }}\n

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

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

      \n

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

      \n
      \n
      \n
      \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}
      \n
    • \n
    {{ \'DISCOVER.VIEW_MORE\' | translate }}\n
    \n
    \n
    '),t.put("history/comments/comment.html",'\n
    \n
    \n
    {{vm.comment.user.name}}{{vm.comment.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}\n
    {{vm.comment.edit_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}-\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    - {{vm.comment.delete_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}\n \n \n
    \n

    \n
    '),t.put("history/comments/comments.html",'\n
    \n
    \n \n
    \n \n
    '),t.put("history/history/history-diff.html",'\n
    \n
    {{diff[0]}}\n {{diff[1]}}\n
    \n
    \n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    \n

    \n

    \n

    \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    \n
    \n
    \n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    '),t.put("history/history/history.html",'\n
    \n
    \n
    \n
    \n
    {{activity.user.name}}{{activity.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("history/history-lightbox/comment-history-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("history/history-lightbox/history-entry.html",'\n
    \n
    \n
    {{entry.user.full_name_display}}\n \n
    \n
    \n
    \n
    '), -t.put("history/history-tabs/history-tabs.html",'\n'),t.put("home/duties/duty.html","\n
    \n
    \n
    \n

    {{ ::vm.duty.getIn(['project', 'name']) }}{{ ::vm.getDutyType() }}{{ ::vm.duty.get('status_extra_info').get('name') }}\n \n

    \n

    {{ 'COMMON.BLOCKED' | translate }}

    \n
    "),t.put("home/projects/home-project-list.html",'\n
    \n
    \n
    \n
    \n

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

    \n
    \n

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

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

    \n
    '),t.put("home/working-on/empty.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("home/working-on/working-on.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
    '),t.put("invite-members/invite-members-form/invite-members-form.html",'\n
    \n
      \n
    • \n
      {{contact.full_name}}{{contact.full_name}}
      \n \n
    • \n
    • \n
      {{userMail.email}}
      \n \n
    • \n
    \n
    \n \n
    \n \n \n \n

    \n
    '),t.put("invite-members/suggest-add-members/suggest-add-members.html",'\n
    \n
    \n \n \n
    \n
      \n
    • {{contact.get(\'full_name_display\')}}{{contact.get(\'full_name_display\')}}
    • \n
    \n
    '),t.put("navigation-bar/dropdown-project-list/dropdown-project-list.html",'\n \n'),t.put("navigation-bar/dropdown-user/dropdown-user.html",'{{ vm.user.get(\'full_name_display\') }}{{ vm.user.get(\'full_name_display\') }}\n'),t.put("profile/profile-bar/profile-bar.html",'\n
    \n
    {{::vm.user.get(\'full_name\')}}
    \n
    \n

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

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

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

    \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
    {{::vm.user.get("bio") | limitTo:210 }}{{vm.user.get("bio").length < 210 ? \'\' : \'...\'}}
    \n
    '),t.put("profile/profile-contacts/profile-contacts.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    {{ \'USER.PROFILE.CONTACTS_EMPTY\' | translate }}\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
    '),t.put("profile/profile-favs/profile-favs.html",'\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'COMMON.LOADING\'|translate }}
    \n
    \n
    {{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}\n

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

    \n
    \n
    '),t.put("profile/profile-hints/profile-hints.html",'\n

    \n \n

    \n

    {{::vm.hint.title}}

    \n

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

    '),t.put("profile/profile-projects/profile-projects.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n \n

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

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

    \n

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

    \n
    \n
    \n
    \n
    \n
    \n {{ ::project.get(\'total_fans\') }}\n {{ ::project.get(\'total_watchers\') }}
    \n
    {{::contact.get(\'full_name\')}}
    \n
    \n
    \n
    '),t.put("profile/profile-tab/profile-tab.html",'\n
    \n \n
    '),t.put("profile/profile-tabs/profile-tabs.html",'\n'),t.put("projects/create/create-project.html",'\n'),t.put("projects/listing/projects-listing.html",'\n
    \n
    \n

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

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

      \n

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

      \n
      \n
      \n
      \n \n
    • \n
    \n
    \n \n
    \n
    '),t.put("projects/project/blocked-project-explanation.html","\n
    \n
    {{'PROJECT.BLOCKED_PROJECT.THIS_PROJECT_IS_BLOCKED' | translate}}
    \n
    \n
    \n
    {{'PROJECT.BLOCKED_PROJECT.TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF' | translate}}
    \n
    "),t.put("projects/project/blocked-project.html",'\n
    \n
    \n
    \n
    {{::vm.project.get(\'name\')}}\n \n
    {{::vm.project.get("name")}}\n
    \n
    \n

    {{\'PROJECT.BLOCKED_PROJECT.BLOCKED\' | translate}}

    \n \n
    \n
    \n
    '),t.put("projects/project/project.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n
    \n

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

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

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

    \n
    \n
    \n
    {{::tag}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n

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

    \n

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

    \n \n
    \n

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

    \n \n
    \n
    \n
    \n
    '), -t.put("projects/transfer/cant-own-project-explanation.html",'\n

    '),t.put("projects/transfer/transfer-page.html",'\n'),t.put("projects/transfer/transfer-project.html",'\n
    \n

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

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

    \n
    \n \n {{::vm.project.get("total_memberships")}}
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n \n
    '),t.put("user-timeline/user-timeline/user-timeline.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n
    \n
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html",'\n\n
    \n
    {{::attachment.get(\'filename\')}}
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment.html",'\n'),t.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
    "),t.put("wiki/history/wiki-history-diff.html",'\n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n

    \n

    \n
    '),t.put("wiki/history/wiki-history-entry.html",'\n
    \n
    \n
    {{singleHistoryEntry.user.name}}{{singleHistoryEntry.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    '),t.put("wiki/history/wiki-history.html",'\n\n
    \n \n
    '),t.put("components/assigned-to/assigned-item/assigned-item.html",'\n
    \n
    {{member.full_name}}
    \n
    '),t.put("components/assigned-to/assigned-to-selector/assigned-to-selector.html",'\n\n
    \n

    \n \n
      \n
    • \n \n \n
    • \n
    • \n \n
    • \n
    \n
    '),t.put("components/detail/header/detail-header.html",'\n
    \n

    {{\'#\' + vm.item.ref}}\n

    \n
    \n \n \n
    \n
    \n
    \n \n
    \n\n
    \n\n\n
    {{vm.item.blocked_note}}
    \n'),t.put("components/card/card-templates/card-completion.html","\n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn(['model', 'tasks']).size}}\n
    "),t.put("components/card/card-templates/card-data.html","\n
    {{\"COMMON.FIELDS.POINTS\" | translate}} {{vm.item.getIn(['model', 'total_points'])}}\n
    \n
    \n \n
    \n
    \n {{vm.item.getIn(['model', 'total_voters'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'watchers']).size}}\n
    \n
    \n {{vm.item.getIn(['model', 'total_comments'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'attachments']).size}}\n
    \n
    \n
    "),t.put("components/card/card-templates/card-owner.html",'\n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    '),t.put("components/card/card-templates/card-tags.html",'\n
    '),t.put("components/card/card-templates/card-tasks.html","\n
      \n
    • \n
    "),t.put("components/card/card-templates/card-title.html","\n

    {{::\"#\" + vm.item.getIn(['model', 'ref'])}}\n

    "),t.put("components/card/card-templates/card-unfold.html",'\n
    \n \n
    \n
    '),t.put("components/tags/components/add-tag-button.html",'\n '),t.put("components/tags/components/add-tag-input.html",'\n
    \n \n \n \n \n
    '),t.put("components/tags/tag/tag.html",'\n'),t.put("components/tags/tag-dropdown/tag-dropdown.html",'\n
      \n
    • \n
      {{tag[0]}}
      \n
    • \n
    '),t.put("components/tags/tag-line-common/tag-line-common.html",'\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n \n \n
    '),t.put("components/tags/tag-line-detail/tag-line-detail.html",'\n'),t.put("components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("epics/dashboard/epic-row/epic-row.html",'\n
    \n \n
    \n {{::vm.epic.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    {{vm.epic.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n \n
      \n
    • {{status.name}}
    • \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("epics/dashboard/epics-table/epics-table.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
    '), -t.put("epics/dashboard/story-row/story-row.html",'\n
    \n
    \n {{::vm.story.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    {{::vm.story.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{::vm.story.get(\'milestone_name\')}}
    \n
    {{::vm.story.getIn([\'assigned_to_extra_info\', \'full_name_display\'])}}
    \n
    {{EPICS.DASHBOARD.UNASSIGNED | translate}}
    \n
    {{vm.story.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories-create/related-userstories-create.html",'\n \n'),t.put("epics/related-userstories/related-userstory-row/related-userstory-row.html",'\n\n
    \n \n
    \n\n
    {{::vm.userstory.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{vm.userstory.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    {{ vm.avatar.full_name_display }}\n
    {{ vm.getAssignedToFullNameDisplay() }}
    \n
    \n
    \n
    '),t.put("discover/components/discover-home-order-by/discover-home-order-by.html",'\n
    {{vm.currentText()}}\n \n
      \n
    • {{ \'DISCOVER.FILTERS.WEEK\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.MONTH\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.YEAR\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.ALL_TIME\' | translate }}
    • \n
    \n
    '),t.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
    '),t.put("discover/components/discover-search-list-header/discover-search-list-header.html",'\n'),t.put("discover/components/featured-projects/featured-projects.html",'\n'),t.put("discover/components/highlighted/highlighted.html",'\n
    \n
    \n
    \n
    \n
    \n

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

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

    {{ ::project.get(\'description\') | limitTo:150 }}{{ ::project.get(\'description\').length < 150 ? \'\' : \'...\'}}

    \n
    \n
    \n \n
    '),t.put("discover/components/most-active/most-active.html",'\n
    \n
    \n
    \n \n

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

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

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

    \n
    \n \n
    \n \n
    \n
    \n {{ \'DISCOVER.MOST_LIKED_EMPTY\' | translate }}\n
    '),t.put("history/history/history-templates/blocked.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/client-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-assigned.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    '),t.put("history/history/history-templates/history-color.html",'\n
    \n \n
    '),t.put("history/history/history-templates/history-custom-attributes.html",'\n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    '),t.put("history/history/history-templates/history-description.html",'\n
    \n

    \n

    \n

    \n
    '),t.put("history/history/history-templates/history-milestone.html",'\n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    '),t.put("history/history/history-templates/history-points.html",'\n
    {{diff[0]}}\n {{diff[1]}}\n
    '),t.put("history/history/history-templates/history-status.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-subject.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-tags.html",'\n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    '),t.put("history/history/history-templates/history-type.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/team-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("profile/profile-favs/items/project.html",'\n
    \n
    \n
    \n
    \n

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

    \n

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

    \n
    \n
    \n
    \n
    \n {{ ::vm.item.get(\'total_fans\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("profile/profile-favs/items/ticket.html",'\n
    {{ ::vm.item.getIn([\'assigned_to_extra_info\', \'full_name_display\']) }}{{ \'COMMON.ASSIGNED_TO.NOT_ASSIGNED\'|translate }}\n
    \n

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

    \n

    \n
    \n
    \n {{ ::vm.item.get(\'total_voters\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '), -t.put("projects/components/contact-project-button/contact-project-button.html",'\n'),t.put("projects/components/lb-contact-project/lb-contact-project.html",'\n\n'),t.put("projects/components/like-project-button/like-project-button.html",'\n'),t.put("projects/components/watch-project-button/watch-project-button.html",'\n\n'),t.put("projects/create/asana-import/asana-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/create-project-form/create-project-form.html",'\n
    \n
    \n \n

    \n
    \n

    \n
    \n \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("projects/create/create-project-members-restrictions/create-project-members-restrictions.html",'\n
    \n \n
    \n
    \n \n
    '),t.put("projects/create/create-project-restrictions/create-project-restrictions.html",'\n
    \n {{ \'PROJECT.CREATE.MAX_PRIVATE_PROJECTS\' | translate }}\n
    \n
    \n {{ \'PROJECT.CREATE.MAX_PUBLIC_PROJECTS\' | translate }}\n
    '),t.put("projects/create/duplicate/duplicate-project.html",'\n
    \n

    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    '),t.put("projects/create/github-import/github-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/import/import-header.html",'\n
    \n

    \n

    \n
    '),t.put("projects/create/import/import-project-error-lb.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
    '),t.put("projects/create/import/import-project.html",'\n
    \n
    \n
      \n
    • \n
    • \n \n
      Jira\n

      \n
      \n \n \n \n
      \n
      \n
    • \n
    • \n \n
      Github\n

      \n
      \n
    • \n
    • \n \n
      Trello\n

      \n
      \n
    • \n
    • \n \n
      Asana\n

      \n
      \n
    • \n
    \n
    \n \n
    \n
    \n\n\n\n'),t.put("projects/create/import-project-form-common/actions.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/description.html",'\n
    \n \n
    '),t.put("projects/create/import-project-form-common/links.html",'\n
    \n \n
    \n \n
    \n
    \n
    '),t.put("projects/create/import-project-form-common/name.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/project-privacy.html",'\n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    '),t.put("projects/create/import-project-members/import-project-members.html",'\n
    \n
    \n

    \n

    \n \n
    \n \n \n
    \n
      \n
    • \n
      \n
      {{member.get(\'full_name\')[0].toUpperCase()}}
      \n
      {{member.get(\'full_name\') || member.get(\'username\') }}\n
      \n
      \n
      \n \n \n
      \n
      \n {{vm.getUser(member).get(\'full_name\') || vm.getUser(member)}}\n
      \n \n
      \n
    • \n
    \n
    \n \n \n
    \n \n \n
    '),t.put("projects/create/import-project-selector/import-project-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
      \n
    • {{project.name}}
    • \n
    \n
    \n

    {{ vm.noProjectsMsg }}

    \n
    \n
    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("projects/create/import-taiga/import-taiga.html",'\n\n\n
    Taiga\n

    \n
    '),t.put("projects/create/invite-members/invite-members.html",'\n
    \n
    \n \n
    \n
    '),t.put("projects/create/jira-import/jira-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/select-import-user-lightbox/select-import-user-lightbox.html",'\n\n
    \n
    \n
    {{vm.user.get(\'full_name\')[0].toUpperCase() || vm.user.get(\'username\')[0].toUpperCase()}}
    \n
    {{vm.user.get(\'full_name\') || vm.user.get(\'username\')}}\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    '), -t.put("projects/create/trello-import/trello-import.html",'\n\n\n'),t.put("projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html",'\n\n
    \n

    \n

    \n
    \n \n \n
    \n
    '),t.put("wiki/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    ')}]); \ No newline at end of file diff --git a/dist/v-1520418874500/emojis/0023-20e3.png b/dist/v-1521124836513/emojis/0023-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0023-20e3.png rename to dist/v-1521124836513/emojis/0023-20e3.png diff --git a/dist/v-1520418874500/emojis/002a-20e3.png b/dist/v-1521124836513/emojis/002a-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/002a-20e3.png rename to dist/v-1521124836513/emojis/002a-20e3.png diff --git a/dist/v-1520418874500/emojis/0030-20e3.png b/dist/v-1521124836513/emojis/0030-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0030-20e3.png rename to dist/v-1521124836513/emojis/0030-20e3.png diff --git a/dist/v-1520418874500/emojis/0031-20e3.png b/dist/v-1521124836513/emojis/0031-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0031-20e3.png rename to dist/v-1521124836513/emojis/0031-20e3.png diff --git a/dist/v-1520418874500/emojis/0032-20e3.png b/dist/v-1521124836513/emojis/0032-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0032-20e3.png rename to dist/v-1521124836513/emojis/0032-20e3.png diff --git a/dist/v-1520418874500/emojis/0033-20e3.png b/dist/v-1521124836513/emojis/0033-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0033-20e3.png rename to dist/v-1521124836513/emojis/0033-20e3.png diff --git a/dist/v-1520418874500/emojis/0034-20e3.png b/dist/v-1521124836513/emojis/0034-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0034-20e3.png rename to dist/v-1521124836513/emojis/0034-20e3.png diff --git a/dist/v-1520418874500/emojis/0035-20e3.png b/dist/v-1521124836513/emojis/0035-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0035-20e3.png rename to dist/v-1521124836513/emojis/0035-20e3.png diff --git a/dist/v-1520418874500/emojis/0036-20e3.png b/dist/v-1521124836513/emojis/0036-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0036-20e3.png rename to dist/v-1521124836513/emojis/0036-20e3.png diff --git a/dist/v-1520418874500/emojis/0037-20e3.png b/dist/v-1521124836513/emojis/0037-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0037-20e3.png rename to dist/v-1521124836513/emojis/0037-20e3.png diff --git a/dist/v-1520418874500/emojis/0038-20e3.png b/dist/v-1521124836513/emojis/0038-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0038-20e3.png rename to dist/v-1521124836513/emojis/0038-20e3.png diff --git a/dist/v-1520418874500/emojis/0039-20e3.png b/dist/v-1521124836513/emojis/0039-20e3.png similarity index 100% rename from dist/v-1520418874500/emojis/0039-20e3.png rename to dist/v-1521124836513/emojis/0039-20e3.png diff --git a/dist/v-1520418874500/emojis/1f004.png b/dist/v-1521124836513/emojis/1f004.png similarity index 100% rename from dist/v-1520418874500/emojis/1f004.png rename to dist/v-1521124836513/emojis/1f004.png diff --git a/dist/v-1520418874500/emojis/1f0cf.png b/dist/v-1521124836513/emojis/1f0cf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f0cf.png rename to dist/v-1521124836513/emojis/1f0cf.png diff --git a/dist/v-1520418874500/emojis/1f170.png b/dist/v-1521124836513/emojis/1f170.png similarity index 100% rename from dist/v-1520418874500/emojis/1f170.png rename to dist/v-1521124836513/emojis/1f170.png diff --git a/dist/v-1520418874500/emojis/1f171.png b/dist/v-1521124836513/emojis/1f171.png similarity index 100% rename from dist/v-1520418874500/emojis/1f171.png rename to dist/v-1521124836513/emojis/1f171.png diff --git a/dist/v-1520418874500/emojis/1f17e.png b/dist/v-1521124836513/emojis/1f17e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f17e.png rename to dist/v-1521124836513/emojis/1f17e.png diff --git a/dist/v-1520418874500/emojis/1f17f.png b/dist/v-1521124836513/emojis/1f17f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f17f.png rename to dist/v-1521124836513/emojis/1f17f.png diff --git a/dist/v-1520418874500/emojis/1f18e.png b/dist/v-1521124836513/emojis/1f18e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f18e.png rename to dist/v-1521124836513/emojis/1f18e.png diff --git a/dist/v-1520418874500/emojis/1f191.png b/dist/v-1521124836513/emojis/1f191.png similarity index 100% rename from dist/v-1520418874500/emojis/1f191.png rename to dist/v-1521124836513/emojis/1f191.png diff --git a/dist/v-1520418874500/emojis/1f192.png b/dist/v-1521124836513/emojis/1f192.png similarity index 100% rename from dist/v-1520418874500/emojis/1f192.png rename to dist/v-1521124836513/emojis/1f192.png diff --git a/dist/v-1520418874500/emojis/1f193.png b/dist/v-1521124836513/emojis/1f193.png similarity index 100% rename from dist/v-1520418874500/emojis/1f193.png rename to dist/v-1521124836513/emojis/1f193.png diff --git a/dist/v-1520418874500/emojis/1f194.png b/dist/v-1521124836513/emojis/1f194.png similarity index 100% rename from dist/v-1520418874500/emojis/1f194.png rename to dist/v-1521124836513/emojis/1f194.png diff --git a/dist/v-1520418874500/emojis/1f195.png b/dist/v-1521124836513/emojis/1f195.png similarity index 100% rename from dist/v-1520418874500/emojis/1f195.png rename to dist/v-1521124836513/emojis/1f195.png diff --git a/dist/v-1520418874500/emojis/1f196.png b/dist/v-1521124836513/emojis/1f196.png similarity index 100% rename from dist/v-1520418874500/emojis/1f196.png rename to dist/v-1521124836513/emojis/1f196.png diff --git a/dist/v-1520418874500/emojis/1f197.png b/dist/v-1521124836513/emojis/1f197.png similarity index 100% rename from dist/v-1520418874500/emojis/1f197.png rename to dist/v-1521124836513/emojis/1f197.png diff --git a/dist/v-1520418874500/emojis/1f198.png b/dist/v-1521124836513/emojis/1f198.png similarity index 100% rename from dist/v-1520418874500/emojis/1f198.png rename to dist/v-1521124836513/emojis/1f198.png diff --git a/dist/v-1520418874500/emojis/1f199.png b/dist/v-1521124836513/emojis/1f199.png similarity index 100% rename from dist/v-1520418874500/emojis/1f199.png rename to dist/v-1521124836513/emojis/1f199.png diff --git a/dist/v-1520418874500/emojis/1f19a.png b/dist/v-1521124836513/emojis/1f19a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f19a.png rename to dist/v-1521124836513/emojis/1f19a.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1e8.png b/dist/v-1521124836513/emojis/1f1e6-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1e8.png rename to dist/v-1521124836513/emojis/1f1e6-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1e9.png b/dist/v-1521124836513/emojis/1f1e6-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1e9.png rename to dist/v-1521124836513/emojis/1f1e6-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1ea.png b/dist/v-1521124836513/emojis/1f1e6-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1ea.png rename to dist/v-1521124836513/emojis/1f1e6-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1eb.png b/dist/v-1521124836513/emojis/1f1e6-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1eb.png rename to dist/v-1521124836513/emojis/1f1e6-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1ec.png b/dist/v-1521124836513/emojis/1f1e6-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1ec.png rename to dist/v-1521124836513/emojis/1f1e6-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1ee.png b/dist/v-1521124836513/emojis/1f1e6-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1ee.png rename to dist/v-1521124836513/emojis/1f1e6-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f1.png b/dist/v-1521124836513/emojis/1f1e6-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f1.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f2.png b/dist/v-1521124836513/emojis/1f1e6-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f2.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f4.png b/dist/v-1521124836513/emojis/1f1e6-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f4.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f6.png b/dist/v-1521124836513/emojis/1f1e6-1f1f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f6.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f6.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f7.png b/dist/v-1521124836513/emojis/1f1e6-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f7.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f8.png b/dist/v-1521124836513/emojis/1f1e6-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f8.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1f9.png b/dist/v-1521124836513/emojis/1f1e6-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1f9.png rename to dist/v-1521124836513/emojis/1f1e6-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1fa.png b/dist/v-1521124836513/emojis/1f1e6-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1fa.png rename to dist/v-1521124836513/emojis/1f1e6-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1fc.png b/dist/v-1521124836513/emojis/1f1e6-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1fc.png rename to dist/v-1521124836513/emojis/1f1e6-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1fd.png b/dist/v-1521124836513/emojis/1f1e6-1f1fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1fd.png rename to dist/v-1521124836513/emojis/1f1e6-1f1fd.png diff --git a/dist/v-1520418874500/emojis/1f1e6-1f1ff.png b/dist/v-1521124836513/emojis/1f1e6-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e6-1f1ff.png rename to dist/v-1521124836513/emojis/1f1e6-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1e6.png b/dist/v-1521124836513/emojis/1f1e7-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1e6.png rename to dist/v-1521124836513/emojis/1f1e7-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1e7.png b/dist/v-1521124836513/emojis/1f1e7-1f1e7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1e7.png rename to dist/v-1521124836513/emojis/1f1e7-1f1e7.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1e9.png b/dist/v-1521124836513/emojis/1f1e7-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1e9.png rename to dist/v-1521124836513/emojis/1f1e7-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1ea.png b/dist/v-1521124836513/emojis/1f1e7-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1ea.png rename to dist/v-1521124836513/emojis/1f1e7-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1eb.png b/dist/v-1521124836513/emojis/1f1e7-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1eb.png rename to dist/v-1521124836513/emojis/1f1e7-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1ec.png b/dist/v-1521124836513/emojis/1f1e7-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1ec.png rename to dist/v-1521124836513/emojis/1f1e7-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1ed.png b/dist/v-1521124836513/emojis/1f1e7-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1ed.png rename to dist/v-1521124836513/emojis/1f1e7-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1ee.png b/dist/v-1521124836513/emojis/1f1e7-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1ee.png rename to dist/v-1521124836513/emojis/1f1e7-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1ef.png b/dist/v-1521124836513/emojis/1f1e7-1f1ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1ef.png rename to dist/v-1521124836513/emojis/1f1e7-1f1ef.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f1.png b/dist/v-1521124836513/emojis/1f1e7-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f1.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f2.png b/dist/v-1521124836513/emojis/1f1e7-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f2.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f3.png b/dist/v-1521124836513/emojis/1f1e7-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f3.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f4.png b/dist/v-1521124836513/emojis/1f1e7-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f4.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f6.png b/dist/v-1521124836513/emojis/1f1e7-1f1f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f6.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f6.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f7.png b/dist/v-1521124836513/emojis/1f1e7-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f7.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f8.png b/dist/v-1521124836513/emojis/1f1e7-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f8.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1f9.png b/dist/v-1521124836513/emojis/1f1e7-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1f9.png rename to dist/v-1521124836513/emojis/1f1e7-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1fb.png b/dist/v-1521124836513/emojis/1f1e7-1f1fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1fb.png rename to dist/v-1521124836513/emojis/1f1e7-1f1fb.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1fc.png b/dist/v-1521124836513/emojis/1f1e7-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1fc.png rename to dist/v-1521124836513/emojis/1f1e7-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1fe.png b/dist/v-1521124836513/emojis/1f1e7-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1fe.png rename to dist/v-1521124836513/emojis/1f1e7-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1e7-1f1ff.png b/dist/v-1521124836513/emojis/1f1e7-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e7-1f1ff.png rename to dist/v-1521124836513/emojis/1f1e7-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1e6.png b/dist/v-1521124836513/emojis/1f1e8-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1e6.png rename to dist/v-1521124836513/emojis/1f1e8-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1e8.png b/dist/v-1521124836513/emojis/1f1e8-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1e8.png rename to dist/v-1521124836513/emojis/1f1e8-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1e9.png b/dist/v-1521124836513/emojis/1f1e8-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1e9.png rename to dist/v-1521124836513/emojis/1f1e8-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1eb.png b/dist/v-1521124836513/emojis/1f1e8-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1eb.png rename to dist/v-1521124836513/emojis/1f1e8-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1ec.png b/dist/v-1521124836513/emojis/1f1e8-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1ec.png rename to dist/v-1521124836513/emojis/1f1e8-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1ed.png b/dist/v-1521124836513/emojis/1f1e8-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1ed.png rename to dist/v-1521124836513/emojis/1f1e8-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1ee.png b/dist/v-1521124836513/emojis/1f1e8-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1ee.png rename to dist/v-1521124836513/emojis/1f1e8-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f0.png b/dist/v-1521124836513/emojis/1f1e8-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f0.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f1.png b/dist/v-1521124836513/emojis/1f1e8-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f1.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f2.png b/dist/v-1521124836513/emojis/1f1e8-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f2.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f3.png b/dist/v-1521124836513/emojis/1f1e8-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f3.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f4.png b/dist/v-1521124836513/emojis/1f1e8-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f4.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f5.png b/dist/v-1521124836513/emojis/1f1e8-1f1f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f5.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f5.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1f7.png b/dist/v-1521124836513/emojis/1f1e8-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1f7.png rename to dist/v-1521124836513/emojis/1f1e8-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1fa.png b/dist/v-1521124836513/emojis/1f1e8-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1fa.png rename to dist/v-1521124836513/emojis/1f1e8-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1fb.png b/dist/v-1521124836513/emojis/1f1e8-1f1fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1fb.png rename to dist/v-1521124836513/emojis/1f1e8-1f1fb.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1fc.png b/dist/v-1521124836513/emojis/1f1e8-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1fc.png rename to dist/v-1521124836513/emojis/1f1e8-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1fd.png b/dist/v-1521124836513/emojis/1f1e8-1f1fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1fd.png rename to dist/v-1521124836513/emojis/1f1e8-1f1fd.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1fe.png b/dist/v-1521124836513/emojis/1f1e8-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1fe.png rename to dist/v-1521124836513/emojis/1f1e8-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1e8-1f1ff.png b/dist/v-1521124836513/emojis/1f1e8-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e8-1f1ff.png rename to dist/v-1521124836513/emojis/1f1e8-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1ea.png b/dist/v-1521124836513/emojis/1f1e9-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1ea.png rename to dist/v-1521124836513/emojis/1f1e9-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1ec.png b/dist/v-1521124836513/emojis/1f1e9-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1ec.png rename to dist/v-1521124836513/emojis/1f1e9-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1ef.png b/dist/v-1521124836513/emojis/1f1e9-1f1ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1ef.png rename to dist/v-1521124836513/emojis/1f1e9-1f1ef.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1f0.png b/dist/v-1521124836513/emojis/1f1e9-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1f0.png rename to dist/v-1521124836513/emojis/1f1e9-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1f2.png b/dist/v-1521124836513/emojis/1f1e9-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1f2.png rename to dist/v-1521124836513/emojis/1f1e9-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1f4.png b/dist/v-1521124836513/emojis/1f1e9-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1f4.png rename to dist/v-1521124836513/emojis/1f1e9-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1e9-1f1ff.png b/dist/v-1521124836513/emojis/1f1e9-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1e9-1f1ff.png rename to dist/v-1521124836513/emojis/1f1e9-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1e6.png b/dist/v-1521124836513/emojis/1f1ea-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1e6.png rename to dist/v-1521124836513/emojis/1f1ea-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1e8.png b/dist/v-1521124836513/emojis/1f1ea-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1e8.png rename to dist/v-1521124836513/emojis/1f1ea-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1ea.png b/dist/v-1521124836513/emojis/1f1ea-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1ea.png rename to dist/v-1521124836513/emojis/1f1ea-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1ec.png b/dist/v-1521124836513/emojis/1f1ea-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1ec.png rename to dist/v-1521124836513/emojis/1f1ea-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1ed.png b/dist/v-1521124836513/emojis/1f1ea-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1ed.png rename to dist/v-1521124836513/emojis/1f1ea-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1f7.png b/dist/v-1521124836513/emojis/1f1ea-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1f7.png rename to dist/v-1521124836513/emojis/1f1ea-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1f8.png b/dist/v-1521124836513/emojis/1f1ea-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1f8.png rename to dist/v-1521124836513/emojis/1f1ea-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1f9.png b/dist/v-1521124836513/emojis/1f1ea-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1f9.png rename to dist/v-1521124836513/emojis/1f1ea-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1ea-1f1fa.png b/dist/v-1521124836513/emojis/1f1ea-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ea-1f1fa.png rename to dist/v-1521124836513/emojis/1f1ea-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1eb-1f1ee.png b/dist/v-1521124836513/emojis/1f1eb-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1eb-1f1ee.png rename to dist/v-1521124836513/emojis/1f1eb-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1eb-1f1ef.png b/dist/v-1521124836513/emojis/1f1eb-1f1ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1eb-1f1ef.png rename to dist/v-1521124836513/emojis/1f1eb-1f1ef.png diff --git a/dist/v-1520418874500/emojis/1f1eb-1f1f0.png b/dist/v-1521124836513/emojis/1f1eb-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1eb-1f1f0.png rename to dist/v-1521124836513/emojis/1f1eb-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1eb-1f1f2.png b/dist/v-1521124836513/emojis/1f1eb-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1eb-1f1f2.png rename to dist/v-1521124836513/emojis/1f1eb-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1eb-1f1f4.png b/dist/v-1521124836513/emojis/1f1eb-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1eb-1f1f4.png rename to dist/v-1521124836513/emojis/1f1eb-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1eb-1f1f7.png b/dist/v-1521124836513/emojis/1f1eb-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1eb-1f1f7.png rename to dist/v-1521124836513/emojis/1f1eb-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1e6.png b/dist/v-1521124836513/emojis/1f1ec-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1e6.png rename to dist/v-1521124836513/emojis/1f1ec-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1e7.png b/dist/v-1521124836513/emojis/1f1ec-1f1e7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1e7.png rename to dist/v-1521124836513/emojis/1f1ec-1f1e7.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1e9.png b/dist/v-1521124836513/emojis/1f1ec-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1e9.png rename to dist/v-1521124836513/emojis/1f1ec-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1ea.png b/dist/v-1521124836513/emojis/1f1ec-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1ea.png rename to dist/v-1521124836513/emojis/1f1ec-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1eb.png b/dist/v-1521124836513/emojis/1f1ec-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1eb.png rename to dist/v-1521124836513/emojis/1f1ec-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1ec.png b/dist/v-1521124836513/emojis/1f1ec-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1ec.png rename to dist/v-1521124836513/emojis/1f1ec-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1ed.png b/dist/v-1521124836513/emojis/1f1ec-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1ed.png rename to dist/v-1521124836513/emojis/1f1ec-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1ee.png b/dist/v-1521124836513/emojis/1f1ec-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1ee.png rename to dist/v-1521124836513/emojis/1f1ec-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f1.png b/dist/v-1521124836513/emojis/1f1ec-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f1.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f2.png b/dist/v-1521124836513/emojis/1f1ec-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f2.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f3.png b/dist/v-1521124836513/emojis/1f1ec-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f3.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f5.png b/dist/v-1521124836513/emojis/1f1ec-1f1f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f5.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f5.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f6.png b/dist/v-1521124836513/emojis/1f1ec-1f1f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f6.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f6.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f7.png b/dist/v-1521124836513/emojis/1f1ec-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f7.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f8.png b/dist/v-1521124836513/emojis/1f1ec-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f8.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1f9.png b/dist/v-1521124836513/emojis/1f1ec-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1f9.png rename to dist/v-1521124836513/emojis/1f1ec-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1fa.png b/dist/v-1521124836513/emojis/1f1ec-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1fa.png rename to dist/v-1521124836513/emojis/1f1ec-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1fc.png b/dist/v-1521124836513/emojis/1f1ec-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1fc.png rename to dist/v-1521124836513/emojis/1f1ec-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1ec-1f1fe.png b/dist/v-1521124836513/emojis/1f1ec-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ec-1f1fe.png rename to dist/v-1521124836513/emojis/1f1ec-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1ed-1f1f0.png b/dist/v-1521124836513/emojis/1f1ed-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ed-1f1f0.png rename to dist/v-1521124836513/emojis/1f1ed-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1ed-1f1f2.png b/dist/v-1521124836513/emojis/1f1ed-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ed-1f1f2.png rename to dist/v-1521124836513/emojis/1f1ed-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1ed-1f1f3.png b/dist/v-1521124836513/emojis/1f1ed-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ed-1f1f3.png rename to dist/v-1521124836513/emojis/1f1ed-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1ed-1f1f7.png b/dist/v-1521124836513/emojis/1f1ed-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ed-1f1f7.png rename to dist/v-1521124836513/emojis/1f1ed-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1ed-1f1f9.png b/dist/v-1521124836513/emojis/1f1ed-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ed-1f1f9.png rename to dist/v-1521124836513/emojis/1f1ed-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1ed-1f1fa.png b/dist/v-1521124836513/emojis/1f1ed-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ed-1f1fa.png rename to dist/v-1521124836513/emojis/1f1ed-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1e8.png b/dist/v-1521124836513/emojis/1f1ee-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1e8.png rename to dist/v-1521124836513/emojis/1f1ee-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1e9.png b/dist/v-1521124836513/emojis/1f1ee-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1e9.png rename to dist/v-1521124836513/emojis/1f1ee-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1ea.png b/dist/v-1521124836513/emojis/1f1ee-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1ea.png rename to dist/v-1521124836513/emojis/1f1ee-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f1.png b/dist/v-1521124836513/emojis/1f1ee-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f1.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f2.png b/dist/v-1521124836513/emojis/1f1ee-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f2.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f3.png b/dist/v-1521124836513/emojis/1f1ee-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f3.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f4.png b/dist/v-1521124836513/emojis/1f1ee-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f4.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f6.png b/dist/v-1521124836513/emojis/1f1ee-1f1f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f6.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f6.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f7.png b/dist/v-1521124836513/emojis/1f1ee-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f7.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f8.png b/dist/v-1521124836513/emojis/1f1ee-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f8.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1ee-1f1f9.png b/dist/v-1521124836513/emojis/1f1ee-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ee-1f1f9.png rename to dist/v-1521124836513/emojis/1f1ee-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1ef-1f1ea.png b/dist/v-1521124836513/emojis/1f1ef-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ef-1f1ea.png rename to dist/v-1521124836513/emojis/1f1ef-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1ef-1f1f2.png b/dist/v-1521124836513/emojis/1f1ef-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ef-1f1f2.png rename to dist/v-1521124836513/emojis/1f1ef-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1ef-1f1f4.png b/dist/v-1521124836513/emojis/1f1ef-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ef-1f1f4.png rename to dist/v-1521124836513/emojis/1f1ef-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1ef-1f1f5.png b/dist/v-1521124836513/emojis/1f1ef-1f1f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ef-1f1f5.png rename to dist/v-1521124836513/emojis/1f1ef-1f1f5.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1ea.png b/dist/v-1521124836513/emojis/1f1f0-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1ea.png rename to dist/v-1521124836513/emojis/1f1f0-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1ec.png b/dist/v-1521124836513/emojis/1f1f0-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1ec.png rename to dist/v-1521124836513/emojis/1f1f0-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1ed.png b/dist/v-1521124836513/emojis/1f1f0-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1ed.png rename to dist/v-1521124836513/emojis/1f1f0-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1ee.png b/dist/v-1521124836513/emojis/1f1f0-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1ee.png rename to dist/v-1521124836513/emojis/1f1f0-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1f2.png b/dist/v-1521124836513/emojis/1f1f0-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1f2.png rename to dist/v-1521124836513/emojis/1f1f0-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1f3.png b/dist/v-1521124836513/emojis/1f1f0-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1f3.png rename to dist/v-1521124836513/emojis/1f1f0-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1f5.png b/dist/v-1521124836513/emojis/1f1f0-1f1f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1f5.png rename to dist/v-1521124836513/emojis/1f1f0-1f1f5.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1f7.png b/dist/v-1521124836513/emojis/1f1f0-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f0-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1fc.png b/dist/v-1521124836513/emojis/1f1f0-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1fc.png rename to dist/v-1521124836513/emojis/1f1f0-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1fe.png b/dist/v-1521124836513/emojis/1f1f0-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1fe.png rename to dist/v-1521124836513/emojis/1f1f0-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1f0-1f1ff.png b/dist/v-1521124836513/emojis/1f1f0-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f0-1f1ff.png rename to dist/v-1521124836513/emojis/1f1f0-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1e6.png b/dist/v-1521124836513/emojis/1f1f1-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f1-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1e7.png b/dist/v-1521124836513/emojis/1f1f1-1f1e7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1e7.png rename to dist/v-1521124836513/emojis/1f1f1-1f1e7.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1e8.png b/dist/v-1521124836513/emojis/1f1f1-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1e8.png rename to dist/v-1521124836513/emojis/1f1f1-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1ee.png b/dist/v-1521124836513/emojis/1f1f1-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1ee.png rename to dist/v-1521124836513/emojis/1f1f1-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1f0.png b/dist/v-1521124836513/emojis/1f1f1-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1f0.png rename to dist/v-1521124836513/emojis/1f1f1-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1f7.png b/dist/v-1521124836513/emojis/1f1f1-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f1-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1f8.png b/dist/v-1521124836513/emojis/1f1f1-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1f8.png rename to dist/v-1521124836513/emojis/1f1f1-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1f9.png b/dist/v-1521124836513/emojis/1f1f1-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1f9.png rename to dist/v-1521124836513/emojis/1f1f1-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1fa.png b/dist/v-1521124836513/emojis/1f1f1-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1fa.png rename to dist/v-1521124836513/emojis/1f1f1-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1fb.png b/dist/v-1521124836513/emojis/1f1f1-1f1fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1fb.png rename to dist/v-1521124836513/emojis/1f1f1-1f1fb.png diff --git a/dist/v-1520418874500/emojis/1f1f1-1f1fe.png b/dist/v-1521124836513/emojis/1f1f1-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f1-1f1fe.png rename to dist/v-1521124836513/emojis/1f1f1-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1e6.png b/dist/v-1521124836513/emojis/1f1f2-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f2-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1e8.png b/dist/v-1521124836513/emojis/1f1f2-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1e8.png rename to dist/v-1521124836513/emojis/1f1f2-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1e9.png b/dist/v-1521124836513/emojis/1f1f2-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1e9.png rename to dist/v-1521124836513/emojis/1f1f2-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1ea.png b/dist/v-1521124836513/emojis/1f1f2-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1ea.png rename to dist/v-1521124836513/emojis/1f1f2-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1eb.png b/dist/v-1521124836513/emojis/1f1f2-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1eb.png rename to dist/v-1521124836513/emojis/1f1f2-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1ec.png b/dist/v-1521124836513/emojis/1f1f2-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1ec.png rename to dist/v-1521124836513/emojis/1f1f2-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1ed.png b/dist/v-1521124836513/emojis/1f1f2-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1ed.png rename to dist/v-1521124836513/emojis/1f1f2-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f0.png b/dist/v-1521124836513/emojis/1f1f2-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f0.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f1.png b/dist/v-1521124836513/emojis/1f1f2-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f1.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f2.png b/dist/v-1521124836513/emojis/1f1f2-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f2.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f3.png b/dist/v-1521124836513/emojis/1f1f2-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f3.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f4.png b/dist/v-1521124836513/emojis/1f1f2-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f4.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f5.png b/dist/v-1521124836513/emojis/1f1f2-1f1f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f5.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f5.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f6.png b/dist/v-1521124836513/emojis/1f1f2-1f1f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f6.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f6.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f7.png b/dist/v-1521124836513/emojis/1f1f2-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f8.png b/dist/v-1521124836513/emojis/1f1f2-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f8.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1f9.png b/dist/v-1521124836513/emojis/1f1f2-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1f9.png rename to dist/v-1521124836513/emojis/1f1f2-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1fa.png b/dist/v-1521124836513/emojis/1f1f2-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1fa.png rename to dist/v-1521124836513/emojis/1f1f2-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1fb.png b/dist/v-1521124836513/emojis/1f1f2-1f1fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1fb.png rename to dist/v-1521124836513/emojis/1f1f2-1f1fb.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1fc.png b/dist/v-1521124836513/emojis/1f1f2-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1fc.png rename to dist/v-1521124836513/emojis/1f1f2-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1fd.png b/dist/v-1521124836513/emojis/1f1f2-1f1fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1fd.png rename to dist/v-1521124836513/emojis/1f1f2-1f1fd.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1fe.png b/dist/v-1521124836513/emojis/1f1f2-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1fe.png rename to dist/v-1521124836513/emojis/1f1f2-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1f2-1f1ff.png b/dist/v-1521124836513/emojis/1f1f2-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f2-1f1ff.png rename to dist/v-1521124836513/emojis/1f1f2-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1e6.png b/dist/v-1521124836513/emojis/1f1f3-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f3-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1e8.png b/dist/v-1521124836513/emojis/1f1f3-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1e8.png rename to dist/v-1521124836513/emojis/1f1f3-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1ea.png b/dist/v-1521124836513/emojis/1f1f3-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1ea.png rename to dist/v-1521124836513/emojis/1f1f3-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1eb.png b/dist/v-1521124836513/emojis/1f1f3-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1eb.png rename to dist/v-1521124836513/emojis/1f1f3-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1ec.png b/dist/v-1521124836513/emojis/1f1f3-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1ec.png rename to dist/v-1521124836513/emojis/1f1f3-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1ee.png b/dist/v-1521124836513/emojis/1f1f3-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1ee.png rename to dist/v-1521124836513/emojis/1f1f3-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1f1.png b/dist/v-1521124836513/emojis/1f1f3-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1f1.png rename to dist/v-1521124836513/emojis/1f1f3-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1f4.png b/dist/v-1521124836513/emojis/1f1f3-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1f4.png rename to dist/v-1521124836513/emojis/1f1f3-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1f5.png b/dist/v-1521124836513/emojis/1f1f3-1f1f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1f5.png rename to dist/v-1521124836513/emojis/1f1f3-1f1f5.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1f7.png b/dist/v-1521124836513/emojis/1f1f3-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f3-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1fa.png b/dist/v-1521124836513/emojis/1f1f3-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1fa.png rename to dist/v-1521124836513/emojis/1f1f3-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1f3-1f1ff.png b/dist/v-1521124836513/emojis/1f1f3-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f3-1f1ff.png rename to dist/v-1521124836513/emojis/1f1f3-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1f4-1f1f2.png b/dist/v-1521124836513/emojis/1f1f4-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f4-1f1f2.png rename to dist/v-1521124836513/emojis/1f1f4-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1e6.png b/dist/v-1521124836513/emojis/1f1f5-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f5-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1ea.png b/dist/v-1521124836513/emojis/1f1f5-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1ea.png rename to dist/v-1521124836513/emojis/1f1f5-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1eb.png b/dist/v-1521124836513/emojis/1f1f5-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1eb.png rename to dist/v-1521124836513/emojis/1f1f5-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1ec.png b/dist/v-1521124836513/emojis/1f1f5-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1ec.png rename to dist/v-1521124836513/emojis/1f1f5-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1ed.png b/dist/v-1521124836513/emojis/1f1f5-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1ed.png rename to dist/v-1521124836513/emojis/1f1f5-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f0.png b/dist/v-1521124836513/emojis/1f1f5-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f0.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f1.png b/dist/v-1521124836513/emojis/1f1f5-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f1.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f2.png b/dist/v-1521124836513/emojis/1f1f5-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f2.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f3.png b/dist/v-1521124836513/emojis/1f1f5-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f3.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f7.png b/dist/v-1521124836513/emojis/1f1f5-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f8.png b/dist/v-1521124836513/emojis/1f1f5-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f8.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1f9.png b/dist/v-1521124836513/emojis/1f1f5-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1f9.png rename to dist/v-1521124836513/emojis/1f1f5-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1fc.png b/dist/v-1521124836513/emojis/1f1f5-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1fc.png rename to dist/v-1521124836513/emojis/1f1f5-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1f5-1f1fe.png b/dist/v-1521124836513/emojis/1f1f5-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f5-1f1fe.png rename to dist/v-1521124836513/emojis/1f1f5-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1f6-1f1e6.png b/dist/v-1521124836513/emojis/1f1f6-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f6-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f6-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f7-1f1ea.png b/dist/v-1521124836513/emojis/1f1f7-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f7-1f1ea.png rename to dist/v-1521124836513/emojis/1f1f7-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1f7-1f1f4.png b/dist/v-1521124836513/emojis/1f1f7-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f7-1f1f4.png rename to dist/v-1521124836513/emojis/1f1f7-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1f7-1f1f8.png b/dist/v-1521124836513/emojis/1f1f7-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f7-1f1f8.png rename to dist/v-1521124836513/emojis/1f1f7-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1f7-1f1fa.png b/dist/v-1521124836513/emojis/1f1f7-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f7-1f1fa.png rename to dist/v-1521124836513/emojis/1f1f7-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1f7-1f1fc.png b/dist/v-1521124836513/emojis/1f1f7-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f7-1f1fc.png rename to dist/v-1521124836513/emojis/1f1f7-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1e6.png b/dist/v-1521124836513/emojis/1f1f8-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f8-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1e7.png b/dist/v-1521124836513/emojis/1f1f8-1f1e7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1e7.png rename to dist/v-1521124836513/emojis/1f1f8-1f1e7.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1e8.png b/dist/v-1521124836513/emojis/1f1f8-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1e8.png rename to dist/v-1521124836513/emojis/1f1f8-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1e9.png b/dist/v-1521124836513/emojis/1f1f8-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1e9.png rename to dist/v-1521124836513/emojis/1f1f8-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1ea.png b/dist/v-1521124836513/emojis/1f1f8-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1ea.png rename to dist/v-1521124836513/emojis/1f1f8-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1ec.png b/dist/v-1521124836513/emojis/1f1f8-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1ec.png rename to dist/v-1521124836513/emojis/1f1f8-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1ed.png b/dist/v-1521124836513/emojis/1f1f8-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1ed.png rename to dist/v-1521124836513/emojis/1f1f8-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1ee.png b/dist/v-1521124836513/emojis/1f1f8-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1ee.png rename to dist/v-1521124836513/emojis/1f1f8-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1ef.png b/dist/v-1521124836513/emojis/1f1f8-1f1ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1ef.png rename to dist/v-1521124836513/emojis/1f1f8-1f1ef.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f0.png b/dist/v-1521124836513/emojis/1f1f8-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f0.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f1.png b/dist/v-1521124836513/emojis/1f1f8-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f1.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f2.png b/dist/v-1521124836513/emojis/1f1f8-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f2.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f3.png b/dist/v-1521124836513/emojis/1f1f8-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f3.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f4.png b/dist/v-1521124836513/emojis/1f1f8-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f4.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f7.png b/dist/v-1521124836513/emojis/1f1f8-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f8.png b/dist/v-1521124836513/emojis/1f1f8-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f8.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1f9.png b/dist/v-1521124836513/emojis/1f1f8-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1f9.png rename to dist/v-1521124836513/emojis/1f1f8-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1fb.png b/dist/v-1521124836513/emojis/1f1f8-1f1fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1fb.png rename to dist/v-1521124836513/emojis/1f1f8-1f1fb.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1fd.png b/dist/v-1521124836513/emojis/1f1f8-1f1fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1fd.png rename to dist/v-1521124836513/emojis/1f1f8-1f1fd.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1fe.png b/dist/v-1521124836513/emojis/1f1f8-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1fe.png rename to dist/v-1521124836513/emojis/1f1f8-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1f8-1f1ff.png b/dist/v-1521124836513/emojis/1f1f8-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f8-1f1ff.png rename to dist/v-1521124836513/emojis/1f1f8-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1e6.png b/dist/v-1521124836513/emojis/1f1f9-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1e6.png rename to dist/v-1521124836513/emojis/1f1f9-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1e8.png b/dist/v-1521124836513/emojis/1f1f9-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1e8.png rename to dist/v-1521124836513/emojis/1f1f9-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1e9.png b/dist/v-1521124836513/emojis/1f1f9-1f1e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1e9.png rename to dist/v-1521124836513/emojis/1f1f9-1f1e9.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1eb.png b/dist/v-1521124836513/emojis/1f1f9-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1eb.png rename to dist/v-1521124836513/emojis/1f1f9-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1ec.png b/dist/v-1521124836513/emojis/1f1f9-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1ec.png rename to dist/v-1521124836513/emojis/1f1f9-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1ed.png b/dist/v-1521124836513/emojis/1f1f9-1f1ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1ed.png rename to dist/v-1521124836513/emojis/1f1f9-1f1ed.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1ef.png b/dist/v-1521124836513/emojis/1f1f9-1f1ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1ef.png rename to dist/v-1521124836513/emojis/1f1f9-1f1ef.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f0.png b/dist/v-1521124836513/emojis/1f1f9-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f0.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f1.png b/dist/v-1521124836513/emojis/1f1f9-1f1f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f1.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f1.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f2.png b/dist/v-1521124836513/emojis/1f1f9-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f2.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f3.png b/dist/v-1521124836513/emojis/1f1f9-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f3.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f4.png b/dist/v-1521124836513/emojis/1f1f9-1f1f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f4.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f4.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f7.png b/dist/v-1521124836513/emojis/1f1f9-1f1f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f7.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f7.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1f9.png b/dist/v-1521124836513/emojis/1f1f9-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1f9.png rename to dist/v-1521124836513/emojis/1f1f9-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1fb.png b/dist/v-1521124836513/emojis/1f1f9-1f1fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1fb.png rename to dist/v-1521124836513/emojis/1f1f9-1f1fb.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1fc.png b/dist/v-1521124836513/emojis/1f1f9-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1fc.png rename to dist/v-1521124836513/emojis/1f1f9-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f1f9-1f1ff.png b/dist/v-1521124836513/emojis/1f1f9-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1f9-1f1ff.png rename to dist/v-1521124836513/emojis/1f1f9-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1e6.png b/dist/v-1521124836513/emojis/1f1fa-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1e6.png rename to dist/v-1521124836513/emojis/1f1fa-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1ec.png b/dist/v-1521124836513/emojis/1f1fa-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1ec.png rename to dist/v-1521124836513/emojis/1f1fa-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1f2.png b/dist/v-1521124836513/emojis/1f1fa-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1f2.png rename to dist/v-1521124836513/emojis/1f1fa-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1f3.png b/dist/v-1521124836513/emojis/1f1fa-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1f3.png rename to dist/v-1521124836513/emojis/1f1fa-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1f8.png b/dist/v-1521124836513/emojis/1f1fa-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1f8.png rename to dist/v-1521124836513/emojis/1f1fa-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1fe.png b/dist/v-1521124836513/emojis/1f1fa-1f1fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1fe.png rename to dist/v-1521124836513/emojis/1f1fa-1f1fe.png diff --git a/dist/v-1520418874500/emojis/1f1fa-1f1ff.png b/dist/v-1521124836513/emojis/1f1fa-1f1ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fa-1f1ff.png rename to dist/v-1521124836513/emojis/1f1fa-1f1ff.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1e6.png b/dist/v-1521124836513/emojis/1f1fb-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1e6.png rename to dist/v-1521124836513/emojis/1f1fb-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1e8.png b/dist/v-1521124836513/emojis/1f1fb-1f1e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1e8.png rename to dist/v-1521124836513/emojis/1f1fb-1f1e8.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1ea.png b/dist/v-1521124836513/emojis/1f1fb-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1ea.png rename to dist/v-1521124836513/emojis/1f1fb-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1ec.png b/dist/v-1521124836513/emojis/1f1fb-1f1ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1ec.png rename to dist/v-1521124836513/emojis/1f1fb-1f1ec.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1ee.png b/dist/v-1521124836513/emojis/1f1fb-1f1ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1ee.png rename to dist/v-1521124836513/emojis/1f1fb-1f1ee.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1f3.png b/dist/v-1521124836513/emojis/1f1fb-1f1f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1f3.png rename to dist/v-1521124836513/emojis/1f1fb-1f1f3.png diff --git a/dist/v-1520418874500/emojis/1f1fb-1f1fa.png b/dist/v-1521124836513/emojis/1f1fb-1f1fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fb-1f1fa.png rename to dist/v-1521124836513/emojis/1f1fb-1f1fa.png diff --git a/dist/v-1520418874500/emojis/1f1fc-1f1eb.png b/dist/v-1521124836513/emojis/1f1fc-1f1eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fc-1f1eb.png rename to dist/v-1521124836513/emojis/1f1fc-1f1eb.png diff --git a/dist/v-1520418874500/emojis/1f1fc-1f1f8.png b/dist/v-1521124836513/emojis/1f1fc-1f1f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fc-1f1f8.png rename to dist/v-1521124836513/emojis/1f1fc-1f1f8.png diff --git a/dist/v-1520418874500/emojis/1f1fd-1f1f0.png b/dist/v-1521124836513/emojis/1f1fd-1f1f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fd-1f1f0.png rename to dist/v-1521124836513/emojis/1f1fd-1f1f0.png diff --git a/dist/v-1520418874500/emojis/1f1fe-1f1ea.png b/dist/v-1521124836513/emojis/1f1fe-1f1ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fe-1f1ea.png rename to dist/v-1521124836513/emojis/1f1fe-1f1ea.png diff --git a/dist/v-1520418874500/emojis/1f1fe-1f1f9.png b/dist/v-1521124836513/emojis/1f1fe-1f1f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1fe-1f1f9.png rename to dist/v-1521124836513/emojis/1f1fe-1f1f9.png diff --git a/dist/v-1520418874500/emojis/1f1ff-1f1e6.png b/dist/v-1521124836513/emojis/1f1ff-1f1e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ff-1f1e6.png rename to dist/v-1521124836513/emojis/1f1ff-1f1e6.png diff --git a/dist/v-1520418874500/emojis/1f1ff-1f1f2.png b/dist/v-1521124836513/emojis/1f1ff-1f1f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ff-1f1f2.png rename to dist/v-1521124836513/emojis/1f1ff-1f1f2.png diff --git a/dist/v-1520418874500/emojis/1f1ff-1f1fc.png b/dist/v-1521124836513/emojis/1f1ff-1f1fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f1ff-1f1fc.png rename to dist/v-1521124836513/emojis/1f1ff-1f1fc.png diff --git a/dist/v-1520418874500/emojis/1f201.png b/dist/v-1521124836513/emojis/1f201.png similarity index 100% rename from dist/v-1520418874500/emojis/1f201.png rename to dist/v-1521124836513/emojis/1f201.png diff --git a/dist/v-1520418874500/emojis/1f202.png b/dist/v-1521124836513/emojis/1f202.png similarity index 100% rename from dist/v-1520418874500/emojis/1f202.png rename to dist/v-1521124836513/emojis/1f202.png diff --git a/dist/v-1520418874500/emojis/1f21a.png b/dist/v-1521124836513/emojis/1f21a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f21a.png rename to dist/v-1521124836513/emojis/1f21a.png diff --git a/dist/v-1520418874500/emojis/1f22f.png b/dist/v-1521124836513/emojis/1f22f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f22f.png rename to dist/v-1521124836513/emojis/1f22f.png diff --git a/dist/v-1520418874500/emojis/1f232.png b/dist/v-1521124836513/emojis/1f232.png similarity index 100% rename from dist/v-1520418874500/emojis/1f232.png rename to dist/v-1521124836513/emojis/1f232.png diff --git a/dist/v-1520418874500/emojis/1f233.png b/dist/v-1521124836513/emojis/1f233.png similarity index 100% rename from dist/v-1520418874500/emojis/1f233.png rename to dist/v-1521124836513/emojis/1f233.png diff --git a/dist/v-1520418874500/emojis/1f234.png b/dist/v-1521124836513/emojis/1f234.png similarity index 100% rename from dist/v-1520418874500/emojis/1f234.png rename to dist/v-1521124836513/emojis/1f234.png diff --git a/dist/v-1520418874500/emojis/1f235.png b/dist/v-1521124836513/emojis/1f235.png similarity index 100% rename from dist/v-1520418874500/emojis/1f235.png rename to dist/v-1521124836513/emojis/1f235.png diff --git a/dist/v-1520418874500/emojis/1f236.png b/dist/v-1521124836513/emojis/1f236.png similarity index 100% rename from dist/v-1520418874500/emojis/1f236.png rename to dist/v-1521124836513/emojis/1f236.png diff --git a/dist/v-1520418874500/emojis/1f237.png b/dist/v-1521124836513/emojis/1f237.png similarity index 100% rename from dist/v-1520418874500/emojis/1f237.png rename to dist/v-1521124836513/emojis/1f237.png diff --git a/dist/v-1520418874500/emojis/1f238.png b/dist/v-1521124836513/emojis/1f238.png similarity index 100% rename from dist/v-1520418874500/emojis/1f238.png rename to dist/v-1521124836513/emojis/1f238.png diff --git a/dist/v-1520418874500/emojis/1f239.png b/dist/v-1521124836513/emojis/1f239.png similarity index 100% rename from dist/v-1520418874500/emojis/1f239.png rename to dist/v-1521124836513/emojis/1f239.png diff --git a/dist/v-1520418874500/emojis/1f23a.png b/dist/v-1521124836513/emojis/1f23a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f23a.png rename to dist/v-1521124836513/emojis/1f23a.png diff --git a/dist/v-1520418874500/emojis/1f250.png b/dist/v-1521124836513/emojis/1f250.png similarity index 100% rename from dist/v-1520418874500/emojis/1f250.png rename to dist/v-1521124836513/emojis/1f250.png diff --git a/dist/v-1520418874500/emojis/1f251.png b/dist/v-1521124836513/emojis/1f251.png similarity index 100% rename from dist/v-1520418874500/emojis/1f251.png rename to dist/v-1521124836513/emojis/1f251.png diff --git a/dist/v-1520418874500/emojis/1f300.png b/dist/v-1521124836513/emojis/1f300.png similarity index 100% rename from dist/v-1520418874500/emojis/1f300.png rename to dist/v-1521124836513/emojis/1f300.png diff --git a/dist/v-1520418874500/emojis/1f301.png b/dist/v-1521124836513/emojis/1f301.png similarity index 100% rename from dist/v-1520418874500/emojis/1f301.png rename to dist/v-1521124836513/emojis/1f301.png diff --git a/dist/v-1520418874500/emojis/1f302.png b/dist/v-1521124836513/emojis/1f302.png similarity index 100% rename from dist/v-1520418874500/emojis/1f302.png rename to dist/v-1521124836513/emojis/1f302.png diff --git a/dist/v-1520418874500/emojis/1f303.png b/dist/v-1521124836513/emojis/1f303.png similarity index 100% rename from dist/v-1520418874500/emojis/1f303.png rename to dist/v-1521124836513/emojis/1f303.png diff --git a/dist/v-1520418874500/emojis/1f304.png b/dist/v-1521124836513/emojis/1f304.png similarity index 100% rename from dist/v-1520418874500/emojis/1f304.png rename to dist/v-1521124836513/emojis/1f304.png diff --git a/dist/v-1520418874500/emojis/1f305.png b/dist/v-1521124836513/emojis/1f305.png similarity index 100% rename from dist/v-1520418874500/emojis/1f305.png rename to dist/v-1521124836513/emojis/1f305.png diff --git a/dist/v-1520418874500/emojis/1f306.png b/dist/v-1521124836513/emojis/1f306.png similarity index 100% rename from dist/v-1520418874500/emojis/1f306.png rename to dist/v-1521124836513/emojis/1f306.png diff --git a/dist/v-1520418874500/emojis/1f307.png b/dist/v-1521124836513/emojis/1f307.png similarity index 100% rename from dist/v-1520418874500/emojis/1f307.png rename to dist/v-1521124836513/emojis/1f307.png diff --git a/dist/v-1520418874500/emojis/1f308.png b/dist/v-1521124836513/emojis/1f308.png similarity index 100% rename from dist/v-1520418874500/emojis/1f308.png rename to dist/v-1521124836513/emojis/1f308.png diff --git a/dist/v-1520418874500/emojis/1f309.png b/dist/v-1521124836513/emojis/1f309.png similarity index 100% rename from dist/v-1520418874500/emojis/1f309.png rename to dist/v-1521124836513/emojis/1f309.png diff --git a/dist/v-1520418874500/emojis/1f30a.png b/dist/v-1521124836513/emojis/1f30a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f30a.png rename to dist/v-1521124836513/emojis/1f30a.png diff --git a/dist/v-1520418874500/emojis/1f30b.png b/dist/v-1521124836513/emojis/1f30b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f30b.png rename to dist/v-1521124836513/emojis/1f30b.png diff --git a/dist/v-1520418874500/emojis/1f30c.png b/dist/v-1521124836513/emojis/1f30c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f30c.png rename to dist/v-1521124836513/emojis/1f30c.png diff --git a/dist/v-1520418874500/emojis/1f30d.png b/dist/v-1521124836513/emojis/1f30d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f30d.png rename to dist/v-1521124836513/emojis/1f30d.png diff --git a/dist/v-1520418874500/emojis/1f30e.png b/dist/v-1521124836513/emojis/1f30e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f30e.png rename to dist/v-1521124836513/emojis/1f30e.png diff --git a/dist/v-1520418874500/emojis/1f30f.png b/dist/v-1521124836513/emojis/1f30f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f30f.png rename to dist/v-1521124836513/emojis/1f30f.png diff --git a/dist/v-1520418874500/emojis/1f310.png b/dist/v-1521124836513/emojis/1f310.png similarity index 100% rename from dist/v-1520418874500/emojis/1f310.png rename to dist/v-1521124836513/emojis/1f310.png diff --git a/dist/v-1520418874500/emojis/1f311.png b/dist/v-1521124836513/emojis/1f311.png similarity index 100% rename from dist/v-1520418874500/emojis/1f311.png rename to dist/v-1521124836513/emojis/1f311.png diff --git a/dist/v-1520418874500/emojis/1f312.png b/dist/v-1521124836513/emojis/1f312.png similarity index 100% rename from dist/v-1520418874500/emojis/1f312.png rename to dist/v-1521124836513/emojis/1f312.png diff --git a/dist/v-1520418874500/emojis/1f313.png b/dist/v-1521124836513/emojis/1f313.png similarity index 100% rename from dist/v-1520418874500/emojis/1f313.png rename to dist/v-1521124836513/emojis/1f313.png diff --git a/dist/v-1520418874500/emojis/1f314.png b/dist/v-1521124836513/emojis/1f314.png similarity index 100% rename from dist/v-1520418874500/emojis/1f314.png rename to dist/v-1521124836513/emojis/1f314.png diff --git a/dist/v-1520418874500/emojis/1f315.png b/dist/v-1521124836513/emojis/1f315.png similarity index 100% rename from dist/v-1520418874500/emojis/1f315.png rename to dist/v-1521124836513/emojis/1f315.png diff --git a/dist/v-1520418874500/emojis/1f316.png b/dist/v-1521124836513/emojis/1f316.png similarity index 100% rename from dist/v-1520418874500/emojis/1f316.png rename to dist/v-1521124836513/emojis/1f316.png diff --git a/dist/v-1520418874500/emojis/1f317.png b/dist/v-1521124836513/emojis/1f317.png similarity index 100% rename from dist/v-1520418874500/emojis/1f317.png rename to dist/v-1521124836513/emojis/1f317.png diff --git a/dist/v-1520418874500/emojis/1f318.png b/dist/v-1521124836513/emojis/1f318.png similarity index 100% rename from dist/v-1520418874500/emojis/1f318.png rename to dist/v-1521124836513/emojis/1f318.png diff --git a/dist/v-1520418874500/emojis/1f319.png b/dist/v-1521124836513/emojis/1f319.png similarity index 100% rename from dist/v-1520418874500/emojis/1f319.png rename to dist/v-1521124836513/emojis/1f319.png diff --git a/dist/v-1520418874500/emojis/1f31a.png b/dist/v-1521124836513/emojis/1f31a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f31a.png rename to dist/v-1521124836513/emojis/1f31a.png diff --git a/dist/v-1520418874500/emojis/1f31b.png b/dist/v-1521124836513/emojis/1f31b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f31b.png rename to dist/v-1521124836513/emojis/1f31b.png diff --git a/dist/v-1520418874500/emojis/1f31c.png b/dist/v-1521124836513/emojis/1f31c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f31c.png rename to dist/v-1521124836513/emojis/1f31c.png diff --git a/dist/v-1520418874500/emojis/1f31d.png b/dist/v-1521124836513/emojis/1f31d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f31d.png rename to dist/v-1521124836513/emojis/1f31d.png diff --git a/dist/v-1520418874500/emojis/1f31e.png b/dist/v-1521124836513/emojis/1f31e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f31e.png rename to dist/v-1521124836513/emojis/1f31e.png diff --git a/dist/v-1520418874500/emojis/1f31f.png b/dist/v-1521124836513/emojis/1f31f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f31f.png rename to dist/v-1521124836513/emojis/1f31f.png diff --git a/dist/v-1520418874500/emojis/1f320.png b/dist/v-1521124836513/emojis/1f320.png similarity index 100% rename from dist/v-1520418874500/emojis/1f320.png rename to dist/v-1521124836513/emojis/1f320.png diff --git a/dist/v-1520418874500/emojis/1f321.png b/dist/v-1521124836513/emojis/1f321.png similarity index 100% rename from dist/v-1520418874500/emojis/1f321.png rename to dist/v-1521124836513/emojis/1f321.png diff --git a/dist/v-1520418874500/emojis/1f324.png b/dist/v-1521124836513/emojis/1f324.png similarity index 100% rename from dist/v-1520418874500/emojis/1f324.png rename to dist/v-1521124836513/emojis/1f324.png diff --git a/dist/v-1520418874500/emojis/1f325.png b/dist/v-1521124836513/emojis/1f325.png similarity index 100% rename from dist/v-1520418874500/emojis/1f325.png rename to dist/v-1521124836513/emojis/1f325.png diff --git a/dist/v-1520418874500/emojis/1f326.png b/dist/v-1521124836513/emojis/1f326.png similarity index 100% rename from dist/v-1520418874500/emojis/1f326.png rename to dist/v-1521124836513/emojis/1f326.png diff --git a/dist/v-1520418874500/emojis/1f327.png b/dist/v-1521124836513/emojis/1f327.png similarity index 100% rename from dist/v-1520418874500/emojis/1f327.png rename to dist/v-1521124836513/emojis/1f327.png diff --git a/dist/v-1520418874500/emojis/1f328.png b/dist/v-1521124836513/emojis/1f328.png similarity index 100% rename from dist/v-1520418874500/emojis/1f328.png rename to dist/v-1521124836513/emojis/1f328.png diff --git a/dist/v-1520418874500/emojis/1f329.png b/dist/v-1521124836513/emojis/1f329.png similarity index 100% rename from dist/v-1520418874500/emojis/1f329.png rename to dist/v-1521124836513/emojis/1f329.png diff --git a/dist/v-1520418874500/emojis/1f32a.png b/dist/v-1521124836513/emojis/1f32a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f32a.png rename to dist/v-1521124836513/emojis/1f32a.png diff --git a/dist/v-1520418874500/emojis/1f32b.png b/dist/v-1521124836513/emojis/1f32b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f32b.png rename to dist/v-1521124836513/emojis/1f32b.png diff --git a/dist/v-1520418874500/emojis/1f32c.png b/dist/v-1521124836513/emojis/1f32c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f32c.png rename to dist/v-1521124836513/emojis/1f32c.png diff --git a/dist/v-1520418874500/emojis/1f32d.png b/dist/v-1521124836513/emojis/1f32d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f32d.png rename to dist/v-1521124836513/emojis/1f32d.png diff --git a/dist/v-1520418874500/emojis/1f32e.png b/dist/v-1521124836513/emojis/1f32e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f32e.png rename to dist/v-1521124836513/emojis/1f32e.png diff --git a/dist/v-1520418874500/emojis/1f32f.png b/dist/v-1521124836513/emojis/1f32f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f32f.png rename to dist/v-1521124836513/emojis/1f32f.png diff --git a/dist/v-1520418874500/emojis/1f330.png b/dist/v-1521124836513/emojis/1f330.png similarity index 100% rename from dist/v-1520418874500/emojis/1f330.png rename to dist/v-1521124836513/emojis/1f330.png diff --git a/dist/v-1520418874500/emojis/1f331.png b/dist/v-1521124836513/emojis/1f331.png similarity index 100% rename from dist/v-1520418874500/emojis/1f331.png rename to dist/v-1521124836513/emojis/1f331.png diff --git a/dist/v-1520418874500/emojis/1f332.png b/dist/v-1521124836513/emojis/1f332.png similarity index 100% rename from dist/v-1520418874500/emojis/1f332.png rename to dist/v-1521124836513/emojis/1f332.png diff --git a/dist/v-1520418874500/emojis/1f333.png b/dist/v-1521124836513/emojis/1f333.png similarity index 100% rename from dist/v-1520418874500/emojis/1f333.png rename to dist/v-1521124836513/emojis/1f333.png diff --git a/dist/v-1520418874500/emojis/1f334.png b/dist/v-1521124836513/emojis/1f334.png similarity index 100% rename from dist/v-1520418874500/emojis/1f334.png rename to dist/v-1521124836513/emojis/1f334.png diff --git a/dist/v-1520418874500/emojis/1f335.png b/dist/v-1521124836513/emojis/1f335.png similarity index 100% rename from dist/v-1520418874500/emojis/1f335.png rename to dist/v-1521124836513/emojis/1f335.png diff --git a/dist/v-1520418874500/emojis/1f336.png b/dist/v-1521124836513/emojis/1f336.png similarity index 100% rename from dist/v-1520418874500/emojis/1f336.png rename to dist/v-1521124836513/emojis/1f336.png diff --git a/dist/v-1520418874500/emojis/1f337.png b/dist/v-1521124836513/emojis/1f337.png similarity index 100% rename from dist/v-1520418874500/emojis/1f337.png rename to dist/v-1521124836513/emojis/1f337.png diff --git a/dist/v-1520418874500/emojis/1f338.png b/dist/v-1521124836513/emojis/1f338.png similarity index 100% rename from dist/v-1520418874500/emojis/1f338.png rename to dist/v-1521124836513/emojis/1f338.png diff --git a/dist/v-1520418874500/emojis/1f339.png b/dist/v-1521124836513/emojis/1f339.png similarity index 100% rename from dist/v-1520418874500/emojis/1f339.png rename to dist/v-1521124836513/emojis/1f339.png diff --git a/dist/v-1520418874500/emojis/1f33a.png b/dist/v-1521124836513/emojis/1f33a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f33a.png rename to dist/v-1521124836513/emojis/1f33a.png diff --git a/dist/v-1520418874500/emojis/1f33b.png b/dist/v-1521124836513/emojis/1f33b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f33b.png rename to dist/v-1521124836513/emojis/1f33b.png diff --git a/dist/v-1520418874500/emojis/1f33c.png b/dist/v-1521124836513/emojis/1f33c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f33c.png rename to dist/v-1521124836513/emojis/1f33c.png diff --git a/dist/v-1520418874500/emojis/1f33d.png b/dist/v-1521124836513/emojis/1f33d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f33d.png rename to dist/v-1521124836513/emojis/1f33d.png diff --git a/dist/v-1520418874500/emojis/1f33e.png b/dist/v-1521124836513/emojis/1f33e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f33e.png rename to dist/v-1521124836513/emojis/1f33e.png diff --git a/dist/v-1520418874500/emojis/1f33f.png b/dist/v-1521124836513/emojis/1f33f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f33f.png rename to dist/v-1521124836513/emojis/1f33f.png diff --git a/dist/v-1520418874500/emojis/1f340.png b/dist/v-1521124836513/emojis/1f340.png similarity index 100% rename from dist/v-1520418874500/emojis/1f340.png rename to dist/v-1521124836513/emojis/1f340.png diff --git a/dist/v-1520418874500/emojis/1f341.png b/dist/v-1521124836513/emojis/1f341.png similarity index 100% rename from dist/v-1520418874500/emojis/1f341.png rename to dist/v-1521124836513/emojis/1f341.png diff --git a/dist/v-1520418874500/emojis/1f342.png b/dist/v-1521124836513/emojis/1f342.png similarity index 100% rename from dist/v-1520418874500/emojis/1f342.png rename to dist/v-1521124836513/emojis/1f342.png diff --git a/dist/v-1520418874500/emojis/1f343.png b/dist/v-1521124836513/emojis/1f343.png similarity index 100% rename from dist/v-1520418874500/emojis/1f343.png rename to dist/v-1521124836513/emojis/1f343.png diff --git a/dist/v-1520418874500/emojis/1f344.png b/dist/v-1521124836513/emojis/1f344.png similarity index 100% rename from dist/v-1520418874500/emojis/1f344.png rename to dist/v-1521124836513/emojis/1f344.png diff --git a/dist/v-1520418874500/emojis/1f345.png b/dist/v-1521124836513/emojis/1f345.png similarity index 100% rename from dist/v-1520418874500/emojis/1f345.png rename to dist/v-1521124836513/emojis/1f345.png diff --git a/dist/v-1520418874500/emojis/1f346.png b/dist/v-1521124836513/emojis/1f346.png similarity index 100% rename from dist/v-1520418874500/emojis/1f346.png rename to dist/v-1521124836513/emojis/1f346.png diff --git a/dist/v-1520418874500/emojis/1f347.png b/dist/v-1521124836513/emojis/1f347.png similarity index 100% rename from dist/v-1520418874500/emojis/1f347.png rename to dist/v-1521124836513/emojis/1f347.png diff --git a/dist/v-1520418874500/emojis/1f348.png b/dist/v-1521124836513/emojis/1f348.png similarity index 100% rename from dist/v-1520418874500/emojis/1f348.png rename to dist/v-1521124836513/emojis/1f348.png diff --git a/dist/v-1520418874500/emojis/1f349.png b/dist/v-1521124836513/emojis/1f349.png similarity index 100% rename from dist/v-1520418874500/emojis/1f349.png rename to dist/v-1521124836513/emojis/1f349.png diff --git a/dist/v-1520418874500/emojis/1f34a.png b/dist/v-1521124836513/emojis/1f34a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f34a.png rename to dist/v-1521124836513/emojis/1f34a.png diff --git a/dist/v-1520418874500/emojis/1f34b.png b/dist/v-1521124836513/emojis/1f34b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f34b.png rename to dist/v-1521124836513/emojis/1f34b.png diff --git a/dist/v-1520418874500/emojis/1f34c.png b/dist/v-1521124836513/emojis/1f34c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f34c.png rename to dist/v-1521124836513/emojis/1f34c.png diff --git a/dist/v-1520418874500/emojis/1f34d.png b/dist/v-1521124836513/emojis/1f34d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f34d.png rename to dist/v-1521124836513/emojis/1f34d.png diff --git a/dist/v-1520418874500/emojis/1f34e.png b/dist/v-1521124836513/emojis/1f34e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f34e.png rename to dist/v-1521124836513/emojis/1f34e.png diff --git a/dist/v-1520418874500/emojis/1f34f.png b/dist/v-1521124836513/emojis/1f34f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f34f.png rename to dist/v-1521124836513/emojis/1f34f.png diff --git a/dist/v-1520418874500/emojis/1f350.png b/dist/v-1521124836513/emojis/1f350.png similarity index 100% rename from dist/v-1520418874500/emojis/1f350.png rename to dist/v-1521124836513/emojis/1f350.png diff --git a/dist/v-1520418874500/emojis/1f351.png b/dist/v-1521124836513/emojis/1f351.png similarity index 100% rename from dist/v-1520418874500/emojis/1f351.png rename to dist/v-1521124836513/emojis/1f351.png diff --git a/dist/v-1520418874500/emojis/1f352.png b/dist/v-1521124836513/emojis/1f352.png similarity index 100% rename from dist/v-1520418874500/emojis/1f352.png rename to dist/v-1521124836513/emojis/1f352.png diff --git a/dist/v-1520418874500/emojis/1f353.png b/dist/v-1521124836513/emojis/1f353.png similarity index 100% rename from dist/v-1520418874500/emojis/1f353.png rename to dist/v-1521124836513/emojis/1f353.png diff --git a/dist/v-1520418874500/emojis/1f354.png b/dist/v-1521124836513/emojis/1f354.png similarity index 100% rename from dist/v-1520418874500/emojis/1f354.png rename to dist/v-1521124836513/emojis/1f354.png diff --git a/dist/v-1520418874500/emojis/1f355.png b/dist/v-1521124836513/emojis/1f355.png similarity index 100% rename from dist/v-1520418874500/emojis/1f355.png rename to dist/v-1521124836513/emojis/1f355.png diff --git a/dist/v-1520418874500/emojis/1f356.png b/dist/v-1521124836513/emojis/1f356.png similarity index 100% rename from dist/v-1520418874500/emojis/1f356.png rename to dist/v-1521124836513/emojis/1f356.png diff --git a/dist/v-1520418874500/emojis/1f357.png b/dist/v-1521124836513/emojis/1f357.png similarity index 100% rename from dist/v-1520418874500/emojis/1f357.png rename to dist/v-1521124836513/emojis/1f357.png diff --git a/dist/v-1520418874500/emojis/1f358.png b/dist/v-1521124836513/emojis/1f358.png similarity index 100% rename from dist/v-1520418874500/emojis/1f358.png rename to dist/v-1521124836513/emojis/1f358.png diff --git a/dist/v-1520418874500/emojis/1f359.png b/dist/v-1521124836513/emojis/1f359.png similarity index 100% rename from dist/v-1520418874500/emojis/1f359.png rename to dist/v-1521124836513/emojis/1f359.png diff --git a/dist/v-1520418874500/emojis/1f35a.png b/dist/v-1521124836513/emojis/1f35a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f35a.png rename to dist/v-1521124836513/emojis/1f35a.png diff --git a/dist/v-1520418874500/emojis/1f35b.png b/dist/v-1521124836513/emojis/1f35b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f35b.png rename to dist/v-1521124836513/emojis/1f35b.png diff --git a/dist/v-1520418874500/emojis/1f35c.png b/dist/v-1521124836513/emojis/1f35c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f35c.png rename to dist/v-1521124836513/emojis/1f35c.png diff --git a/dist/v-1520418874500/emojis/1f35d.png b/dist/v-1521124836513/emojis/1f35d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f35d.png rename to dist/v-1521124836513/emojis/1f35d.png diff --git a/dist/v-1520418874500/emojis/1f35e.png b/dist/v-1521124836513/emojis/1f35e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f35e.png rename to dist/v-1521124836513/emojis/1f35e.png diff --git a/dist/v-1520418874500/emojis/1f35f.png b/dist/v-1521124836513/emojis/1f35f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f35f.png rename to dist/v-1521124836513/emojis/1f35f.png diff --git a/dist/v-1520418874500/emojis/1f360.png b/dist/v-1521124836513/emojis/1f360.png similarity index 100% rename from dist/v-1520418874500/emojis/1f360.png rename to dist/v-1521124836513/emojis/1f360.png diff --git a/dist/v-1520418874500/emojis/1f361.png b/dist/v-1521124836513/emojis/1f361.png similarity index 100% rename from dist/v-1520418874500/emojis/1f361.png rename to dist/v-1521124836513/emojis/1f361.png diff --git a/dist/v-1520418874500/emojis/1f362.png b/dist/v-1521124836513/emojis/1f362.png similarity index 100% rename from dist/v-1520418874500/emojis/1f362.png rename to dist/v-1521124836513/emojis/1f362.png diff --git a/dist/v-1520418874500/emojis/1f363.png b/dist/v-1521124836513/emojis/1f363.png similarity index 100% rename from dist/v-1520418874500/emojis/1f363.png rename to dist/v-1521124836513/emojis/1f363.png diff --git a/dist/v-1520418874500/emojis/1f364.png b/dist/v-1521124836513/emojis/1f364.png similarity index 100% rename from dist/v-1520418874500/emojis/1f364.png rename to dist/v-1521124836513/emojis/1f364.png diff --git a/dist/v-1520418874500/emojis/1f365.png b/dist/v-1521124836513/emojis/1f365.png similarity index 100% rename from dist/v-1520418874500/emojis/1f365.png rename to dist/v-1521124836513/emojis/1f365.png diff --git a/dist/v-1520418874500/emojis/1f366.png b/dist/v-1521124836513/emojis/1f366.png similarity index 100% rename from dist/v-1520418874500/emojis/1f366.png rename to dist/v-1521124836513/emojis/1f366.png diff --git a/dist/v-1520418874500/emojis/1f367.png b/dist/v-1521124836513/emojis/1f367.png similarity index 100% rename from dist/v-1520418874500/emojis/1f367.png rename to dist/v-1521124836513/emojis/1f367.png diff --git a/dist/v-1520418874500/emojis/1f368.png b/dist/v-1521124836513/emojis/1f368.png similarity index 100% rename from dist/v-1520418874500/emojis/1f368.png rename to dist/v-1521124836513/emojis/1f368.png diff --git a/dist/v-1520418874500/emojis/1f369.png b/dist/v-1521124836513/emojis/1f369.png similarity index 100% rename from dist/v-1520418874500/emojis/1f369.png rename to dist/v-1521124836513/emojis/1f369.png diff --git a/dist/v-1520418874500/emojis/1f36a.png b/dist/v-1521124836513/emojis/1f36a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f36a.png rename to dist/v-1521124836513/emojis/1f36a.png diff --git a/dist/v-1520418874500/emojis/1f36b.png b/dist/v-1521124836513/emojis/1f36b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f36b.png rename to dist/v-1521124836513/emojis/1f36b.png diff --git a/dist/v-1520418874500/emojis/1f36c.png b/dist/v-1521124836513/emojis/1f36c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f36c.png rename to dist/v-1521124836513/emojis/1f36c.png diff --git a/dist/v-1520418874500/emojis/1f36d.png b/dist/v-1521124836513/emojis/1f36d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f36d.png rename to dist/v-1521124836513/emojis/1f36d.png diff --git a/dist/v-1520418874500/emojis/1f36e.png b/dist/v-1521124836513/emojis/1f36e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f36e.png rename to dist/v-1521124836513/emojis/1f36e.png diff --git a/dist/v-1520418874500/emojis/1f36f.png b/dist/v-1521124836513/emojis/1f36f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f36f.png rename to dist/v-1521124836513/emojis/1f36f.png diff --git a/dist/v-1520418874500/emojis/1f370.png b/dist/v-1521124836513/emojis/1f370.png similarity index 100% rename from dist/v-1520418874500/emojis/1f370.png rename to dist/v-1521124836513/emojis/1f370.png diff --git a/dist/v-1520418874500/emojis/1f371.png b/dist/v-1521124836513/emojis/1f371.png similarity index 100% rename from dist/v-1520418874500/emojis/1f371.png rename to dist/v-1521124836513/emojis/1f371.png diff --git a/dist/v-1520418874500/emojis/1f372.png b/dist/v-1521124836513/emojis/1f372.png similarity index 100% rename from dist/v-1520418874500/emojis/1f372.png rename to dist/v-1521124836513/emojis/1f372.png diff --git a/dist/v-1520418874500/emojis/1f373.png b/dist/v-1521124836513/emojis/1f373.png similarity index 100% rename from dist/v-1520418874500/emojis/1f373.png rename to dist/v-1521124836513/emojis/1f373.png diff --git a/dist/v-1520418874500/emojis/1f374.png b/dist/v-1521124836513/emojis/1f374.png similarity index 100% rename from dist/v-1520418874500/emojis/1f374.png rename to dist/v-1521124836513/emojis/1f374.png diff --git a/dist/v-1520418874500/emojis/1f375.png b/dist/v-1521124836513/emojis/1f375.png similarity index 100% rename from dist/v-1520418874500/emojis/1f375.png rename to dist/v-1521124836513/emojis/1f375.png diff --git a/dist/v-1520418874500/emojis/1f376.png b/dist/v-1521124836513/emojis/1f376.png similarity index 100% rename from dist/v-1520418874500/emojis/1f376.png rename to dist/v-1521124836513/emojis/1f376.png diff --git a/dist/v-1520418874500/emojis/1f377.png b/dist/v-1521124836513/emojis/1f377.png similarity index 100% rename from dist/v-1520418874500/emojis/1f377.png rename to dist/v-1521124836513/emojis/1f377.png diff --git a/dist/v-1520418874500/emojis/1f378.png b/dist/v-1521124836513/emojis/1f378.png similarity index 100% rename from dist/v-1520418874500/emojis/1f378.png rename to dist/v-1521124836513/emojis/1f378.png diff --git a/dist/v-1520418874500/emojis/1f379.png b/dist/v-1521124836513/emojis/1f379.png similarity index 100% rename from dist/v-1520418874500/emojis/1f379.png rename to dist/v-1521124836513/emojis/1f379.png diff --git a/dist/v-1520418874500/emojis/1f37a.png b/dist/v-1521124836513/emojis/1f37a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f37a.png rename to dist/v-1521124836513/emojis/1f37a.png diff --git a/dist/v-1520418874500/emojis/1f37b.png b/dist/v-1521124836513/emojis/1f37b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f37b.png rename to dist/v-1521124836513/emojis/1f37b.png diff --git a/dist/v-1520418874500/emojis/1f37c.png b/dist/v-1521124836513/emojis/1f37c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f37c.png rename to dist/v-1521124836513/emojis/1f37c.png diff --git a/dist/v-1520418874500/emojis/1f37d.png b/dist/v-1521124836513/emojis/1f37d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f37d.png rename to dist/v-1521124836513/emojis/1f37d.png diff --git a/dist/v-1520418874500/emojis/1f37e.png b/dist/v-1521124836513/emojis/1f37e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f37e.png rename to dist/v-1521124836513/emojis/1f37e.png diff --git a/dist/v-1520418874500/emojis/1f37f.png b/dist/v-1521124836513/emojis/1f37f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f37f.png rename to dist/v-1521124836513/emojis/1f37f.png diff --git a/dist/v-1520418874500/emojis/1f380.png b/dist/v-1521124836513/emojis/1f380.png similarity index 100% rename from dist/v-1520418874500/emojis/1f380.png rename to dist/v-1521124836513/emojis/1f380.png diff --git a/dist/v-1520418874500/emojis/1f381.png b/dist/v-1521124836513/emojis/1f381.png similarity index 100% rename from dist/v-1520418874500/emojis/1f381.png rename to dist/v-1521124836513/emojis/1f381.png diff --git a/dist/v-1520418874500/emojis/1f382.png b/dist/v-1521124836513/emojis/1f382.png similarity index 100% rename from dist/v-1520418874500/emojis/1f382.png rename to dist/v-1521124836513/emojis/1f382.png diff --git a/dist/v-1520418874500/emojis/1f383.png b/dist/v-1521124836513/emojis/1f383.png similarity index 100% rename from dist/v-1520418874500/emojis/1f383.png rename to dist/v-1521124836513/emojis/1f383.png diff --git a/dist/v-1520418874500/emojis/1f384.png b/dist/v-1521124836513/emojis/1f384.png similarity index 100% rename from dist/v-1520418874500/emojis/1f384.png rename to dist/v-1521124836513/emojis/1f384.png diff --git a/dist/v-1520418874500/emojis/1f385.png b/dist/v-1521124836513/emojis/1f385.png similarity index 100% rename from dist/v-1520418874500/emojis/1f385.png rename to dist/v-1521124836513/emojis/1f385.png diff --git a/dist/v-1520418874500/emojis/1f386.png b/dist/v-1521124836513/emojis/1f386.png similarity index 100% rename from dist/v-1520418874500/emojis/1f386.png rename to dist/v-1521124836513/emojis/1f386.png diff --git a/dist/v-1520418874500/emojis/1f387.png b/dist/v-1521124836513/emojis/1f387.png similarity index 100% rename from dist/v-1520418874500/emojis/1f387.png rename to dist/v-1521124836513/emojis/1f387.png diff --git a/dist/v-1520418874500/emojis/1f388.png b/dist/v-1521124836513/emojis/1f388.png similarity index 100% rename from dist/v-1520418874500/emojis/1f388.png rename to dist/v-1521124836513/emojis/1f388.png diff --git a/dist/v-1520418874500/emojis/1f389.png b/dist/v-1521124836513/emojis/1f389.png similarity index 100% rename from dist/v-1520418874500/emojis/1f389.png rename to dist/v-1521124836513/emojis/1f389.png diff --git a/dist/v-1520418874500/emojis/1f38a.png b/dist/v-1521124836513/emojis/1f38a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f38a.png rename to dist/v-1521124836513/emojis/1f38a.png diff --git a/dist/v-1520418874500/emojis/1f38b.png b/dist/v-1521124836513/emojis/1f38b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f38b.png rename to dist/v-1521124836513/emojis/1f38b.png diff --git a/dist/v-1520418874500/emojis/1f38c.png b/dist/v-1521124836513/emojis/1f38c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f38c.png rename to dist/v-1521124836513/emojis/1f38c.png diff --git a/dist/v-1520418874500/emojis/1f38d.png b/dist/v-1521124836513/emojis/1f38d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f38d.png rename to dist/v-1521124836513/emojis/1f38d.png diff --git a/dist/v-1520418874500/emojis/1f38e.png b/dist/v-1521124836513/emojis/1f38e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f38e.png rename to dist/v-1521124836513/emojis/1f38e.png diff --git a/dist/v-1520418874500/emojis/1f38f.png b/dist/v-1521124836513/emojis/1f38f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f38f.png rename to dist/v-1521124836513/emojis/1f38f.png diff --git a/dist/v-1520418874500/emojis/1f390.png b/dist/v-1521124836513/emojis/1f390.png similarity index 100% rename from dist/v-1520418874500/emojis/1f390.png rename to dist/v-1521124836513/emojis/1f390.png diff --git a/dist/v-1520418874500/emojis/1f391.png b/dist/v-1521124836513/emojis/1f391.png similarity index 100% rename from dist/v-1520418874500/emojis/1f391.png rename to dist/v-1521124836513/emojis/1f391.png diff --git a/dist/v-1520418874500/emojis/1f392.png b/dist/v-1521124836513/emojis/1f392.png similarity index 100% rename from dist/v-1520418874500/emojis/1f392.png rename to dist/v-1521124836513/emojis/1f392.png diff --git a/dist/v-1520418874500/emojis/1f393.png b/dist/v-1521124836513/emojis/1f393.png similarity index 100% rename from dist/v-1520418874500/emojis/1f393.png rename to dist/v-1521124836513/emojis/1f393.png diff --git a/dist/v-1520418874500/emojis/1f396.png b/dist/v-1521124836513/emojis/1f396.png similarity index 100% rename from dist/v-1520418874500/emojis/1f396.png rename to dist/v-1521124836513/emojis/1f396.png diff --git a/dist/v-1520418874500/emojis/1f397.png b/dist/v-1521124836513/emojis/1f397.png similarity index 100% rename from dist/v-1520418874500/emojis/1f397.png rename to dist/v-1521124836513/emojis/1f397.png diff --git a/dist/v-1520418874500/emojis/1f399.png b/dist/v-1521124836513/emojis/1f399.png similarity index 100% rename from dist/v-1520418874500/emojis/1f399.png rename to dist/v-1521124836513/emojis/1f399.png diff --git a/dist/v-1520418874500/emojis/1f39a.png b/dist/v-1521124836513/emojis/1f39a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f39a.png rename to dist/v-1521124836513/emojis/1f39a.png diff --git a/dist/v-1520418874500/emojis/1f39b.png b/dist/v-1521124836513/emojis/1f39b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f39b.png rename to dist/v-1521124836513/emojis/1f39b.png diff --git a/dist/v-1520418874500/emojis/1f39e.png b/dist/v-1521124836513/emojis/1f39e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f39e.png rename to dist/v-1521124836513/emojis/1f39e.png diff --git a/dist/v-1520418874500/emojis/1f39f.png b/dist/v-1521124836513/emojis/1f39f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f39f.png rename to dist/v-1521124836513/emojis/1f39f.png diff --git a/dist/v-1520418874500/emojis/1f3a0.png b/dist/v-1521124836513/emojis/1f3a0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a0.png rename to dist/v-1521124836513/emojis/1f3a0.png diff --git a/dist/v-1520418874500/emojis/1f3a1.png b/dist/v-1521124836513/emojis/1f3a1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a1.png rename to dist/v-1521124836513/emojis/1f3a1.png diff --git a/dist/v-1520418874500/emojis/1f3a2.png b/dist/v-1521124836513/emojis/1f3a2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a2.png rename to dist/v-1521124836513/emojis/1f3a2.png diff --git a/dist/v-1520418874500/emojis/1f3a3.png b/dist/v-1521124836513/emojis/1f3a3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a3.png rename to dist/v-1521124836513/emojis/1f3a3.png diff --git a/dist/v-1520418874500/emojis/1f3a4.png b/dist/v-1521124836513/emojis/1f3a4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a4.png rename to dist/v-1521124836513/emojis/1f3a4.png diff --git a/dist/v-1520418874500/emojis/1f3a5.png b/dist/v-1521124836513/emojis/1f3a5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a5.png rename to dist/v-1521124836513/emojis/1f3a5.png diff --git a/dist/v-1520418874500/emojis/1f3a6.png b/dist/v-1521124836513/emojis/1f3a6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a6.png rename to dist/v-1521124836513/emojis/1f3a6.png diff --git a/dist/v-1520418874500/emojis/1f3a7.png b/dist/v-1521124836513/emojis/1f3a7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a7.png rename to dist/v-1521124836513/emojis/1f3a7.png diff --git a/dist/v-1520418874500/emojis/1f3a8.png b/dist/v-1521124836513/emojis/1f3a8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a8.png rename to dist/v-1521124836513/emojis/1f3a8.png diff --git a/dist/v-1520418874500/emojis/1f3a9.png b/dist/v-1521124836513/emojis/1f3a9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3a9.png rename to dist/v-1521124836513/emojis/1f3a9.png diff --git a/dist/v-1520418874500/emojis/1f3aa.png b/dist/v-1521124836513/emojis/1f3aa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3aa.png rename to dist/v-1521124836513/emojis/1f3aa.png diff --git a/dist/v-1520418874500/emojis/1f3ab.png b/dist/v-1521124836513/emojis/1f3ab.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ab.png rename to dist/v-1521124836513/emojis/1f3ab.png diff --git a/dist/v-1520418874500/emojis/1f3ac.png b/dist/v-1521124836513/emojis/1f3ac.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ac.png rename to dist/v-1521124836513/emojis/1f3ac.png diff --git a/dist/v-1520418874500/emojis/1f3ad.png b/dist/v-1521124836513/emojis/1f3ad.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ad.png rename to dist/v-1521124836513/emojis/1f3ad.png diff --git a/dist/v-1520418874500/emojis/1f3ae.png b/dist/v-1521124836513/emojis/1f3ae.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ae.png rename to dist/v-1521124836513/emojis/1f3ae.png diff --git a/dist/v-1520418874500/emojis/1f3af.png b/dist/v-1521124836513/emojis/1f3af.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3af.png rename to dist/v-1521124836513/emojis/1f3af.png diff --git a/dist/v-1520418874500/emojis/1f3b0.png b/dist/v-1521124836513/emojis/1f3b0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b0.png rename to dist/v-1521124836513/emojis/1f3b0.png diff --git a/dist/v-1520418874500/emojis/1f3b1.png b/dist/v-1521124836513/emojis/1f3b1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b1.png rename to dist/v-1521124836513/emojis/1f3b1.png diff --git a/dist/v-1520418874500/emojis/1f3b2.png b/dist/v-1521124836513/emojis/1f3b2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b2.png rename to dist/v-1521124836513/emojis/1f3b2.png diff --git a/dist/v-1520418874500/emojis/1f3b3.png b/dist/v-1521124836513/emojis/1f3b3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b3.png rename to dist/v-1521124836513/emojis/1f3b3.png diff --git a/dist/v-1520418874500/emojis/1f3b4.png b/dist/v-1521124836513/emojis/1f3b4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b4.png rename to dist/v-1521124836513/emojis/1f3b4.png diff --git a/dist/v-1520418874500/emojis/1f3b5.png b/dist/v-1521124836513/emojis/1f3b5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b5.png rename to dist/v-1521124836513/emojis/1f3b5.png diff --git a/dist/v-1520418874500/emojis/1f3b6.png b/dist/v-1521124836513/emojis/1f3b6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b6.png rename to dist/v-1521124836513/emojis/1f3b6.png diff --git a/dist/v-1520418874500/emojis/1f3b7.png b/dist/v-1521124836513/emojis/1f3b7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b7.png rename to dist/v-1521124836513/emojis/1f3b7.png diff --git a/dist/v-1520418874500/emojis/1f3b8.png b/dist/v-1521124836513/emojis/1f3b8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b8.png rename to dist/v-1521124836513/emojis/1f3b8.png diff --git a/dist/v-1520418874500/emojis/1f3b9.png b/dist/v-1521124836513/emojis/1f3b9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3b9.png rename to dist/v-1521124836513/emojis/1f3b9.png diff --git a/dist/v-1520418874500/emojis/1f3ba.png b/dist/v-1521124836513/emojis/1f3ba.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ba.png rename to dist/v-1521124836513/emojis/1f3ba.png diff --git a/dist/v-1520418874500/emojis/1f3bb.png b/dist/v-1521124836513/emojis/1f3bb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3bb.png rename to dist/v-1521124836513/emojis/1f3bb.png diff --git a/dist/v-1520418874500/emojis/1f3bc.png b/dist/v-1521124836513/emojis/1f3bc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3bc.png rename to dist/v-1521124836513/emojis/1f3bc.png diff --git a/dist/v-1520418874500/emojis/1f3bd.png b/dist/v-1521124836513/emojis/1f3bd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3bd.png rename to dist/v-1521124836513/emojis/1f3bd.png diff --git a/dist/v-1520418874500/emojis/1f3be.png b/dist/v-1521124836513/emojis/1f3be.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3be.png rename to dist/v-1521124836513/emojis/1f3be.png diff --git a/dist/v-1520418874500/emojis/1f3bf.png b/dist/v-1521124836513/emojis/1f3bf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3bf.png rename to dist/v-1521124836513/emojis/1f3bf.png diff --git a/dist/v-1520418874500/emojis/1f3c0.png b/dist/v-1521124836513/emojis/1f3c0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c0.png rename to dist/v-1521124836513/emojis/1f3c0.png diff --git a/dist/v-1520418874500/emojis/1f3c1.png b/dist/v-1521124836513/emojis/1f3c1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c1.png rename to dist/v-1521124836513/emojis/1f3c1.png diff --git a/dist/v-1520418874500/emojis/1f3c2.png b/dist/v-1521124836513/emojis/1f3c2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c2.png rename to dist/v-1521124836513/emojis/1f3c2.png diff --git a/dist/v-1520418874500/emojis/1f3c3-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f3c3-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c3-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f3c3-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3c3-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f3c3-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c3-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f3c3-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3c3.png b/dist/v-1521124836513/emojis/1f3c3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c3.png rename to dist/v-1521124836513/emojis/1f3c3.png diff --git a/dist/v-1520418874500/emojis/1f3c4-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f3c4-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c4-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f3c4-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3c4-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f3c4-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c4-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f3c4-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3c4.png b/dist/v-1521124836513/emojis/1f3c4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c4.png rename to dist/v-1521124836513/emojis/1f3c4.png diff --git a/dist/v-1520418874500/emojis/1f3c5.png b/dist/v-1521124836513/emojis/1f3c5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c5.png rename to dist/v-1521124836513/emojis/1f3c5.png diff --git a/dist/v-1520418874500/emojis/1f3c6.png b/dist/v-1521124836513/emojis/1f3c6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c6.png rename to dist/v-1521124836513/emojis/1f3c6.png diff --git a/dist/v-1520418874500/emojis/1f3c7.png b/dist/v-1521124836513/emojis/1f3c7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c7.png rename to dist/v-1521124836513/emojis/1f3c7.png diff --git a/dist/v-1520418874500/emojis/1f3c8.png b/dist/v-1521124836513/emojis/1f3c8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c8.png rename to dist/v-1521124836513/emojis/1f3c8.png diff --git a/dist/v-1520418874500/emojis/1f3c9.png b/dist/v-1521124836513/emojis/1f3c9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3c9.png rename to dist/v-1521124836513/emojis/1f3c9.png diff --git a/dist/v-1520418874500/emojis/1f3ca-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f3ca-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ca-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f3ca-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3ca-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f3ca-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ca-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f3ca-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3ca.png b/dist/v-1521124836513/emojis/1f3ca.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ca.png rename to dist/v-1521124836513/emojis/1f3ca.png diff --git a/dist/v-1520418874500/emojis/1f3cb-fe0f-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f3cb-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cb-fe0f-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f3cb-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3cb-fe0f-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f3cb-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cb-fe0f-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f3cb-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3cb.png b/dist/v-1521124836513/emojis/1f3cb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cb.png rename to dist/v-1521124836513/emojis/1f3cb.png diff --git a/dist/v-1520418874500/emojis/1f3cc-fe0f-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f3cc-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cc-fe0f-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f3cc-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3cc-fe0f-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f3cc-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cc-fe0f-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f3cc-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f3cc.png b/dist/v-1521124836513/emojis/1f3cc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cc.png rename to dist/v-1521124836513/emojis/1f3cc.png diff --git a/dist/v-1520418874500/emojis/1f3cd.png b/dist/v-1521124836513/emojis/1f3cd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cd.png rename to dist/v-1521124836513/emojis/1f3cd.png diff --git a/dist/v-1520418874500/emojis/1f3ce.png b/dist/v-1521124836513/emojis/1f3ce.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ce.png rename to dist/v-1521124836513/emojis/1f3ce.png diff --git a/dist/v-1520418874500/emojis/1f3cf.png b/dist/v-1521124836513/emojis/1f3cf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3cf.png rename to dist/v-1521124836513/emojis/1f3cf.png diff --git a/dist/v-1520418874500/emojis/1f3d0.png b/dist/v-1521124836513/emojis/1f3d0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d0.png rename to dist/v-1521124836513/emojis/1f3d0.png diff --git a/dist/v-1520418874500/emojis/1f3d1.png b/dist/v-1521124836513/emojis/1f3d1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d1.png rename to dist/v-1521124836513/emojis/1f3d1.png diff --git a/dist/v-1520418874500/emojis/1f3d2.png b/dist/v-1521124836513/emojis/1f3d2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d2.png rename to dist/v-1521124836513/emojis/1f3d2.png diff --git a/dist/v-1520418874500/emojis/1f3d3.png b/dist/v-1521124836513/emojis/1f3d3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d3.png rename to dist/v-1521124836513/emojis/1f3d3.png diff --git a/dist/v-1520418874500/emojis/1f3d4.png b/dist/v-1521124836513/emojis/1f3d4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d4.png rename to dist/v-1521124836513/emojis/1f3d4.png diff --git a/dist/v-1520418874500/emojis/1f3d5.png b/dist/v-1521124836513/emojis/1f3d5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d5.png rename to dist/v-1521124836513/emojis/1f3d5.png diff --git a/dist/v-1520418874500/emojis/1f3d6.png b/dist/v-1521124836513/emojis/1f3d6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d6.png rename to dist/v-1521124836513/emojis/1f3d6.png diff --git a/dist/v-1520418874500/emojis/1f3d7.png b/dist/v-1521124836513/emojis/1f3d7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d7.png rename to dist/v-1521124836513/emojis/1f3d7.png diff --git a/dist/v-1520418874500/emojis/1f3d8.png b/dist/v-1521124836513/emojis/1f3d8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d8.png rename to dist/v-1521124836513/emojis/1f3d8.png diff --git a/dist/v-1520418874500/emojis/1f3d9.png b/dist/v-1521124836513/emojis/1f3d9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3d9.png rename to dist/v-1521124836513/emojis/1f3d9.png diff --git a/dist/v-1520418874500/emojis/1f3da.png b/dist/v-1521124836513/emojis/1f3da.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3da.png rename to dist/v-1521124836513/emojis/1f3da.png diff --git a/dist/v-1520418874500/emojis/1f3db.png b/dist/v-1521124836513/emojis/1f3db.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3db.png rename to dist/v-1521124836513/emojis/1f3db.png diff --git a/dist/v-1520418874500/emojis/1f3dc.png b/dist/v-1521124836513/emojis/1f3dc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3dc.png rename to dist/v-1521124836513/emojis/1f3dc.png diff --git a/dist/v-1520418874500/emojis/1f3dd.png b/dist/v-1521124836513/emojis/1f3dd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3dd.png rename to dist/v-1521124836513/emojis/1f3dd.png diff --git a/dist/v-1520418874500/emojis/1f3de.png b/dist/v-1521124836513/emojis/1f3de.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3de.png rename to dist/v-1521124836513/emojis/1f3de.png diff --git a/dist/v-1520418874500/emojis/1f3df.png b/dist/v-1521124836513/emojis/1f3df.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3df.png rename to dist/v-1521124836513/emojis/1f3df.png diff --git a/dist/v-1520418874500/emojis/1f3e0.png b/dist/v-1521124836513/emojis/1f3e0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e0.png rename to dist/v-1521124836513/emojis/1f3e0.png diff --git a/dist/v-1520418874500/emojis/1f3e1.png b/dist/v-1521124836513/emojis/1f3e1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e1.png rename to dist/v-1521124836513/emojis/1f3e1.png diff --git a/dist/v-1520418874500/emojis/1f3e2.png b/dist/v-1521124836513/emojis/1f3e2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e2.png rename to dist/v-1521124836513/emojis/1f3e2.png diff --git a/dist/v-1520418874500/emojis/1f3e3.png b/dist/v-1521124836513/emojis/1f3e3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e3.png rename to dist/v-1521124836513/emojis/1f3e3.png diff --git a/dist/v-1520418874500/emojis/1f3e4.png b/dist/v-1521124836513/emojis/1f3e4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e4.png rename to dist/v-1521124836513/emojis/1f3e4.png diff --git a/dist/v-1520418874500/emojis/1f3e5.png b/dist/v-1521124836513/emojis/1f3e5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e5.png rename to dist/v-1521124836513/emojis/1f3e5.png diff --git a/dist/v-1520418874500/emojis/1f3e6.png b/dist/v-1521124836513/emojis/1f3e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e6.png rename to dist/v-1521124836513/emojis/1f3e6.png diff --git a/dist/v-1520418874500/emojis/1f3e7.png b/dist/v-1521124836513/emojis/1f3e7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e7.png rename to dist/v-1521124836513/emojis/1f3e7.png diff --git a/dist/v-1520418874500/emojis/1f3e8.png b/dist/v-1521124836513/emojis/1f3e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e8.png rename to dist/v-1521124836513/emojis/1f3e8.png diff --git a/dist/v-1520418874500/emojis/1f3e9.png b/dist/v-1521124836513/emojis/1f3e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3e9.png rename to dist/v-1521124836513/emojis/1f3e9.png diff --git a/dist/v-1520418874500/emojis/1f3ea.png b/dist/v-1521124836513/emojis/1f3ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ea.png rename to dist/v-1521124836513/emojis/1f3ea.png diff --git a/dist/v-1520418874500/emojis/1f3eb.png b/dist/v-1521124836513/emojis/1f3eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3eb.png rename to dist/v-1521124836513/emojis/1f3eb.png diff --git a/dist/v-1520418874500/emojis/1f3ec.png b/dist/v-1521124836513/emojis/1f3ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ec.png rename to dist/v-1521124836513/emojis/1f3ec.png diff --git a/dist/v-1520418874500/emojis/1f3ed.png b/dist/v-1521124836513/emojis/1f3ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ed.png rename to dist/v-1521124836513/emojis/1f3ed.png diff --git a/dist/v-1520418874500/emojis/1f3ee.png b/dist/v-1521124836513/emojis/1f3ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ee.png rename to dist/v-1521124836513/emojis/1f3ee.png diff --git a/dist/v-1520418874500/emojis/1f3ef.png b/dist/v-1521124836513/emojis/1f3ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ef.png rename to dist/v-1521124836513/emojis/1f3ef.png diff --git a/dist/v-1520418874500/emojis/1f3f0.png b/dist/v-1521124836513/emojis/1f3f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f0.png rename to dist/v-1521124836513/emojis/1f3f0.png diff --git a/dist/v-1520418874500/emojis/1f3f3-fe0f-200d-1f308.png b/dist/v-1521124836513/emojis/1f3f3-fe0f-200d-1f308.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f3-fe0f-200d-1f308.png rename to dist/v-1521124836513/emojis/1f3f3-fe0f-200d-1f308.png diff --git a/dist/v-1520418874500/emojis/1f3f3.png b/dist/v-1521124836513/emojis/1f3f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f3.png rename to dist/v-1521124836513/emojis/1f3f3.png diff --git a/dist/v-1520418874500/emojis/1f3f4.png b/dist/v-1521124836513/emojis/1f3f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f4.png rename to dist/v-1521124836513/emojis/1f3f4.png diff --git a/dist/v-1520418874500/emojis/1f3f5.png b/dist/v-1521124836513/emojis/1f3f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f5.png rename to dist/v-1521124836513/emojis/1f3f5.png diff --git a/dist/v-1520418874500/emojis/1f3f7.png b/dist/v-1521124836513/emojis/1f3f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f7.png rename to dist/v-1521124836513/emojis/1f3f7.png diff --git a/dist/v-1520418874500/emojis/1f3f8.png b/dist/v-1521124836513/emojis/1f3f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f8.png rename to dist/v-1521124836513/emojis/1f3f8.png diff --git a/dist/v-1520418874500/emojis/1f3f9.png b/dist/v-1521124836513/emojis/1f3f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3f9.png rename to dist/v-1521124836513/emojis/1f3f9.png diff --git a/dist/v-1520418874500/emojis/1f3fa.png b/dist/v-1521124836513/emojis/1f3fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3fa.png rename to dist/v-1521124836513/emojis/1f3fa.png diff --git a/dist/v-1520418874500/emojis/1f3fb.png b/dist/v-1521124836513/emojis/1f3fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3fb.png rename to dist/v-1521124836513/emojis/1f3fb.png diff --git a/dist/v-1520418874500/emojis/1f3fc.png b/dist/v-1521124836513/emojis/1f3fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3fc.png rename to dist/v-1521124836513/emojis/1f3fc.png diff --git a/dist/v-1520418874500/emojis/1f3fd.png b/dist/v-1521124836513/emojis/1f3fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3fd.png rename to dist/v-1521124836513/emojis/1f3fd.png diff --git a/dist/v-1520418874500/emojis/1f3fe.png b/dist/v-1521124836513/emojis/1f3fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3fe.png rename to dist/v-1521124836513/emojis/1f3fe.png diff --git a/dist/v-1520418874500/emojis/1f3ff.png b/dist/v-1521124836513/emojis/1f3ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f3ff.png rename to dist/v-1521124836513/emojis/1f3ff.png diff --git a/dist/v-1520418874500/emojis/1f400.png b/dist/v-1521124836513/emojis/1f400.png similarity index 100% rename from dist/v-1520418874500/emojis/1f400.png rename to dist/v-1521124836513/emojis/1f400.png diff --git a/dist/v-1520418874500/emojis/1f401.png b/dist/v-1521124836513/emojis/1f401.png similarity index 100% rename from dist/v-1520418874500/emojis/1f401.png rename to dist/v-1521124836513/emojis/1f401.png diff --git a/dist/v-1520418874500/emojis/1f402.png b/dist/v-1521124836513/emojis/1f402.png similarity index 100% rename from dist/v-1520418874500/emojis/1f402.png rename to dist/v-1521124836513/emojis/1f402.png diff --git a/dist/v-1520418874500/emojis/1f403.png b/dist/v-1521124836513/emojis/1f403.png similarity index 100% rename from dist/v-1520418874500/emojis/1f403.png rename to dist/v-1521124836513/emojis/1f403.png diff --git a/dist/v-1520418874500/emojis/1f404.png b/dist/v-1521124836513/emojis/1f404.png similarity index 100% rename from dist/v-1520418874500/emojis/1f404.png rename to dist/v-1521124836513/emojis/1f404.png diff --git a/dist/v-1520418874500/emojis/1f405.png b/dist/v-1521124836513/emojis/1f405.png similarity index 100% rename from dist/v-1520418874500/emojis/1f405.png rename to dist/v-1521124836513/emojis/1f405.png diff --git a/dist/v-1520418874500/emojis/1f406.png b/dist/v-1521124836513/emojis/1f406.png similarity index 100% rename from dist/v-1520418874500/emojis/1f406.png rename to dist/v-1521124836513/emojis/1f406.png diff --git a/dist/v-1520418874500/emojis/1f407.png b/dist/v-1521124836513/emojis/1f407.png similarity index 100% rename from dist/v-1520418874500/emojis/1f407.png rename to dist/v-1521124836513/emojis/1f407.png diff --git a/dist/v-1520418874500/emojis/1f408.png b/dist/v-1521124836513/emojis/1f408.png similarity index 100% rename from dist/v-1520418874500/emojis/1f408.png rename to dist/v-1521124836513/emojis/1f408.png diff --git a/dist/v-1520418874500/emojis/1f409.png b/dist/v-1521124836513/emojis/1f409.png similarity index 100% rename from dist/v-1520418874500/emojis/1f409.png rename to dist/v-1521124836513/emojis/1f409.png diff --git a/dist/v-1520418874500/emojis/1f40a.png b/dist/v-1521124836513/emojis/1f40a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f40a.png rename to dist/v-1521124836513/emojis/1f40a.png diff --git a/dist/v-1520418874500/emojis/1f40b.png b/dist/v-1521124836513/emojis/1f40b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f40b.png rename to dist/v-1521124836513/emojis/1f40b.png diff --git a/dist/v-1520418874500/emojis/1f40c.png b/dist/v-1521124836513/emojis/1f40c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f40c.png rename to dist/v-1521124836513/emojis/1f40c.png diff --git a/dist/v-1520418874500/emojis/1f40d.png b/dist/v-1521124836513/emojis/1f40d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f40d.png rename to dist/v-1521124836513/emojis/1f40d.png diff --git a/dist/v-1520418874500/emojis/1f40e.png b/dist/v-1521124836513/emojis/1f40e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f40e.png rename to dist/v-1521124836513/emojis/1f40e.png diff --git a/dist/v-1520418874500/emojis/1f40f.png b/dist/v-1521124836513/emojis/1f40f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f40f.png rename to dist/v-1521124836513/emojis/1f40f.png diff --git a/dist/v-1520418874500/emojis/1f410.png b/dist/v-1521124836513/emojis/1f410.png similarity index 100% rename from dist/v-1520418874500/emojis/1f410.png rename to dist/v-1521124836513/emojis/1f410.png diff --git a/dist/v-1520418874500/emojis/1f411.png b/dist/v-1521124836513/emojis/1f411.png similarity index 100% rename from dist/v-1520418874500/emojis/1f411.png rename to dist/v-1521124836513/emojis/1f411.png diff --git a/dist/v-1520418874500/emojis/1f412.png b/dist/v-1521124836513/emojis/1f412.png similarity index 100% rename from dist/v-1520418874500/emojis/1f412.png rename to dist/v-1521124836513/emojis/1f412.png diff --git a/dist/v-1520418874500/emojis/1f413.png b/dist/v-1521124836513/emojis/1f413.png similarity index 100% rename from dist/v-1520418874500/emojis/1f413.png rename to dist/v-1521124836513/emojis/1f413.png diff --git a/dist/v-1520418874500/emojis/1f414.png b/dist/v-1521124836513/emojis/1f414.png similarity index 100% rename from dist/v-1520418874500/emojis/1f414.png rename to dist/v-1521124836513/emojis/1f414.png diff --git a/dist/v-1520418874500/emojis/1f415.png b/dist/v-1521124836513/emojis/1f415.png similarity index 100% rename from dist/v-1520418874500/emojis/1f415.png rename to dist/v-1521124836513/emojis/1f415.png diff --git a/dist/v-1520418874500/emojis/1f416.png b/dist/v-1521124836513/emojis/1f416.png similarity index 100% rename from dist/v-1520418874500/emojis/1f416.png rename to dist/v-1521124836513/emojis/1f416.png diff --git a/dist/v-1520418874500/emojis/1f417.png b/dist/v-1521124836513/emojis/1f417.png similarity index 100% rename from dist/v-1520418874500/emojis/1f417.png rename to dist/v-1521124836513/emojis/1f417.png diff --git a/dist/v-1520418874500/emojis/1f418.png b/dist/v-1521124836513/emojis/1f418.png similarity index 100% rename from dist/v-1520418874500/emojis/1f418.png rename to dist/v-1521124836513/emojis/1f418.png diff --git a/dist/v-1520418874500/emojis/1f419.png b/dist/v-1521124836513/emojis/1f419.png similarity index 100% rename from dist/v-1520418874500/emojis/1f419.png rename to dist/v-1521124836513/emojis/1f419.png diff --git a/dist/v-1520418874500/emojis/1f41a.png b/dist/v-1521124836513/emojis/1f41a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f41a.png rename to dist/v-1521124836513/emojis/1f41a.png diff --git a/dist/v-1520418874500/emojis/1f41b.png b/dist/v-1521124836513/emojis/1f41b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f41b.png rename to dist/v-1521124836513/emojis/1f41b.png diff --git a/dist/v-1520418874500/emojis/1f41c.png b/dist/v-1521124836513/emojis/1f41c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f41c.png rename to dist/v-1521124836513/emojis/1f41c.png diff --git a/dist/v-1520418874500/emojis/1f41d.png b/dist/v-1521124836513/emojis/1f41d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f41d.png rename to dist/v-1521124836513/emojis/1f41d.png diff --git a/dist/v-1520418874500/emojis/1f41e.png b/dist/v-1521124836513/emojis/1f41e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f41e.png rename to dist/v-1521124836513/emojis/1f41e.png diff --git a/dist/v-1520418874500/emojis/1f41f.png b/dist/v-1521124836513/emojis/1f41f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f41f.png rename to dist/v-1521124836513/emojis/1f41f.png diff --git a/dist/v-1520418874500/emojis/1f420.png b/dist/v-1521124836513/emojis/1f420.png similarity index 100% rename from dist/v-1520418874500/emojis/1f420.png rename to dist/v-1521124836513/emojis/1f420.png diff --git a/dist/v-1520418874500/emojis/1f421.png b/dist/v-1521124836513/emojis/1f421.png similarity index 100% rename from dist/v-1520418874500/emojis/1f421.png rename to dist/v-1521124836513/emojis/1f421.png diff --git a/dist/v-1520418874500/emojis/1f422.png b/dist/v-1521124836513/emojis/1f422.png similarity index 100% rename from dist/v-1520418874500/emojis/1f422.png rename to dist/v-1521124836513/emojis/1f422.png diff --git a/dist/v-1520418874500/emojis/1f423.png b/dist/v-1521124836513/emojis/1f423.png similarity index 100% rename from dist/v-1520418874500/emojis/1f423.png rename to dist/v-1521124836513/emojis/1f423.png diff --git a/dist/v-1520418874500/emojis/1f424.png b/dist/v-1521124836513/emojis/1f424.png similarity index 100% rename from dist/v-1520418874500/emojis/1f424.png rename to dist/v-1521124836513/emojis/1f424.png diff --git a/dist/v-1520418874500/emojis/1f425.png b/dist/v-1521124836513/emojis/1f425.png similarity index 100% rename from dist/v-1520418874500/emojis/1f425.png rename to dist/v-1521124836513/emojis/1f425.png diff --git a/dist/v-1520418874500/emojis/1f426.png b/dist/v-1521124836513/emojis/1f426.png similarity index 100% rename from dist/v-1520418874500/emojis/1f426.png rename to dist/v-1521124836513/emojis/1f426.png diff --git a/dist/v-1520418874500/emojis/1f427.png b/dist/v-1521124836513/emojis/1f427.png similarity index 100% rename from dist/v-1520418874500/emojis/1f427.png rename to dist/v-1521124836513/emojis/1f427.png diff --git a/dist/v-1520418874500/emojis/1f428.png b/dist/v-1521124836513/emojis/1f428.png similarity index 100% rename from dist/v-1520418874500/emojis/1f428.png rename to dist/v-1521124836513/emojis/1f428.png diff --git a/dist/v-1520418874500/emojis/1f429.png b/dist/v-1521124836513/emojis/1f429.png similarity index 100% rename from dist/v-1520418874500/emojis/1f429.png rename to dist/v-1521124836513/emojis/1f429.png diff --git a/dist/v-1520418874500/emojis/1f42a.png b/dist/v-1521124836513/emojis/1f42a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f42a.png rename to dist/v-1521124836513/emojis/1f42a.png diff --git a/dist/v-1520418874500/emojis/1f42b.png b/dist/v-1521124836513/emojis/1f42b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f42b.png rename to dist/v-1521124836513/emojis/1f42b.png diff --git a/dist/v-1520418874500/emojis/1f42c.png b/dist/v-1521124836513/emojis/1f42c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f42c.png rename to dist/v-1521124836513/emojis/1f42c.png diff --git a/dist/v-1520418874500/emojis/1f42d.png b/dist/v-1521124836513/emojis/1f42d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f42d.png rename to dist/v-1521124836513/emojis/1f42d.png diff --git a/dist/v-1520418874500/emojis/1f42e.png b/dist/v-1521124836513/emojis/1f42e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f42e.png rename to dist/v-1521124836513/emojis/1f42e.png diff --git a/dist/v-1520418874500/emojis/1f42f.png b/dist/v-1521124836513/emojis/1f42f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f42f.png rename to dist/v-1521124836513/emojis/1f42f.png diff --git a/dist/v-1520418874500/emojis/1f430.png b/dist/v-1521124836513/emojis/1f430.png similarity index 100% rename from dist/v-1520418874500/emojis/1f430.png rename to dist/v-1521124836513/emojis/1f430.png diff --git a/dist/v-1520418874500/emojis/1f431.png b/dist/v-1521124836513/emojis/1f431.png similarity index 100% rename from dist/v-1520418874500/emojis/1f431.png rename to dist/v-1521124836513/emojis/1f431.png diff --git a/dist/v-1520418874500/emojis/1f432.png b/dist/v-1521124836513/emojis/1f432.png similarity index 100% rename from dist/v-1520418874500/emojis/1f432.png rename to dist/v-1521124836513/emojis/1f432.png diff --git a/dist/v-1520418874500/emojis/1f433.png b/dist/v-1521124836513/emojis/1f433.png similarity index 100% rename from dist/v-1520418874500/emojis/1f433.png rename to dist/v-1521124836513/emojis/1f433.png diff --git a/dist/v-1520418874500/emojis/1f434.png b/dist/v-1521124836513/emojis/1f434.png similarity index 100% rename from dist/v-1520418874500/emojis/1f434.png rename to dist/v-1521124836513/emojis/1f434.png diff --git a/dist/v-1520418874500/emojis/1f435.png b/dist/v-1521124836513/emojis/1f435.png similarity index 100% rename from dist/v-1520418874500/emojis/1f435.png rename to dist/v-1521124836513/emojis/1f435.png diff --git a/dist/v-1520418874500/emojis/1f436.png b/dist/v-1521124836513/emojis/1f436.png similarity index 100% rename from dist/v-1520418874500/emojis/1f436.png rename to dist/v-1521124836513/emojis/1f436.png diff --git a/dist/v-1520418874500/emojis/1f437.png b/dist/v-1521124836513/emojis/1f437.png similarity index 100% rename from dist/v-1520418874500/emojis/1f437.png rename to dist/v-1521124836513/emojis/1f437.png diff --git a/dist/v-1520418874500/emojis/1f438.png b/dist/v-1521124836513/emojis/1f438.png similarity index 100% rename from dist/v-1520418874500/emojis/1f438.png rename to dist/v-1521124836513/emojis/1f438.png diff --git a/dist/v-1520418874500/emojis/1f439.png b/dist/v-1521124836513/emojis/1f439.png similarity index 100% rename from dist/v-1520418874500/emojis/1f439.png rename to dist/v-1521124836513/emojis/1f439.png diff --git a/dist/v-1520418874500/emojis/1f43a.png b/dist/v-1521124836513/emojis/1f43a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f43a.png rename to dist/v-1521124836513/emojis/1f43a.png diff --git a/dist/v-1520418874500/emojis/1f43b.png b/dist/v-1521124836513/emojis/1f43b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f43b.png rename to dist/v-1521124836513/emojis/1f43b.png diff --git a/dist/v-1520418874500/emojis/1f43c.png b/dist/v-1521124836513/emojis/1f43c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f43c.png rename to dist/v-1521124836513/emojis/1f43c.png diff --git a/dist/v-1520418874500/emojis/1f43d.png b/dist/v-1521124836513/emojis/1f43d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f43d.png rename to dist/v-1521124836513/emojis/1f43d.png diff --git a/dist/v-1520418874500/emojis/1f43e.png b/dist/v-1521124836513/emojis/1f43e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f43e.png rename to dist/v-1521124836513/emojis/1f43e.png diff --git a/dist/v-1520418874500/emojis/1f43f.png b/dist/v-1521124836513/emojis/1f43f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f43f.png rename to dist/v-1521124836513/emojis/1f43f.png diff --git a/dist/v-1520418874500/emojis/1f440.png b/dist/v-1521124836513/emojis/1f440.png similarity index 100% rename from dist/v-1520418874500/emojis/1f440.png rename to dist/v-1521124836513/emojis/1f440.png diff --git a/dist/v-1520418874500/emojis/1f441.png b/dist/v-1521124836513/emojis/1f441.png similarity index 100% rename from dist/v-1520418874500/emojis/1f441.png rename to dist/v-1521124836513/emojis/1f441.png diff --git a/dist/v-1520418874500/emojis/1f442.png b/dist/v-1521124836513/emojis/1f442.png similarity index 100% rename from dist/v-1520418874500/emojis/1f442.png rename to dist/v-1521124836513/emojis/1f442.png diff --git a/dist/v-1520418874500/emojis/1f443.png b/dist/v-1521124836513/emojis/1f443.png similarity index 100% rename from dist/v-1520418874500/emojis/1f443.png rename to dist/v-1521124836513/emojis/1f443.png diff --git a/dist/v-1520418874500/emojis/1f444.png b/dist/v-1521124836513/emojis/1f444.png similarity index 100% rename from dist/v-1520418874500/emojis/1f444.png rename to dist/v-1521124836513/emojis/1f444.png diff --git a/dist/v-1520418874500/emojis/1f445.png b/dist/v-1521124836513/emojis/1f445.png similarity index 100% rename from dist/v-1520418874500/emojis/1f445.png rename to dist/v-1521124836513/emojis/1f445.png diff --git a/dist/v-1520418874500/emojis/1f446.png b/dist/v-1521124836513/emojis/1f446.png similarity index 100% rename from dist/v-1520418874500/emojis/1f446.png rename to dist/v-1521124836513/emojis/1f446.png diff --git a/dist/v-1520418874500/emojis/1f447.png b/dist/v-1521124836513/emojis/1f447.png similarity index 100% rename from dist/v-1520418874500/emojis/1f447.png rename to dist/v-1521124836513/emojis/1f447.png diff --git a/dist/v-1520418874500/emojis/1f448.png b/dist/v-1521124836513/emojis/1f448.png similarity index 100% rename from dist/v-1520418874500/emojis/1f448.png rename to dist/v-1521124836513/emojis/1f448.png diff --git a/dist/v-1520418874500/emojis/1f449.png b/dist/v-1521124836513/emojis/1f449.png similarity index 100% rename from dist/v-1520418874500/emojis/1f449.png rename to dist/v-1521124836513/emojis/1f449.png diff --git a/dist/v-1520418874500/emojis/1f44a.png b/dist/v-1521124836513/emojis/1f44a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f44a.png rename to dist/v-1521124836513/emojis/1f44a.png diff --git a/dist/v-1520418874500/emojis/1f44b.png b/dist/v-1521124836513/emojis/1f44b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f44b.png rename to dist/v-1521124836513/emojis/1f44b.png diff --git a/dist/v-1520418874500/emojis/1f44c.png b/dist/v-1521124836513/emojis/1f44c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f44c.png rename to dist/v-1521124836513/emojis/1f44c.png diff --git a/dist/v-1520418874500/emojis/1f44d.png b/dist/v-1521124836513/emojis/1f44d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f44d.png rename to dist/v-1521124836513/emojis/1f44d.png diff --git a/dist/v-1520418874500/emojis/1f44e.png b/dist/v-1521124836513/emojis/1f44e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f44e.png rename to dist/v-1521124836513/emojis/1f44e.png diff --git a/dist/v-1520418874500/emojis/1f44f.png b/dist/v-1521124836513/emojis/1f44f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f44f.png rename to dist/v-1521124836513/emojis/1f44f.png diff --git a/dist/v-1520418874500/emojis/1f450.png b/dist/v-1521124836513/emojis/1f450.png similarity index 100% rename from dist/v-1520418874500/emojis/1f450.png rename to dist/v-1521124836513/emojis/1f450.png diff --git a/dist/v-1520418874500/emojis/1f451.png b/dist/v-1521124836513/emojis/1f451.png similarity index 100% rename from dist/v-1520418874500/emojis/1f451.png rename to dist/v-1521124836513/emojis/1f451.png diff --git a/dist/v-1520418874500/emojis/1f452.png b/dist/v-1521124836513/emojis/1f452.png similarity index 100% rename from dist/v-1520418874500/emojis/1f452.png rename to dist/v-1521124836513/emojis/1f452.png diff --git a/dist/v-1520418874500/emojis/1f453.png b/dist/v-1521124836513/emojis/1f453.png similarity index 100% rename from dist/v-1520418874500/emojis/1f453.png rename to dist/v-1521124836513/emojis/1f453.png diff --git a/dist/v-1520418874500/emojis/1f454.png b/dist/v-1521124836513/emojis/1f454.png similarity index 100% rename from dist/v-1520418874500/emojis/1f454.png rename to dist/v-1521124836513/emojis/1f454.png diff --git a/dist/v-1520418874500/emojis/1f455.png b/dist/v-1521124836513/emojis/1f455.png similarity index 100% rename from dist/v-1520418874500/emojis/1f455.png rename to dist/v-1521124836513/emojis/1f455.png diff --git a/dist/v-1520418874500/emojis/1f456.png b/dist/v-1521124836513/emojis/1f456.png similarity index 100% rename from dist/v-1520418874500/emojis/1f456.png rename to dist/v-1521124836513/emojis/1f456.png diff --git a/dist/v-1520418874500/emojis/1f457.png b/dist/v-1521124836513/emojis/1f457.png similarity index 100% rename from dist/v-1520418874500/emojis/1f457.png rename to dist/v-1521124836513/emojis/1f457.png diff --git a/dist/v-1520418874500/emojis/1f458.png b/dist/v-1521124836513/emojis/1f458.png similarity index 100% rename from dist/v-1520418874500/emojis/1f458.png rename to dist/v-1521124836513/emojis/1f458.png diff --git a/dist/v-1520418874500/emojis/1f459.png b/dist/v-1521124836513/emojis/1f459.png similarity index 100% rename from dist/v-1520418874500/emojis/1f459.png rename to dist/v-1521124836513/emojis/1f459.png diff --git a/dist/v-1520418874500/emojis/1f45a.png b/dist/v-1521124836513/emojis/1f45a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f45a.png rename to dist/v-1521124836513/emojis/1f45a.png diff --git a/dist/v-1520418874500/emojis/1f45b.png b/dist/v-1521124836513/emojis/1f45b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f45b.png rename to dist/v-1521124836513/emojis/1f45b.png diff --git a/dist/v-1520418874500/emojis/1f45c.png b/dist/v-1521124836513/emojis/1f45c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f45c.png rename to dist/v-1521124836513/emojis/1f45c.png diff --git a/dist/v-1520418874500/emojis/1f45d.png b/dist/v-1521124836513/emojis/1f45d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f45d.png rename to dist/v-1521124836513/emojis/1f45d.png diff --git a/dist/v-1520418874500/emojis/1f45e.png b/dist/v-1521124836513/emojis/1f45e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f45e.png rename to dist/v-1521124836513/emojis/1f45e.png diff --git a/dist/v-1520418874500/emojis/1f45f.png b/dist/v-1521124836513/emojis/1f45f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f45f.png rename to dist/v-1521124836513/emojis/1f45f.png diff --git a/dist/v-1520418874500/emojis/1f460.png b/dist/v-1521124836513/emojis/1f460.png similarity index 100% rename from dist/v-1520418874500/emojis/1f460.png rename to dist/v-1521124836513/emojis/1f460.png diff --git a/dist/v-1520418874500/emojis/1f461.png b/dist/v-1521124836513/emojis/1f461.png similarity index 100% rename from dist/v-1520418874500/emojis/1f461.png rename to dist/v-1521124836513/emojis/1f461.png diff --git a/dist/v-1520418874500/emojis/1f462.png b/dist/v-1521124836513/emojis/1f462.png similarity index 100% rename from dist/v-1520418874500/emojis/1f462.png rename to dist/v-1521124836513/emojis/1f462.png diff --git a/dist/v-1520418874500/emojis/1f463.png b/dist/v-1521124836513/emojis/1f463.png similarity index 100% rename from dist/v-1520418874500/emojis/1f463.png rename to dist/v-1521124836513/emojis/1f463.png diff --git a/dist/v-1520418874500/emojis/1f464.png b/dist/v-1521124836513/emojis/1f464.png similarity index 100% rename from dist/v-1520418874500/emojis/1f464.png rename to dist/v-1521124836513/emojis/1f464.png diff --git a/dist/v-1520418874500/emojis/1f465.png b/dist/v-1521124836513/emojis/1f465.png similarity index 100% rename from dist/v-1520418874500/emojis/1f465.png rename to dist/v-1521124836513/emojis/1f465.png diff --git a/dist/v-1520418874500/emojis/1f466.png b/dist/v-1521124836513/emojis/1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f466.png rename to dist/v-1521124836513/emojis/1f466.png diff --git a/dist/v-1520418874500/emojis/1f467.png b/dist/v-1521124836513/emojis/1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f467.png rename to dist/v-1521124836513/emojis/1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f33e.png b/dist/v-1521124836513/emojis/1f468-200d-1f33e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f33e.png rename to dist/v-1521124836513/emojis/1f468-200d-1f33e.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f373.png b/dist/v-1521124836513/emojis/1f468-200d-1f373.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f373.png rename to dist/v-1521124836513/emojis/1f468-200d-1f373.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f393.png b/dist/v-1521124836513/emojis/1f468-200d-1f393.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f393.png rename to dist/v-1521124836513/emojis/1f468-200d-1f393.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f3a4.png b/dist/v-1521124836513/emojis/1f468-200d-1f3a4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f3a4.png rename to dist/v-1521124836513/emojis/1f468-200d-1f3a4.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f3a8.png b/dist/v-1521124836513/emojis/1f468-200d-1f3a8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f3a8.png rename to dist/v-1521124836513/emojis/1f468-200d-1f3a8.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f3eb.png b/dist/v-1521124836513/emojis/1f468-200d-1f3eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f3eb.png rename to dist/v-1521124836513/emojis/1f468-200d-1f3eb.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f3ed.png b/dist/v-1521124836513/emojis/1f468-200d-1f3ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f3ed.png rename to dist/v-1521124836513/emojis/1f468-200d-1f3ed.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f466-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f466-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f466-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f467-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f467-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f467-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f467-200d-1f467.png b/dist/v-1521124836513/emojis/1f468-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f467-200d-1f467.png rename to dist/v-1521124836513/emojis/1f468-200d-1f467-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f467.png b/dist/v-1521124836513/emojis/1f468-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f467.png rename to dist/v-1521124836513/emojis/1f468-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png b/dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png rename to dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f467.png b/dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f468-200d-1f467.png rename to dist/v-1521124836513/emojis/1f468-200d-1f468-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png b/dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png rename to dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png b/dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png rename to dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f467.png b/dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f469-200d-1f467.png rename to dist/v-1521124836513/emojis/1f468-200d-1f469-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f4bb.png b/dist/v-1521124836513/emojis/1f468-200d-1f4bb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f4bb.png rename to dist/v-1521124836513/emojis/1f468-200d-1f4bb.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f4bc.png b/dist/v-1521124836513/emojis/1f468-200d-1f4bc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f4bc.png rename to dist/v-1521124836513/emojis/1f468-200d-1f4bc.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f527.png b/dist/v-1521124836513/emojis/1f468-200d-1f527.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f527.png rename to dist/v-1521124836513/emojis/1f468-200d-1f527.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f52c.png b/dist/v-1521124836513/emojis/1f468-200d-1f52c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f52c.png rename to dist/v-1521124836513/emojis/1f468-200d-1f52c.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f680.png b/dist/v-1521124836513/emojis/1f468-200d-1f680.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f680.png rename to dist/v-1521124836513/emojis/1f468-200d-1f680.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-1f692.png b/dist/v-1521124836513/emojis/1f468-200d-1f692.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-1f692.png rename to dist/v-1521124836513/emojis/1f468-200d-1f692.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-2695-fe0f.png b/dist/v-1521124836513/emojis/1f468-200d-2695-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-2695-fe0f.png rename to dist/v-1521124836513/emojis/1f468-200d-2695-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-2696-fe0f.png b/dist/v-1521124836513/emojis/1f468-200d-2696-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-2696-fe0f.png rename to dist/v-1521124836513/emojis/1f468-200d-2696-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-2708-fe0f.png b/dist/v-1521124836513/emojis/1f468-200d-2708-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-2708-fe0f.png rename to dist/v-1521124836513/emojis/1f468-200d-2708-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-2764-fe0f-200d-1f468.png b/dist/v-1521124836513/emojis/1f468-200d-2764-fe0f-200d-1f468.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-2764-fe0f-200d-1f468.png rename to dist/v-1521124836513/emojis/1f468-200d-2764-fe0f-200d-1f468.png diff --git a/dist/v-1520418874500/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/dist/v-1521124836513/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png rename to dist/v-1521124836513/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png diff --git a/dist/v-1520418874500/emojis/1f468.png b/dist/v-1521124836513/emojis/1f468.png similarity index 100% rename from dist/v-1520418874500/emojis/1f468.png rename to dist/v-1521124836513/emojis/1f468.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f33e.png b/dist/v-1521124836513/emojis/1f469-200d-1f33e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f33e.png rename to dist/v-1521124836513/emojis/1f469-200d-1f33e.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f373.png b/dist/v-1521124836513/emojis/1f469-200d-1f373.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f373.png rename to dist/v-1521124836513/emojis/1f469-200d-1f373.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f393.png b/dist/v-1521124836513/emojis/1f469-200d-1f393.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f393.png rename to dist/v-1521124836513/emojis/1f469-200d-1f393.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f3a4.png b/dist/v-1521124836513/emojis/1f469-200d-1f3a4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f3a4.png rename to dist/v-1521124836513/emojis/1f469-200d-1f3a4.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f3a8.png b/dist/v-1521124836513/emojis/1f469-200d-1f3a8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f3a8.png rename to dist/v-1521124836513/emojis/1f469-200d-1f3a8.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f3eb.png b/dist/v-1521124836513/emojis/1f469-200d-1f3eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f3eb.png rename to dist/v-1521124836513/emojis/1f469-200d-1f3eb.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f3ed.png b/dist/v-1521124836513/emojis/1f469-200d-1f3ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f3ed.png rename to dist/v-1521124836513/emojis/1f469-200d-1f3ed.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f466-200d-1f466.png b/dist/v-1521124836513/emojis/1f469-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f466-200d-1f466.png rename to dist/v-1521124836513/emojis/1f469-200d-1f466-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f466.png b/dist/v-1521124836513/emojis/1f469-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f466.png rename to dist/v-1521124836513/emojis/1f469-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f467-200d-1f466.png b/dist/v-1521124836513/emojis/1f469-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f467-200d-1f466.png rename to dist/v-1521124836513/emojis/1f469-200d-1f467-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f467-200d-1f467.png b/dist/v-1521124836513/emojis/1f469-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f467-200d-1f467.png rename to dist/v-1521124836513/emojis/1f469-200d-1f467-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f467.png b/dist/v-1521124836513/emojis/1f469-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f467.png rename to dist/v-1521124836513/emojis/1f469-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png b/dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png rename to dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f466.png b/dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f466.png rename to dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png b/dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png rename to dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png b/dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png rename to dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f467.png b/dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f467.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f469-200d-1f467.png rename to dist/v-1521124836513/emojis/1f469-200d-1f469-200d-1f467.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f4bb.png b/dist/v-1521124836513/emojis/1f469-200d-1f4bb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f4bb.png rename to dist/v-1521124836513/emojis/1f469-200d-1f4bb.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f4bc.png b/dist/v-1521124836513/emojis/1f469-200d-1f4bc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f4bc.png rename to dist/v-1521124836513/emojis/1f469-200d-1f4bc.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f527.png b/dist/v-1521124836513/emojis/1f469-200d-1f527.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f527.png rename to dist/v-1521124836513/emojis/1f469-200d-1f527.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f52c.png b/dist/v-1521124836513/emojis/1f469-200d-1f52c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f52c.png rename to dist/v-1521124836513/emojis/1f469-200d-1f52c.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f680.png b/dist/v-1521124836513/emojis/1f469-200d-1f680.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f680.png rename to dist/v-1521124836513/emojis/1f469-200d-1f680.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-1f692.png b/dist/v-1521124836513/emojis/1f469-200d-1f692.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-1f692.png rename to dist/v-1521124836513/emojis/1f469-200d-1f692.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2695-fe0f.png b/dist/v-1521124836513/emojis/1f469-200d-2695-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2695-fe0f.png rename to dist/v-1521124836513/emojis/1f469-200d-2695-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2696-fe0f.png b/dist/v-1521124836513/emojis/1f469-200d-2696-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2696-fe0f.png rename to dist/v-1521124836513/emojis/1f469-200d-2696-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2708-fe0f.png b/dist/v-1521124836513/emojis/1f469-200d-2708-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2708-fe0f.png rename to dist/v-1521124836513/emojis/1f469-200d-2708-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f468.png b/dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f468.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f468.png rename to dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f468.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f469.png b/dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f469.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f469.png rename to dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f469.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png rename to dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png diff --git a/dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png b/dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png rename to dist/v-1521124836513/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png diff --git a/dist/v-1520418874500/emojis/1f469.png b/dist/v-1521124836513/emojis/1f469.png similarity index 100% rename from dist/v-1520418874500/emojis/1f469.png rename to dist/v-1521124836513/emojis/1f469.png diff --git a/dist/v-1520418874500/emojis/1f46a.png b/dist/v-1521124836513/emojis/1f46a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46a.png rename to dist/v-1521124836513/emojis/1f46a.png diff --git a/dist/v-1520418874500/emojis/1f46b.png b/dist/v-1521124836513/emojis/1f46b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46b.png rename to dist/v-1521124836513/emojis/1f46b.png diff --git a/dist/v-1520418874500/emojis/1f46c.png b/dist/v-1521124836513/emojis/1f46c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46c.png rename to dist/v-1521124836513/emojis/1f46c.png diff --git a/dist/v-1520418874500/emojis/1f46d.png b/dist/v-1521124836513/emojis/1f46d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46d.png rename to dist/v-1521124836513/emojis/1f46d.png diff --git a/dist/v-1520418874500/emojis/1f46e-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f46e-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46e-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f46e-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f46e-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f46e-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46e-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f46e-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f46e.png b/dist/v-1521124836513/emojis/1f46e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46e.png rename to dist/v-1521124836513/emojis/1f46e.png diff --git a/dist/v-1520418874500/emojis/1f46f-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f46f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46f-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f46f-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f46f-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f46f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46f-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f46f-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f46f.png b/dist/v-1521124836513/emojis/1f46f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f46f.png rename to dist/v-1521124836513/emojis/1f46f.png diff --git a/dist/v-1520418874500/emojis/1f470.png b/dist/v-1521124836513/emojis/1f470.png similarity index 100% rename from dist/v-1520418874500/emojis/1f470.png rename to dist/v-1521124836513/emojis/1f470.png diff --git a/dist/v-1520418874500/emojis/1f471-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f471-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f471-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f471-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f471-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f471-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f471-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f471-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f471.png b/dist/v-1521124836513/emojis/1f471.png similarity index 100% rename from dist/v-1520418874500/emojis/1f471.png rename to dist/v-1521124836513/emojis/1f471.png diff --git a/dist/v-1520418874500/emojis/1f472.png b/dist/v-1521124836513/emojis/1f472.png similarity index 100% rename from dist/v-1520418874500/emojis/1f472.png rename to dist/v-1521124836513/emojis/1f472.png diff --git a/dist/v-1520418874500/emojis/1f473-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f473-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f473-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f473-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f473-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f473-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f473-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f473-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f473.png b/dist/v-1521124836513/emojis/1f473.png similarity index 100% rename from dist/v-1520418874500/emojis/1f473.png rename to dist/v-1521124836513/emojis/1f473.png diff --git a/dist/v-1520418874500/emojis/1f474.png b/dist/v-1521124836513/emojis/1f474.png similarity index 100% rename from dist/v-1520418874500/emojis/1f474.png rename to dist/v-1521124836513/emojis/1f474.png diff --git a/dist/v-1520418874500/emojis/1f475.png b/dist/v-1521124836513/emojis/1f475.png similarity index 100% rename from dist/v-1520418874500/emojis/1f475.png rename to dist/v-1521124836513/emojis/1f475.png diff --git a/dist/v-1520418874500/emojis/1f476.png b/dist/v-1521124836513/emojis/1f476.png similarity index 100% rename from dist/v-1520418874500/emojis/1f476.png rename to dist/v-1521124836513/emojis/1f476.png diff --git a/dist/v-1520418874500/emojis/1f477-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f477-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f477-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f477-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f477-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f477-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f477-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f477-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f477.png b/dist/v-1521124836513/emojis/1f477.png similarity index 100% rename from dist/v-1520418874500/emojis/1f477.png rename to dist/v-1521124836513/emojis/1f477.png diff --git a/dist/v-1520418874500/emojis/1f478.png b/dist/v-1521124836513/emojis/1f478.png similarity index 100% rename from dist/v-1520418874500/emojis/1f478.png rename to dist/v-1521124836513/emojis/1f478.png diff --git a/dist/v-1520418874500/emojis/1f479.png b/dist/v-1521124836513/emojis/1f479.png similarity index 100% rename from dist/v-1520418874500/emojis/1f479.png rename to dist/v-1521124836513/emojis/1f479.png diff --git a/dist/v-1520418874500/emojis/1f47a.png b/dist/v-1521124836513/emojis/1f47a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f47a.png rename to dist/v-1521124836513/emojis/1f47a.png diff --git a/dist/v-1520418874500/emojis/1f47b.png b/dist/v-1521124836513/emojis/1f47b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f47b.png rename to dist/v-1521124836513/emojis/1f47b.png diff --git a/dist/v-1520418874500/emojis/1f47c.png b/dist/v-1521124836513/emojis/1f47c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f47c.png rename to dist/v-1521124836513/emojis/1f47c.png diff --git a/dist/v-1520418874500/emojis/1f47d.png b/dist/v-1521124836513/emojis/1f47d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f47d.png rename to dist/v-1521124836513/emojis/1f47d.png diff --git a/dist/v-1520418874500/emojis/1f47e.png b/dist/v-1521124836513/emojis/1f47e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f47e.png rename to dist/v-1521124836513/emojis/1f47e.png diff --git a/dist/v-1520418874500/emojis/1f47f.png b/dist/v-1521124836513/emojis/1f47f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f47f.png rename to dist/v-1521124836513/emojis/1f47f.png diff --git a/dist/v-1520418874500/emojis/1f480.png b/dist/v-1521124836513/emojis/1f480.png similarity index 100% rename from dist/v-1520418874500/emojis/1f480.png rename to dist/v-1521124836513/emojis/1f480.png diff --git a/dist/v-1520418874500/emojis/1f481-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f481-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f481-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f481-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f481-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f481-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f481-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f481-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f481.png b/dist/v-1521124836513/emojis/1f481.png similarity index 100% rename from dist/v-1520418874500/emojis/1f481.png rename to dist/v-1521124836513/emojis/1f481.png diff --git a/dist/v-1520418874500/emojis/1f482-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f482-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f482-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f482-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f482-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f482-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f482-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f482-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f482.png b/dist/v-1521124836513/emojis/1f482.png similarity index 100% rename from dist/v-1520418874500/emojis/1f482.png rename to dist/v-1521124836513/emojis/1f482.png diff --git a/dist/v-1520418874500/emojis/1f483.png b/dist/v-1521124836513/emojis/1f483.png similarity index 100% rename from dist/v-1520418874500/emojis/1f483.png rename to dist/v-1521124836513/emojis/1f483.png diff --git a/dist/v-1520418874500/emojis/1f484.png b/dist/v-1521124836513/emojis/1f484.png similarity index 100% rename from dist/v-1520418874500/emojis/1f484.png rename to dist/v-1521124836513/emojis/1f484.png diff --git a/dist/v-1520418874500/emojis/1f485.png b/dist/v-1521124836513/emojis/1f485.png similarity index 100% rename from dist/v-1520418874500/emojis/1f485.png rename to dist/v-1521124836513/emojis/1f485.png diff --git a/dist/v-1520418874500/emojis/1f486-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f486-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f486-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f486-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f486-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f486-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f486-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f486-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f486.png b/dist/v-1521124836513/emojis/1f486.png similarity index 100% rename from dist/v-1520418874500/emojis/1f486.png rename to dist/v-1521124836513/emojis/1f486.png diff --git a/dist/v-1520418874500/emojis/1f487-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f487-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f487-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f487-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f487-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f487-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f487-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f487-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f487.png b/dist/v-1521124836513/emojis/1f487.png similarity index 100% rename from dist/v-1520418874500/emojis/1f487.png rename to dist/v-1521124836513/emojis/1f487.png diff --git a/dist/v-1520418874500/emojis/1f488.png b/dist/v-1521124836513/emojis/1f488.png similarity index 100% rename from dist/v-1520418874500/emojis/1f488.png rename to dist/v-1521124836513/emojis/1f488.png diff --git a/dist/v-1520418874500/emojis/1f489.png b/dist/v-1521124836513/emojis/1f489.png similarity index 100% rename from dist/v-1520418874500/emojis/1f489.png rename to dist/v-1521124836513/emojis/1f489.png diff --git a/dist/v-1520418874500/emojis/1f48a.png b/dist/v-1521124836513/emojis/1f48a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f48a.png rename to dist/v-1521124836513/emojis/1f48a.png diff --git a/dist/v-1520418874500/emojis/1f48b.png b/dist/v-1521124836513/emojis/1f48b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f48b.png rename to dist/v-1521124836513/emojis/1f48b.png diff --git a/dist/v-1520418874500/emojis/1f48c.png b/dist/v-1521124836513/emojis/1f48c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f48c.png rename to dist/v-1521124836513/emojis/1f48c.png diff --git a/dist/v-1520418874500/emojis/1f48d.png b/dist/v-1521124836513/emojis/1f48d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f48d.png rename to dist/v-1521124836513/emojis/1f48d.png diff --git a/dist/v-1520418874500/emojis/1f48e.png b/dist/v-1521124836513/emojis/1f48e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f48e.png rename to dist/v-1521124836513/emojis/1f48e.png diff --git a/dist/v-1520418874500/emojis/1f48f.png b/dist/v-1521124836513/emojis/1f48f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f48f.png rename to dist/v-1521124836513/emojis/1f48f.png diff --git a/dist/v-1520418874500/emojis/1f490.png b/dist/v-1521124836513/emojis/1f490.png similarity index 100% rename from dist/v-1520418874500/emojis/1f490.png rename to dist/v-1521124836513/emojis/1f490.png diff --git a/dist/v-1520418874500/emojis/1f491.png b/dist/v-1521124836513/emojis/1f491.png similarity index 100% rename from dist/v-1520418874500/emojis/1f491.png rename to dist/v-1521124836513/emojis/1f491.png diff --git a/dist/v-1520418874500/emojis/1f492.png b/dist/v-1521124836513/emojis/1f492.png similarity index 100% rename from dist/v-1520418874500/emojis/1f492.png rename to dist/v-1521124836513/emojis/1f492.png diff --git a/dist/v-1520418874500/emojis/1f493.png b/dist/v-1521124836513/emojis/1f493.png similarity index 100% rename from dist/v-1520418874500/emojis/1f493.png rename to dist/v-1521124836513/emojis/1f493.png diff --git a/dist/v-1520418874500/emojis/1f494.png b/dist/v-1521124836513/emojis/1f494.png similarity index 100% rename from dist/v-1520418874500/emojis/1f494.png rename to dist/v-1521124836513/emojis/1f494.png diff --git a/dist/v-1520418874500/emojis/1f495.png b/dist/v-1521124836513/emojis/1f495.png similarity index 100% rename from dist/v-1520418874500/emojis/1f495.png rename to dist/v-1521124836513/emojis/1f495.png diff --git a/dist/v-1520418874500/emojis/1f496.png b/dist/v-1521124836513/emojis/1f496.png similarity index 100% rename from dist/v-1520418874500/emojis/1f496.png rename to dist/v-1521124836513/emojis/1f496.png diff --git a/dist/v-1520418874500/emojis/1f497.png b/dist/v-1521124836513/emojis/1f497.png similarity index 100% rename from dist/v-1520418874500/emojis/1f497.png rename to dist/v-1521124836513/emojis/1f497.png diff --git a/dist/v-1520418874500/emojis/1f498.png b/dist/v-1521124836513/emojis/1f498.png similarity index 100% rename from dist/v-1520418874500/emojis/1f498.png rename to dist/v-1521124836513/emojis/1f498.png diff --git a/dist/v-1520418874500/emojis/1f499.png b/dist/v-1521124836513/emojis/1f499.png similarity index 100% rename from dist/v-1520418874500/emojis/1f499.png rename to dist/v-1521124836513/emojis/1f499.png diff --git a/dist/v-1520418874500/emojis/1f49a.png b/dist/v-1521124836513/emojis/1f49a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f49a.png rename to dist/v-1521124836513/emojis/1f49a.png diff --git a/dist/v-1520418874500/emojis/1f49b.png b/dist/v-1521124836513/emojis/1f49b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f49b.png rename to dist/v-1521124836513/emojis/1f49b.png diff --git a/dist/v-1520418874500/emojis/1f49c.png b/dist/v-1521124836513/emojis/1f49c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f49c.png rename to dist/v-1521124836513/emojis/1f49c.png diff --git a/dist/v-1520418874500/emojis/1f49d.png b/dist/v-1521124836513/emojis/1f49d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f49d.png rename to dist/v-1521124836513/emojis/1f49d.png diff --git a/dist/v-1520418874500/emojis/1f49e.png b/dist/v-1521124836513/emojis/1f49e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f49e.png rename to dist/v-1521124836513/emojis/1f49e.png diff --git a/dist/v-1520418874500/emojis/1f49f.png b/dist/v-1521124836513/emojis/1f49f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f49f.png rename to dist/v-1521124836513/emojis/1f49f.png diff --git a/dist/v-1520418874500/emojis/1f4a0.png b/dist/v-1521124836513/emojis/1f4a0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a0.png rename to dist/v-1521124836513/emojis/1f4a0.png diff --git a/dist/v-1520418874500/emojis/1f4a1.png b/dist/v-1521124836513/emojis/1f4a1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a1.png rename to dist/v-1521124836513/emojis/1f4a1.png diff --git a/dist/v-1520418874500/emojis/1f4a2.png b/dist/v-1521124836513/emojis/1f4a2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a2.png rename to dist/v-1521124836513/emojis/1f4a2.png diff --git a/dist/v-1520418874500/emojis/1f4a3.png b/dist/v-1521124836513/emojis/1f4a3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a3.png rename to dist/v-1521124836513/emojis/1f4a3.png diff --git a/dist/v-1520418874500/emojis/1f4a4.png b/dist/v-1521124836513/emojis/1f4a4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a4.png rename to dist/v-1521124836513/emojis/1f4a4.png diff --git a/dist/v-1520418874500/emojis/1f4a5.png b/dist/v-1521124836513/emojis/1f4a5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a5.png rename to dist/v-1521124836513/emojis/1f4a5.png diff --git a/dist/v-1520418874500/emojis/1f4a6.png b/dist/v-1521124836513/emojis/1f4a6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a6.png rename to dist/v-1521124836513/emojis/1f4a6.png diff --git a/dist/v-1520418874500/emojis/1f4a7.png b/dist/v-1521124836513/emojis/1f4a7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a7.png rename to dist/v-1521124836513/emojis/1f4a7.png diff --git a/dist/v-1520418874500/emojis/1f4a8.png b/dist/v-1521124836513/emojis/1f4a8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a8.png rename to dist/v-1521124836513/emojis/1f4a8.png diff --git a/dist/v-1520418874500/emojis/1f4a9.png b/dist/v-1521124836513/emojis/1f4a9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4a9.png rename to dist/v-1521124836513/emojis/1f4a9.png diff --git a/dist/v-1520418874500/emojis/1f4aa.png b/dist/v-1521124836513/emojis/1f4aa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4aa.png rename to dist/v-1521124836513/emojis/1f4aa.png diff --git a/dist/v-1520418874500/emojis/1f4ab.png b/dist/v-1521124836513/emojis/1f4ab.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ab.png rename to dist/v-1521124836513/emojis/1f4ab.png diff --git a/dist/v-1520418874500/emojis/1f4ac.png b/dist/v-1521124836513/emojis/1f4ac.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ac.png rename to dist/v-1521124836513/emojis/1f4ac.png diff --git a/dist/v-1520418874500/emojis/1f4ad.png b/dist/v-1521124836513/emojis/1f4ad.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ad.png rename to dist/v-1521124836513/emojis/1f4ad.png diff --git a/dist/v-1520418874500/emojis/1f4ae.png b/dist/v-1521124836513/emojis/1f4ae.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ae.png rename to dist/v-1521124836513/emojis/1f4ae.png diff --git a/dist/v-1520418874500/emojis/1f4af.png b/dist/v-1521124836513/emojis/1f4af.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4af.png rename to dist/v-1521124836513/emojis/1f4af.png diff --git a/dist/v-1520418874500/emojis/1f4b0.png b/dist/v-1521124836513/emojis/1f4b0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b0.png rename to dist/v-1521124836513/emojis/1f4b0.png diff --git a/dist/v-1520418874500/emojis/1f4b1.png b/dist/v-1521124836513/emojis/1f4b1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b1.png rename to dist/v-1521124836513/emojis/1f4b1.png diff --git a/dist/v-1520418874500/emojis/1f4b2.png b/dist/v-1521124836513/emojis/1f4b2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b2.png rename to dist/v-1521124836513/emojis/1f4b2.png diff --git a/dist/v-1520418874500/emojis/1f4b3.png b/dist/v-1521124836513/emojis/1f4b3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b3.png rename to dist/v-1521124836513/emojis/1f4b3.png diff --git a/dist/v-1520418874500/emojis/1f4b4.png b/dist/v-1521124836513/emojis/1f4b4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b4.png rename to dist/v-1521124836513/emojis/1f4b4.png diff --git a/dist/v-1520418874500/emojis/1f4b5.png b/dist/v-1521124836513/emojis/1f4b5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b5.png rename to dist/v-1521124836513/emojis/1f4b5.png diff --git a/dist/v-1520418874500/emojis/1f4b6.png b/dist/v-1521124836513/emojis/1f4b6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b6.png rename to dist/v-1521124836513/emojis/1f4b6.png diff --git a/dist/v-1520418874500/emojis/1f4b7.png b/dist/v-1521124836513/emojis/1f4b7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b7.png rename to dist/v-1521124836513/emojis/1f4b7.png diff --git a/dist/v-1520418874500/emojis/1f4b8.png b/dist/v-1521124836513/emojis/1f4b8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b8.png rename to dist/v-1521124836513/emojis/1f4b8.png diff --git a/dist/v-1520418874500/emojis/1f4b9.png b/dist/v-1521124836513/emojis/1f4b9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4b9.png rename to dist/v-1521124836513/emojis/1f4b9.png diff --git a/dist/v-1520418874500/emojis/1f4ba.png b/dist/v-1521124836513/emojis/1f4ba.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ba.png rename to dist/v-1521124836513/emojis/1f4ba.png diff --git a/dist/v-1520418874500/emojis/1f4bb.png b/dist/v-1521124836513/emojis/1f4bb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4bb.png rename to dist/v-1521124836513/emojis/1f4bb.png diff --git a/dist/v-1520418874500/emojis/1f4bc.png b/dist/v-1521124836513/emojis/1f4bc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4bc.png rename to dist/v-1521124836513/emojis/1f4bc.png diff --git a/dist/v-1520418874500/emojis/1f4bd.png b/dist/v-1521124836513/emojis/1f4bd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4bd.png rename to dist/v-1521124836513/emojis/1f4bd.png diff --git a/dist/v-1520418874500/emojis/1f4be.png b/dist/v-1521124836513/emojis/1f4be.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4be.png rename to dist/v-1521124836513/emojis/1f4be.png diff --git a/dist/v-1520418874500/emojis/1f4bf.png b/dist/v-1521124836513/emojis/1f4bf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4bf.png rename to dist/v-1521124836513/emojis/1f4bf.png diff --git a/dist/v-1520418874500/emojis/1f4c0.png b/dist/v-1521124836513/emojis/1f4c0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c0.png rename to dist/v-1521124836513/emojis/1f4c0.png diff --git a/dist/v-1520418874500/emojis/1f4c1.png b/dist/v-1521124836513/emojis/1f4c1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c1.png rename to dist/v-1521124836513/emojis/1f4c1.png diff --git a/dist/v-1520418874500/emojis/1f4c2.png b/dist/v-1521124836513/emojis/1f4c2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c2.png rename to dist/v-1521124836513/emojis/1f4c2.png diff --git a/dist/v-1520418874500/emojis/1f4c3.png b/dist/v-1521124836513/emojis/1f4c3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c3.png rename to dist/v-1521124836513/emojis/1f4c3.png diff --git a/dist/v-1520418874500/emojis/1f4c4.png b/dist/v-1521124836513/emojis/1f4c4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c4.png rename to dist/v-1521124836513/emojis/1f4c4.png diff --git a/dist/v-1520418874500/emojis/1f4c5.png b/dist/v-1521124836513/emojis/1f4c5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c5.png rename to dist/v-1521124836513/emojis/1f4c5.png diff --git a/dist/v-1520418874500/emojis/1f4c6.png b/dist/v-1521124836513/emojis/1f4c6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c6.png rename to dist/v-1521124836513/emojis/1f4c6.png diff --git a/dist/v-1520418874500/emojis/1f4c7.png b/dist/v-1521124836513/emojis/1f4c7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c7.png rename to dist/v-1521124836513/emojis/1f4c7.png diff --git a/dist/v-1520418874500/emojis/1f4c8.png b/dist/v-1521124836513/emojis/1f4c8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c8.png rename to dist/v-1521124836513/emojis/1f4c8.png diff --git a/dist/v-1520418874500/emojis/1f4c9.png b/dist/v-1521124836513/emojis/1f4c9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4c9.png rename to dist/v-1521124836513/emojis/1f4c9.png diff --git a/dist/v-1520418874500/emojis/1f4ca.png b/dist/v-1521124836513/emojis/1f4ca.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ca.png rename to dist/v-1521124836513/emojis/1f4ca.png diff --git a/dist/v-1520418874500/emojis/1f4cb.png b/dist/v-1521124836513/emojis/1f4cb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4cb.png rename to dist/v-1521124836513/emojis/1f4cb.png diff --git a/dist/v-1520418874500/emojis/1f4cc.png b/dist/v-1521124836513/emojis/1f4cc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4cc.png rename to dist/v-1521124836513/emojis/1f4cc.png diff --git a/dist/v-1520418874500/emojis/1f4cd.png b/dist/v-1521124836513/emojis/1f4cd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4cd.png rename to dist/v-1521124836513/emojis/1f4cd.png diff --git a/dist/v-1520418874500/emojis/1f4ce.png b/dist/v-1521124836513/emojis/1f4ce.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ce.png rename to dist/v-1521124836513/emojis/1f4ce.png diff --git a/dist/v-1520418874500/emojis/1f4cf.png b/dist/v-1521124836513/emojis/1f4cf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4cf.png rename to dist/v-1521124836513/emojis/1f4cf.png diff --git a/dist/v-1520418874500/emojis/1f4d0.png b/dist/v-1521124836513/emojis/1f4d0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d0.png rename to dist/v-1521124836513/emojis/1f4d0.png diff --git a/dist/v-1520418874500/emojis/1f4d1.png b/dist/v-1521124836513/emojis/1f4d1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d1.png rename to dist/v-1521124836513/emojis/1f4d1.png diff --git a/dist/v-1520418874500/emojis/1f4d2.png b/dist/v-1521124836513/emojis/1f4d2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d2.png rename to dist/v-1521124836513/emojis/1f4d2.png diff --git a/dist/v-1520418874500/emojis/1f4d3.png b/dist/v-1521124836513/emojis/1f4d3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d3.png rename to dist/v-1521124836513/emojis/1f4d3.png diff --git a/dist/v-1520418874500/emojis/1f4d4.png b/dist/v-1521124836513/emojis/1f4d4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d4.png rename to dist/v-1521124836513/emojis/1f4d4.png diff --git a/dist/v-1520418874500/emojis/1f4d5.png b/dist/v-1521124836513/emojis/1f4d5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d5.png rename to dist/v-1521124836513/emojis/1f4d5.png diff --git a/dist/v-1520418874500/emojis/1f4d6.png b/dist/v-1521124836513/emojis/1f4d6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d6.png rename to dist/v-1521124836513/emojis/1f4d6.png diff --git a/dist/v-1520418874500/emojis/1f4d7.png b/dist/v-1521124836513/emojis/1f4d7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d7.png rename to dist/v-1521124836513/emojis/1f4d7.png diff --git a/dist/v-1520418874500/emojis/1f4d8.png b/dist/v-1521124836513/emojis/1f4d8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d8.png rename to dist/v-1521124836513/emojis/1f4d8.png diff --git a/dist/v-1520418874500/emojis/1f4d9.png b/dist/v-1521124836513/emojis/1f4d9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4d9.png rename to dist/v-1521124836513/emojis/1f4d9.png diff --git a/dist/v-1520418874500/emojis/1f4da.png b/dist/v-1521124836513/emojis/1f4da.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4da.png rename to dist/v-1521124836513/emojis/1f4da.png diff --git a/dist/v-1520418874500/emojis/1f4db.png b/dist/v-1521124836513/emojis/1f4db.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4db.png rename to dist/v-1521124836513/emojis/1f4db.png diff --git a/dist/v-1520418874500/emojis/1f4dc.png b/dist/v-1521124836513/emojis/1f4dc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4dc.png rename to dist/v-1521124836513/emojis/1f4dc.png diff --git a/dist/v-1520418874500/emojis/1f4dd.png b/dist/v-1521124836513/emojis/1f4dd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4dd.png rename to dist/v-1521124836513/emojis/1f4dd.png diff --git a/dist/v-1520418874500/emojis/1f4de.png b/dist/v-1521124836513/emojis/1f4de.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4de.png rename to dist/v-1521124836513/emojis/1f4de.png diff --git a/dist/v-1520418874500/emojis/1f4df.png b/dist/v-1521124836513/emojis/1f4df.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4df.png rename to dist/v-1521124836513/emojis/1f4df.png diff --git a/dist/v-1520418874500/emojis/1f4e0.png b/dist/v-1521124836513/emojis/1f4e0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e0.png rename to dist/v-1521124836513/emojis/1f4e0.png diff --git a/dist/v-1520418874500/emojis/1f4e1.png b/dist/v-1521124836513/emojis/1f4e1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e1.png rename to dist/v-1521124836513/emojis/1f4e1.png diff --git a/dist/v-1520418874500/emojis/1f4e2.png b/dist/v-1521124836513/emojis/1f4e2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e2.png rename to dist/v-1521124836513/emojis/1f4e2.png diff --git a/dist/v-1520418874500/emojis/1f4e3.png b/dist/v-1521124836513/emojis/1f4e3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e3.png rename to dist/v-1521124836513/emojis/1f4e3.png diff --git a/dist/v-1520418874500/emojis/1f4e4.png b/dist/v-1521124836513/emojis/1f4e4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e4.png rename to dist/v-1521124836513/emojis/1f4e4.png diff --git a/dist/v-1520418874500/emojis/1f4e5.png b/dist/v-1521124836513/emojis/1f4e5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e5.png rename to dist/v-1521124836513/emojis/1f4e5.png diff --git a/dist/v-1520418874500/emojis/1f4e6.png b/dist/v-1521124836513/emojis/1f4e6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e6.png rename to dist/v-1521124836513/emojis/1f4e6.png diff --git a/dist/v-1520418874500/emojis/1f4e7.png b/dist/v-1521124836513/emojis/1f4e7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e7.png rename to dist/v-1521124836513/emojis/1f4e7.png diff --git a/dist/v-1520418874500/emojis/1f4e8.png b/dist/v-1521124836513/emojis/1f4e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e8.png rename to dist/v-1521124836513/emojis/1f4e8.png diff --git a/dist/v-1520418874500/emojis/1f4e9.png b/dist/v-1521124836513/emojis/1f4e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4e9.png rename to dist/v-1521124836513/emojis/1f4e9.png diff --git a/dist/v-1520418874500/emojis/1f4ea.png b/dist/v-1521124836513/emojis/1f4ea.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ea.png rename to dist/v-1521124836513/emojis/1f4ea.png diff --git a/dist/v-1520418874500/emojis/1f4eb.png b/dist/v-1521124836513/emojis/1f4eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4eb.png rename to dist/v-1521124836513/emojis/1f4eb.png diff --git a/dist/v-1520418874500/emojis/1f4ec.png b/dist/v-1521124836513/emojis/1f4ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ec.png rename to dist/v-1521124836513/emojis/1f4ec.png diff --git a/dist/v-1520418874500/emojis/1f4ed.png b/dist/v-1521124836513/emojis/1f4ed.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ed.png rename to dist/v-1521124836513/emojis/1f4ed.png diff --git a/dist/v-1520418874500/emojis/1f4ee.png b/dist/v-1521124836513/emojis/1f4ee.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ee.png rename to dist/v-1521124836513/emojis/1f4ee.png diff --git a/dist/v-1520418874500/emojis/1f4ef.png b/dist/v-1521124836513/emojis/1f4ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ef.png rename to dist/v-1521124836513/emojis/1f4ef.png diff --git a/dist/v-1520418874500/emojis/1f4f0.png b/dist/v-1521124836513/emojis/1f4f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f0.png rename to dist/v-1521124836513/emojis/1f4f0.png diff --git a/dist/v-1520418874500/emojis/1f4f1.png b/dist/v-1521124836513/emojis/1f4f1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f1.png rename to dist/v-1521124836513/emojis/1f4f1.png diff --git a/dist/v-1520418874500/emojis/1f4f2.png b/dist/v-1521124836513/emojis/1f4f2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f2.png rename to dist/v-1521124836513/emojis/1f4f2.png diff --git a/dist/v-1520418874500/emojis/1f4f3.png b/dist/v-1521124836513/emojis/1f4f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f3.png rename to dist/v-1521124836513/emojis/1f4f3.png diff --git a/dist/v-1520418874500/emojis/1f4f4.png b/dist/v-1521124836513/emojis/1f4f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f4.png rename to dist/v-1521124836513/emojis/1f4f4.png diff --git a/dist/v-1520418874500/emojis/1f4f5.png b/dist/v-1521124836513/emojis/1f4f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f5.png rename to dist/v-1521124836513/emojis/1f4f5.png diff --git a/dist/v-1520418874500/emojis/1f4f6.png b/dist/v-1521124836513/emojis/1f4f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f6.png rename to dist/v-1521124836513/emojis/1f4f6.png diff --git a/dist/v-1520418874500/emojis/1f4f7.png b/dist/v-1521124836513/emojis/1f4f7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f7.png rename to dist/v-1521124836513/emojis/1f4f7.png diff --git a/dist/v-1520418874500/emojis/1f4f8.png b/dist/v-1521124836513/emojis/1f4f8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f8.png rename to dist/v-1521124836513/emojis/1f4f8.png diff --git a/dist/v-1520418874500/emojis/1f4f9.png b/dist/v-1521124836513/emojis/1f4f9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4f9.png rename to dist/v-1521124836513/emojis/1f4f9.png diff --git a/dist/v-1520418874500/emojis/1f4fa.png b/dist/v-1521124836513/emojis/1f4fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4fa.png rename to dist/v-1521124836513/emojis/1f4fa.png diff --git a/dist/v-1520418874500/emojis/1f4fb.png b/dist/v-1521124836513/emojis/1f4fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4fb.png rename to dist/v-1521124836513/emojis/1f4fb.png diff --git a/dist/v-1520418874500/emojis/1f4fc.png b/dist/v-1521124836513/emojis/1f4fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4fc.png rename to dist/v-1521124836513/emojis/1f4fc.png diff --git a/dist/v-1520418874500/emojis/1f4fd.png b/dist/v-1521124836513/emojis/1f4fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4fd.png rename to dist/v-1521124836513/emojis/1f4fd.png diff --git a/dist/v-1520418874500/emojis/1f4ff.png b/dist/v-1521124836513/emojis/1f4ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f4ff.png rename to dist/v-1521124836513/emojis/1f4ff.png diff --git a/dist/v-1520418874500/emojis/1f500.png b/dist/v-1521124836513/emojis/1f500.png similarity index 100% rename from dist/v-1520418874500/emojis/1f500.png rename to dist/v-1521124836513/emojis/1f500.png diff --git a/dist/v-1520418874500/emojis/1f501.png b/dist/v-1521124836513/emojis/1f501.png similarity index 100% rename from dist/v-1520418874500/emojis/1f501.png rename to dist/v-1521124836513/emojis/1f501.png diff --git a/dist/v-1520418874500/emojis/1f502.png b/dist/v-1521124836513/emojis/1f502.png similarity index 100% rename from dist/v-1520418874500/emojis/1f502.png rename to dist/v-1521124836513/emojis/1f502.png diff --git a/dist/v-1520418874500/emojis/1f503.png b/dist/v-1521124836513/emojis/1f503.png similarity index 100% rename from dist/v-1520418874500/emojis/1f503.png rename to dist/v-1521124836513/emojis/1f503.png diff --git a/dist/v-1520418874500/emojis/1f504.png b/dist/v-1521124836513/emojis/1f504.png similarity index 100% rename from dist/v-1520418874500/emojis/1f504.png rename to dist/v-1521124836513/emojis/1f504.png diff --git a/dist/v-1520418874500/emojis/1f505.png b/dist/v-1521124836513/emojis/1f505.png similarity index 100% rename from dist/v-1520418874500/emojis/1f505.png rename to dist/v-1521124836513/emojis/1f505.png diff --git a/dist/v-1520418874500/emojis/1f506.png b/dist/v-1521124836513/emojis/1f506.png similarity index 100% rename from dist/v-1520418874500/emojis/1f506.png rename to dist/v-1521124836513/emojis/1f506.png diff --git a/dist/v-1520418874500/emojis/1f507.png b/dist/v-1521124836513/emojis/1f507.png similarity index 100% rename from dist/v-1520418874500/emojis/1f507.png rename to dist/v-1521124836513/emojis/1f507.png diff --git a/dist/v-1520418874500/emojis/1f508.png b/dist/v-1521124836513/emojis/1f508.png similarity index 100% rename from dist/v-1520418874500/emojis/1f508.png rename to dist/v-1521124836513/emojis/1f508.png diff --git a/dist/v-1520418874500/emojis/1f509.png b/dist/v-1521124836513/emojis/1f509.png similarity index 100% rename from dist/v-1520418874500/emojis/1f509.png rename to dist/v-1521124836513/emojis/1f509.png diff --git a/dist/v-1520418874500/emojis/1f50a.png b/dist/v-1521124836513/emojis/1f50a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f50a.png rename to dist/v-1521124836513/emojis/1f50a.png diff --git a/dist/v-1520418874500/emojis/1f50b.png b/dist/v-1521124836513/emojis/1f50b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f50b.png rename to dist/v-1521124836513/emojis/1f50b.png diff --git a/dist/v-1520418874500/emojis/1f50c.png b/dist/v-1521124836513/emojis/1f50c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f50c.png rename to dist/v-1521124836513/emojis/1f50c.png diff --git a/dist/v-1520418874500/emojis/1f50d.png b/dist/v-1521124836513/emojis/1f50d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f50d.png rename to dist/v-1521124836513/emojis/1f50d.png diff --git a/dist/v-1520418874500/emojis/1f50e.png b/dist/v-1521124836513/emojis/1f50e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f50e.png rename to dist/v-1521124836513/emojis/1f50e.png diff --git a/dist/v-1520418874500/emojis/1f50f.png b/dist/v-1521124836513/emojis/1f50f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f50f.png rename to dist/v-1521124836513/emojis/1f50f.png diff --git a/dist/v-1520418874500/emojis/1f510.png b/dist/v-1521124836513/emojis/1f510.png similarity index 100% rename from dist/v-1520418874500/emojis/1f510.png rename to dist/v-1521124836513/emojis/1f510.png diff --git a/dist/v-1520418874500/emojis/1f511.png b/dist/v-1521124836513/emojis/1f511.png similarity index 100% rename from dist/v-1520418874500/emojis/1f511.png rename to dist/v-1521124836513/emojis/1f511.png diff --git a/dist/v-1520418874500/emojis/1f512.png b/dist/v-1521124836513/emojis/1f512.png similarity index 100% rename from dist/v-1520418874500/emojis/1f512.png rename to dist/v-1521124836513/emojis/1f512.png diff --git a/dist/v-1520418874500/emojis/1f513.png b/dist/v-1521124836513/emojis/1f513.png similarity index 100% rename from dist/v-1520418874500/emojis/1f513.png rename to dist/v-1521124836513/emojis/1f513.png diff --git a/dist/v-1520418874500/emojis/1f514.png b/dist/v-1521124836513/emojis/1f514.png similarity index 100% rename from dist/v-1520418874500/emojis/1f514.png rename to dist/v-1521124836513/emojis/1f514.png diff --git a/dist/v-1520418874500/emojis/1f515.png b/dist/v-1521124836513/emojis/1f515.png similarity index 100% rename from dist/v-1520418874500/emojis/1f515.png rename to dist/v-1521124836513/emojis/1f515.png diff --git a/dist/v-1520418874500/emojis/1f516.png b/dist/v-1521124836513/emojis/1f516.png similarity index 100% rename from dist/v-1520418874500/emojis/1f516.png rename to dist/v-1521124836513/emojis/1f516.png diff --git a/dist/v-1520418874500/emojis/1f517.png b/dist/v-1521124836513/emojis/1f517.png similarity index 100% rename from dist/v-1520418874500/emojis/1f517.png rename to dist/v-1521124836513/emojis/1f517.png diff --git a/dist/v-1520418874500/emojis/1f518.png b/dist/v-1521124836513/emojis/1f518.png similarity index 100% rename from dist/v-1520418874500/emojis/1f518.png rename to dist/v-1521124836513/emojis/1f518.png diff --git a/dist/v-1520418874500/emojis/1f519.png b/dist/v-1521124836513/emojis/1f519.png similarity index 100% rename from dist/v-1520418874500/emojis/1f519.png rename to dist/v-1521124836513/emojis/1f519.png diff --git a/dist/v-1520418874500/emojis/1f51a.png b/dist/v-1521124836513/emojis/1f51a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f51a.png rename to dist/v-1521124836513/emojis/1f51a.png diff --git a/dist/v-1520418874500/emojis/1f51b.png b/dist/v-1521124836513/emojis/1f51b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f51b.png rename to dist/v-1521124836513/emojis/1f51b.png diff --git a/dist/v-1520418874500/emojis/1f51c.png b/dist/v-1521124836513/emojis/1f51c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f51c.png rename to dist/v-1521124836513/emojis/1f51c.png diff --git a/dist/v-1520418874500/emojis/1f51d.png b/dist/v-1521124836513/emojis/1f51d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f51d.png rename to dist/v-1521124836513/emojis/1f51d.png diff --git a/dist/v-1520418874500/emojis/1f51e.png b/dist/v-1521124836513/emojis/1f51e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f51e.png rename to dist/v-1521124836513/emojis/1f51e.png diff --git a/dist/v-1520418874500/emojis/1f51f.png b/dist/v-1521124836513/emojis/1f51f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f51f.png rename to dist/v-1521124836513/emojis/1f51f.png diff --git a/dist/v-1520418874500/emojis/1f520.png b/dist/v-1521124836513/emojis/1f520.png similarity index 100% rename from dist/v-1520418874500/emojis/1f520.png rename to dist/v-1521124836513/emojis/1f520.png diff --git a/dist/v-1520418874500/emojis/1f521.png b/dist/v-1521124836513/emojis/1f521.png similarity index 100% rename from dist/v-1520418874500/emojis/1f521.png rename to dist/v-1521124836513/emojis/1f521.png diff --git a/dist/v-1520418874500/emojis/1f522.png b/dist/v-1521124836513/emojis/1f522.png similarity index 100% rename from dist/v-1520418874500/emojis/1f522.png rename to dist/v-1521124836513/emojis/1f522.png diff --git a/dist/v-1520418874500/emojis/1f523.png b/dist/v-1521124836513/emojis/1f523.png similarity index 100% rename from dist/v-1520418874500/emojis/1f523.png rename to dist/v-1521124836513/emojis/1f523.png diff --git a/dist/v-1520418874500/emojis/1f524.png b/dist/v-1521124836513/emojis/1f524.png similarity index 100% rename from dist/v-1520418874500/emojis/1f524.png rename to dist/v-1521124836513/emojis/1f524.png diff --git a/dist/v-1520418874500/emojis/1f525.png b/dist/v-1521124836513/emojis/1f525.png similarity index 100% rename from dist/v-1520418874500/emojis/1f525.png rename to dist/v-1521124836513/emojis/1f525.png diff --git a/dist/v-1520418874500/emojis/1f526.png b/dist/v-1521124836513/emojis/1f526.png similarity index 100% rename from dist/v-1520418874500/emojis/1f526.png rename to dist/v-1521124836513/emojis/1f526.png diff --git a/dist/v-1520418874500/emojis/1f527.png b/dist/v-1521124836513/emojis/1f527.png similarity index 100% rename from dist/v-1520418874500/emojis/1f527.png rename to dist/v-1521124836513/emojis/1f527.png diff --git a/dist/v-1520418874500/emojis/1f528.png b/dist/v-1521124836513/emojis/1f528.png similarity index 100% rename from dist/v-1520418874500/emojis/1f528.png rename to dist/v-1521124836513/emojis/1f528.png diff --git a/dist/v-1520418874500/emojis/1f529.png b/dist/v-1521124836513/emojis/1f529.png similarity index 100% rename from dist/v-1520418874500/emojis/1f529.png rename to dist/v-1521124836513/emojis/1f529.png diff --git a/dist/v-1520418874500/emojis/1f52a.png b/dist/v-1521124836513/emojis/1f52a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f52a.png rename to dist/v-1521124836513/emojis/1f52a.png diff --git a/dist/v-1520418874500/emojis/1f52b.png b/dist/v-1521124836513/emojis/1f52b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f52b.png rename to dist/v-1521124836513/emojis/1f52b.png diff --git a/dist/v-1520418874500/emojis/1f52c.png b/dist/v-1521124836513/emojis/1f52c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f52c.png rename to dist/v-1521124836513/emojis/1f52c.png diff --git a/dist/v-1520418874500/emojis/1f52d.png b/dist/v-1521124836513/emojis/1f52d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f52d.png rename to dist/v-1521124836513/emojis/1f52d.png diff --git a/dist/v-1520418874500/emojis/1f52e.png b/dist/v-1521124836513/emojis/1f52e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f52e.png rename to dist/v-1521124836513/emojis/1f52e.png diff --git a/dist/v-1520418874500/emojis/1f52f.png b/dist/v-1521124836513/emojis/1f52f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f52f.png rename to dist/v-1521124836513/emojis/1f52f.png diff --git a/dist/v-1520418874500/emojis/1f530.png b/dist/v-1521124836513/emojis/1f530.png similarity index 100% rename from dist/v-1520418874500/emojis/1f530.png rename to dist/v-1521124836513/emojis/1f530.png diff --git a/dist/v-1520418874500/emojis/1f531.png b/dist/v-1521124836513/emojis/1f531.png similarity index 100% rename from dist/v-1520418874500/emojis/1f531.png rename to dist/v-1521124836513/emojis/1f531.png diff --git a/dist/v-1520418874500/emojis/1f532.png b/dist/v-1521124836513/emojis/1f532.png similarity index 100% rename from dist/v-1520418874500/emojis/1f532.png rename to dist/v-1521124836513/emojis/1f532.png diff --git a/dist/v-1520418874500/emojis/1f533.png b/dist/v-1521124836513/emojis/1f533.png similarity index 100% rename from dist/v-1520418874500/emojis/1f533.png rename to dist/v-1521124836513/emojis/1f533.png diff --git a/dist/v-1520418874500/emojis/1f534.png b/dist/v-1521124836513/emojis/1f534.png similarity index 100% rename from dist/v-1520418874500/emojis/1f534.png rename to dist/v-1521124836513/emojis/1f534.png diff --git a/dist/v-1520418874500/emojis/1f535.png b/dist/v-1521124836513/emojis/1f535.png similarity index 100% rename from dist/v-1520418874500/emojis/1f535.png rename to dist/v-1521124836513/emojis/1f535.png diff --git a/dist/v-1520418874500/emojis/1f536.png b/dist/v-1521124836513/emojis/1f536.png similarity index 100% rename from dist/v-1520418874500/emojis/1f536.png rename to dist/v-1521124836513/emojis/1f536.png diff --git a/dist/v-1520418874500/emojis/1f537.png b/dist/v-1521124836513/emojis/1f537.png similarity index 100% rename from dist/v-1520418874500/emojis/1f537.png rename to dist/v-1521124836513/emojis/1f537.png diff --git a/dist/v-1520418874500/emojis/1f538.png b/dist/v-1521124836513/emojis/1f538.png similarity index 100% rename from dist/v-1520418874500/emojis/1f538.png rename to dist/v-1521124836513/emojis/1f538.png diff --git a/dist/v-1520418874500/emojis/1f539.png b/dist/v-1521124836513/emojis/1f539.png similarity index 100% rename from dist/v-1520418874500/emojis/1f539.png rename to dist/v-1521124836513/emojis/1f539.png diff --git a/dist/v-1520418874500/emojis/1f53a.png b/dist/v-1521124836513/emojis/1f53a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f53a.png rename to dist/v-1521124836513/emojis/1f53a.png diff --git a/dist/v-1520418874500/emojis/1f53b.png b/dist/v-1521124836513/emojis/1f53b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f53b.png rename to dist/v-1521124836513/emojis/1f53b.png diff --git a/dist/v-1520418874500/emojis/1f53c.png b/dist/v-1521124836513/emojis/1f53c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f53c.png rename to dist/v-1521124836513/emojis/1f53c.png diff --git a/dist/v-1520418874500/emojis/1f53d.png b/dist/v-1521124836513/emojis/1f53d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f53d.png rename to dist/v-1521124836513/emojis/1f53d.png diff --git a/dist/v-1520418874500/emojis/1f549.png b/dist/v-1521124836513/emojis/1f549.png similarity index 100% rename from dist/v-1520418874500/emojis/1f549.png rename to dist/v-1521124836513/emojis/1f549.png diff --git a/dist/v-1520418874500/emojis/1f54a.png b/dist/v-1521124836513/emojis/1f54a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f54a.png rename to dist/v-1521124836513/emojis/1f54a.png diff --git a/dist/v-1520418874500/emojis/1f54b.png b/dist/v-1521124836513/emojis/1f54b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f54b.png rename to dist/v-1521124836513/emojis/1f54b.png diff --git a/dist/v-1520418874500/emojis/1f54c.png b/dist/v-1521124836513/emojis/1f54c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f54c.png rename to dist/v-1521124836513/emojis/1f54c.png diff --git a/dist/v-1520418874500/emojis/1f54d.png b/dist/v-1521124836513/emojis/1f54d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f54d.png rename to dist/v-1521124836513/emojis/1f54d.png diff --git a/dist/v-1520418874500/emojis/1f54e.png b/dist/v-1521124836513/emojis/1f54e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f54e.png rename to dist/v-1521124836513/emojis/1f54e.png diff --git a/dist/v-1520418874500/emojis/1f550.png b/dist/v-1521124836513/emojis/1f550.png similarity index 100% rename from dist/v-1520418874500/emojis/1f550.png rename to dist/v-1521124836513/emojis/1f550.png diff --git a/dist/v-1520418874500/emojis/1f551.png b/dist/v-1521124836513/emojis/1f551.png similarity index 100% rename from dist/v-1520418874500/emojis/1f551.png rename to dist/v-1521124836513/emojis/1f551.png diff --git a/dist/v-1520418874500/emojis/1f552.png b/dist/v-1521124836513/emojis/1f552.png similarity index 100% rename from dist/v-1520418874500/emojis/1f552.png rename to dist/v-1521124836513/emojis/1f552.png diff --git a/dist/v-1520418874500/emojis/1f553.png b/dist/v-1521124836513/emojis/1f553.png similarity index 100% rename from dist/v-1520418874500/emojis/1f553.png rename to dist/v-1521124836513/emojis/1f553.png diff --git a/dist/v-1520418874500/emojis/1f554.png b/dist/v-1521124836513/emojis/1f554.png similarity index 100% rename from dist/v-1520418874500/emojis/1f554.png rename to dist/v-1521124836513/emojis/1f554.png diff --git a/dist/v-1520418874500/emojis/1f555.png b/dist/v-1521124836513/emojis/1f555.png similarity index 100% rename from dist/v-1520418874500/emojis/1f555.png rename to dist/v-1521124836513/emojis/1f555.png diff --git a/dist/v-1520418874500/emojis/1f556.png b/dist/v-1521124836513/emojis/1f556.png similarity index 100% rename from dist/v-1520418874500/emojis/1f556.png rename to dist/v-1521124836513/emojis/1f556.png diff --git a/dist/v-1520418874500/emojis/1f557.png b/dist/v-1521124836513/emojis/1f557.png similarity index 100% rename from dist/v-1520418874500/emojis/1f557.png rename to dist/v-1521124836513/emojis/1f557.png diff --git a/dist/v-1520418874500/emojis/1f558.png b/dist/v-1521124836513/emojis/1f558.png similarity index 100% rename from dist/v-1520418874500/emojis/1f558.png rename to dist/v-1521124836513/emojis/1f558.png diff --git a/dist/v-1520418874500/emojis/1f559.png b/dist/v-1521124836513/emojis/1f559.png similarity index 100% rename from dist/v-1520418874500/emojis/1f559.png rename to dist/v-1521124836513/emojis/1f559.png diff --git a/dist/v-1520418874500/emojis/1f55a.png b/dist/v-1521124836513/emojis/1f55a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f55a.png rename to dist/v-1521124836513/emojis/1f55a.png diff --git a/dist/v-1520418874500/emojis/1f55b.png b/dist/v-1521124836513/emojis/1f55b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f55b.png rename to dist/v-1521124836513/emojis/1f55b.png diff --git a/dist/v-1520418874500/emojis/1f55c.png b/dist/v-1521124836513/emojis/1f55c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f55c.png rename to dist/v-1521124836513/emojis/1f55c.png diff --git a/dist/v-1520418874500/emojis/1f55d.png b/dist/v-1521124836513/emojis/1f55d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f55d.png rename to dist/v-1521124836513/emojis/1f55d.png diff --git a/dist/v-1520418874500/emojis/1f55e.png b/dist/v-1521124836513/emojis/1f55e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f55e.png rename to dist/v-1521124836513/emojis/1f55e.png diff --git a/dist/v-1520418874500/emojis/1f55f.png b/dist/v-1521124836513/emojis/1f55f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f55f.png rename to dist/v-1521124836513/emojis/1f55f.png diff --git a/dist/v-1520418874500/emojis/1f560.png b/dist/v-1521124836513/emojis/1f560.png similarity index 100% rename from dist/v-1520418874500/emojis/1f560.png rename to dist/v-1521124836513/emojis/1f560.png diff --git a/dist/v-1520418874500/emojis/1f561.png b/dist/v-1521124836513/emojis/1f561.png similarity index 100% rename from dist/v-1520418874500/emojis/1f561.png rename to dist/v-1521124836513/emojis/1f561.png diff --git a/dist/v-1520418874500/emojis/1f562.png b/dist/v-1521124836513/emojis/1f562.png similarity index 100% rename from dist/v-1520418874500/emojis/1f562.png rename to dist/v-1521124836513/emojis/1f562.png diff --git a/dist/v-1520418874500/emojis/1f563.png b/dist/v-1521124836513/emojis/1f563.png similarity index 100% rename from dist/v-1520418874500/emojis/1f563.png rename to dist/v-1521124836513/emojis/1f563.png diff --git a/dist/v-1520418874500/emojis/1f564.png b/dist/v-1521124836513/emojis/1f564.png similarity index 100% rename from dist/v-1520418874500/emojis/1f564.png rename to dist/v-1521124836513/emojis/1f564.png diff --git a/dist/v-1520418874500/emojis/1f565.png b/dist/v-1521124836513/emojis/1f565.png similarity index 100% rename from dist/v-1520418874500/emojis/1f565.png rename to dist/v-1521124836513/emojis/1f565.png diff --git a/dist/v-1520418874500/emojis/1f566.png b/dist/v-1521124836513/emojis/1f566.png similarity index 100% rename from dist/v-1520418874500/emojis/1f566.png rename to dist/v-1521124836513/emojis/1f566.png diff --git a/dist/v-1520418874500/emojis/1f567.png b/dist/v-1521124836513/emojis/1f567.png similarity index 100% rename from dist/v-1520418874500/emojis/1f567.png rename to dist/v-1521124836513/emojis/1f567.png diff --git a/dist/v-1520418874500/emojis/1f56f.png b/dist/v-1521124836513/emojis/1f56f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f56f.png rename to dist/v-1521124836513/emojis/1f56f.png diff --git a/dist/v-1520418874500/emojis/1f570.png b/dist/v-1521124836513/emojis/1f570.png similarity index 100% rename from dist/v-1520418874500/emojis/1f570.png rename to dist/v-1521124836513/emojis/1f570.png diff --git a/dist/v-1520418874500/emojis/1f573.png b/dist/v-1521124836513/emojis/1f573.png similarity index 100% rename from dist/v-1520418874500/emojis/1f573.png rename to dist/v-1521124836513/emojis/1f573.png diff --git a/dist/v-1520418874500/emojis/1f574.png b/dist/v-1521124836513/emojis/1f574.png similarity index 100% rename from dist/v-1520418874500/emojis/1f574.png rename to dist/v-1521124836513/emojis/1f574.png diff --git a/dist/v-1520418874500/emojis/1f575-fe0f-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f575-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f575-fe0f-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f575-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f575-fe0f-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f575-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f575-fe0f-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f575-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f575.png b/dist/v-1521124836513/emojis/1f575.png similarity index 100% rename from dist/v-1520418874500/emojis/1f575.png rename to dist/v-1521124836513/emojis/1f575.png diff --git a/dist/v-1520418874500/emojis/1f576.png b/dist/v-1521124836513/emojis/1f576.png similarity index 100% rename from dist/v-1520418874500/emojis/1f576.png rename to dist/v-1521124836513/emojis/1f576.png diff --git a/dist/v-1520418874500/emojis/1f577.png b/dist/v-1521124836513/emojis/1f577.png similarity index 100% rename from dist/v-1520418874500/emojis/1f577.png rename to dist/v-1521124836513/emojis/1f577.png diff --git a/dist/v-1520418874500/emojis/1f578.png b/dist/v-1521124836513/emojis/1f578.png similarity index 100% rename from dist/v-1520418874500/emojis/1f578.png rename to dist/v-1521124836513/emojis/1f578.png diff --git a/dist/v-1520418874500/emojis/1f579.png b/dist/v-1521124836513/emojis/1f579.png similarity index 100% rename from dist/v-1520418874500/emojis/1f579.png rename to dist/v-1521124836513/emojis/1f579.png diff --git a/dist/v-1520418874500/emojis/1f57a.png b/dist/v-1521124836513/emojis/1f57a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f57a.png rename to dist/v-1521124836513/emojis/1f57a.png diff --git a/dist/v-1520418874500/emojis/1f587.png b/dist/v-1521124836513/emojis/1f587.png similarity index 100% rename from dist/v-1520418874500/emojis/1f587.png rename to dist/v-1521124836513/emojis/1f587.png diff --git a/dist/v-1520418874500/emojis/1f58a.png b/dist/v-1521124836513/emojis/1f58a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f58a.png rename to dist/v-1521124836513/emojis/1f58a.png diff --git a/dist/v-1520418874500/emojis/1f58b.png b/dist/v-1521124836513/emojis/1f58b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f58b.png rename to dist/v-1521124836513/emojis/1f58b.png diff --git a/dist/v-1520418874500/emojis/1f58c.png b/dist/v-1521124836513/emojis/1f58c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f58c.png rename to dist/v-1521124836513/emojis/1f58c.png diff --git a/dist/v-1520418874500/emojis/1f58d.png b/dist/v-1521124836513/emojis/1f58d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f58d.png rename to dist/v-1521124836513/emojis/1f58d.png diff --git a/dist/v-1520418874500/emojis/1f590.png b/dist/v-1521124836513/emojis/1f590.png similarity index 100% rename from dist/v-1520418874500/emojis/1f590.png rename to dist/v-1521124836513/emojis/1f590.png diff --git a/dist/v-1520418874500/emojis/1f595.png b/dist/v-1521124836513/emojis/1f595.png similarity index 100% rename from dist/v-1520418874500/emojis/1f595.png rename to dist/v-1521124836513/emojis/1f595.png diff --git a/dist/v-1520418874500/emojis/1f596.png b/dist/v-1521124836513/emojis/1f596.png similarity index 100% rename from dist/v-1520418874500/emojis/1f596.png rename to dist/v-1521124836513/emojis/1f596.png diff --git a/dist/v-1520418874500/emojis/1f5a4.png b/dist/v-1521124836513/emojis/1f5a4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5a4.png rename to dist/v-1521124836513/emojis/1f5a4.png diff --git a/dist/v-1520418874500/emojis/1f5a5.png b/dist/v-1521124836513/emojis/1f5a5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5a5.png rename to dist/v-1521124836513/emojis/1f5a5.png diff --git a/dist/v-1520418874500/emojis/1f5a8.png b/dist/v-1521124836513/emojis/1f5a8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5a8.png rename to dist/v-1521124836513/emojis/1f5a8.png diff --git a/dist/v-1520418874500/emojis/1f5b1.png b/dist/v-1521124836513/emojis/1f5b1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5b1.png rename to dist/v-1521124836513/emojis/1f5b1.png diff --git a/dist/v-1520418874500/emojis/1f5b2.png b/dist/v-1521124836513/emojis/1f5b2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5b2.png rename to dist/v-1521124836513/emojis/1f5b2.png diff --git a/dist/v-1520418874500/emojis/1f5bc.png b/dist/v-1521124836513/emojis/1f5bc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5bc.png rename to dist/v-1521124836513/emojis/1f5bc.png diff --git a/dist/v-1520418874500/emojis/1f5c2.png b/dist/v-1521124836513/emojis/1f5c2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5c2.png rename to dist/v-1521124836513/emojis/1f5c2.png diff --git a/dist/v-1520418874500/emojis/1f5c3.png b/dist/v-1521124836513/emojis/1f5c3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5c3.png rename to dist/v-1521124836513/emojis/1f5c3.png diff --git a/dist/v-1520418874500/emojis/1f5c4.png b/dist/v-1521124836513/emojis/1f5c4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5c4.png rename to dist/v-1521124836513/emojis/1f5c4.png diff --git a/dist/v-1520418874500/emojis/1f5d1.png b/dist/v-1521124836513/emojis/1f5d1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5d1.png rename to dist/v-1521124836513/emojis/1f5d1.png diff --git a/dist/v-1520418874500/emojis/1f5d2.png b/dist/v-1521124836513/emojis/1f5d2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5d2.png rename to dist/v-1521124836513/emojis/1f5d2.png diff --git a/dist/v-1520418874500/emojis/1f5d3.png b/dist/v-1521124836513/emojis/1f5d3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5d3.png rename to dist/v-1521124836513/emojis/1f5d3.png diff --git a/dist/v-1520418874500/emojis/1f5dc.png b/dist/v-1521124836513/emojis/1f5dc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5dc.png rename to dist/v-1521124836513/emojis/1f5dc.png diff --git a/dist/v-1520418874500/emojis/1f5dd.png b/dist/v-1521124836513/emojis/1f5dd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5dd.png rename to dist/v-1521124836513/emojis/1f5dd.png diff --git a/dist/v-1520418874500/emojis/1f5de.png b/dist/v-1521124836513/emojis/1f5de.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5de.png rename to dist/v-1521124836513/emojis/1f5de.png diff --git a/dist/v-1520418874500/emojis/1f5e1.png b/dist/v-1521124836513/emojis/1f5e1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5e1.png rename to dist/v-1521124836513/emojis/1f5e1.png diff --git a/dist/v-1520418874500/emojis/1f5e3.png b/dist/v-1521124836513/emojis/1f5e3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5e3.png rename to dist/v-1521124836513/emojis/1f5e3.png diff --git a/dist/v-1520418874500/emojis/1f5e8.png b/dist/v-1521124836513/emojis/1f5e8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5e8.png rename to dist/v-1521124836513/emojis/1f5e8.png diff --git a/dist/v-1520418874500/emojis/1f5ef.png b/dist/v-1521124836513/emojis/1f5ef.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5ef.png rename to dist/v-1521124836513/emojis/1f5ef.png diff --git a/dist/v-1520418874500/emojis/1f5f3.png b/dist/v-1521124836513/emojis/1f5f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5f3.png rename to dist/v-1521124836513/emojis/1f5f3.png diff --git a/dist/v-1520418874500/emojis/1f5fa.png b/dist/v-1521124836513/emojis/1f5fa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5fa.png rename to dist/v-1521124836513/emojis/1f5fa.png diff --git a/dist/v-1520418874500/emojis/1f5fb.png b/dist/v-1521124836513/emojis/1f5fb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5fb.png rename to dist/v-1521124836513/emojis/1f5fb.png diff --git a/dist/v-1520418874500/emojis/1f5fc.png b/dist/v-1521124836513/emojis/1f5fc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5fc.png rename to dist/v-1521124836513/emojis/1f5fc.png diff --git a/dist/v-1520418874500/emojis/1f5fd.png b/dist/v-1521124836513/emojis/1f5fd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5fd.png rename to dist/v-1521124836513/emojis/1f5fd.png diff --git a/dist/v-1520418874500/emojis/1f5fe.png b/dist/v-1521124836513/emojis/1f5fe.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5fe.png rename to dist/v-1521124836513/emojis/1f5fe.png diff --git a/dist/v-1520418874500/emojis/1f5ff.png b/dist/v-1521124836513/emojis/1f5ff.png similarity index 100% rename from dist/v-1520418874500/emojis/1f5ff.png rename to dist/v-1521124836513/emojis/1f5ff.png diff --git a/dist/v-1520418874500/emojis/1f600.png b/dist/v-1521124836513/emojis/1f600.png similarity index 100% rename from dist/v-1520418874500/emojis/1f600.png rename to dist/v-1521124836513/emojis/1f600.png diff --git a/dist/v-1520418874500/emojis/1f601.png b/dist/v-1521124836513/emojis/1f601.png similarity index 100% rename from dist/v-1520418874500/emojis/1f601.png rename to dist/v-1521124836513/emojis/1f601.png diff --git a/dist/v-1520418874500/emojis/1f602.png b/dist/v-1521124836513/emojis/1f602.png similarity index 100% rename from dist/v-1520418874500/emojis/1f602.png rename to dist/v-1521124836513/emojis/1f602.png diff --git a/dist/v-1520418874500/emojis/1f603.png b/dist/v-1521124836513/emojis/1f603.png similarity index 100% rename from dist/v-1520418874500/emojis/1f603.png rename to dist/v-1521124836513/emojis/1f603.png diff --git a/dist/v-1520418874500/emojis/1f604.png b/dist/v-1521124836513/emojis/1f604.png similarity index 100% rename from dist/v-1520418874500/emojis/1f604.png rename to dist/v-1521124836513/emojis/1f604.png diff --git a/dist/v-1520418874500/emojis/1f605.png b/dist/v-1521124836513/emojis/1f605.png similarity index 100% rename from dist/v-1520418874500/emojis/1f605.png rename to dist/v-1521124836513/emojis/1f605.png diff --git a/dist/v-1520418874500/emojis/1f606.png b/dist/v-1521124836513/emojis/1f606.png similarity index 100% rename from dist/v-1520418874500/emojis/1f606.png rename to dist/v-1521124836513/emojis/1f606.png diff --git a/dist/v-1520418874500/emojis/1f607.png b/dist/v-1521124836513/emojis/1f607.png similarity index 100% rename from dist/v-1520418874500/emojis/1f607.png rename to dist/v-1521124836513/emojis/1f607.png diff --git a/dist/v-1520418874500/emojis/1f608.png b/dist/v-1521124836513/emojis/1f608.png similarity index 100% rename from dist/v-1520418874500/emojis/1f608.png rename to dist/v-1521124836513/emojis/1f608.png diff --git a/dist/v-1520418874500/emojis/1f609.png b/dist/v-1521124836513/emojis/1f609.png similarity index 100% rename from dist/v-1520418874500/emojis/1f609.png rename to dist/v-1521124836513/emojis/1f609.png diff --git a/dist/v-1520418874500/emojis/1f60a.png b/dist/v-1521124836513/emojis/1f60a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f60a.png rename to dist/v-1521124836513/emojis/1f60a.png diff --git a/dist/v-1520418874500/emojis/1f60b.png b/dist/v-1521124836513/emojis/1f60b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f60b.png rename to dist/v-1521124836513/emojis/1f60b.png diff --git a/dist/v-1520418874500/emojis/1f60c.png b/dist/v-1521124836513/emojis/1f60c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f60c.png rename to dist/v-1521124836513/emojis/1f60c.png diff --git a/dist/v-1520418874500/emojis/1f60d.png b/dist/v-1521124836513/emojis/1f60d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f60d.png rename to dist/v-1521124836513/emojis/1f60d.png diff --git a/dist/v-1520418874500/emojis/1f60e.png b/dist/v-1521124836513/emojis/1f60e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f60e.png rename to dist/v-1521124836513/emojis/1f60e.png diff --git a/dist/v-1520418874500/emojis/1f60f.png b/dist/v-1521124836513/emojis/1f60f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f60f.png rename to dist/v-1521124836513/emojis/1f60f.png diff --git a/dist/v-1520418874500/emojis/1f610.png b/dist/v-1521124836513/emojis/1f610.png similarity index 100% rename from dist/v-1520418874500/emojis/1f610.png rename to dist/v-1521124836513/emojis/1f610.png diff --git a/dist/v-1520418874500/emojis/1f611.png b/dist/v-1521124836513/emojis/1f611.png similarity index 100% rename from dist/v-1520418874500/emojis/1f611.png rename to dist/v-1521124836513/emojis/1f611.png diff --git a/dist/v-1520418874500/emojis/1f612.png b/dist/v-1521124836513/emojis/1f612.png similarity index 100% rename from dist/v-1520418874500/emojis/1f612.png rename to dist/v-1521124836513/emojis/1f612.png diff --git a/dist/v-1520418874500/emojis/1f613.png b/dist/v-1521124836513/emojis/1f613.png similarity index 100% rename from dist/v-1520418874500/emojis/1f613.png rename to dist/v-1521124836513/emojis/1f613.png diff --git a/dist/v-1520418874500/emojis/1f614.png b/dist/v-1521124836513/emojis/1f614.png similarity index 100% rename from dist/v-1520418874500/emojis/1f614.png rename to dist/v-1521124836513/emojis/1f614.png diff --git a/dist/v-1520418874500/emojis/1f615.png b/dist/v-1521124836513/emojis/1f615.png similarity index 100% rename from dist/v-1520418874500/emojis/1f615.png rename to dist/v-1521124836513/emojis/1f615.png diff --git a/dist/v-1520418874500/emojis/1f616.png b/dist/v-1521124836513/emojis/1f616.png similarity index 100% rename from dist/v-1520418874500/emojis/1f616.png rename to dist/v-1521124836513/emojis/1f616.png diff --git a/dist/v-1520418874500/emojis/1f617.png b/dist/v-1521124836513/emojis/1f617.png similarity index 100% rename from dist/v-1520418874500/emojis/1f617.png rename to dist/v-1521124836513/emojis/1f617.png diff --git a/dist/v-1520418874500/emojis/1f618.png b/dist/v-1521124836513/emojis/1f618.png similarity index 100% rename from dist/v-1520418874500/emojis/1f618.png rename to dist/v-1521124836513/emojis/1f618.png diff --git a/dist/v-1520418874500/emojis/1f619.png b/dist/v-1521124836513/emojis/1f619.png similarity index 100% rename from dist/v-1520418874500/emojis/1f619.png rename to dist/v-1521124836513/emojis/1f619.png diff --git a/dist/v-1520418874500/emojis/1f61a.png b/dist/v-1521124836513/emojis/1f61a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f61a.png rename to dist/v-1521124836513/emojis/1f61a.png diff --git a/dist/v-1520418874500/emojis/1f61b.png b/dist/v-1521124836513/emojis/1f61b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f61b.png rename to dist/v-1521124836513/emojis/1f61b.png diff --git a/dist/v-1520418874500/emojis/1f61c.png b/dist/v-1521124836513/emojis/1f61c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f61c.png rename to dist/v-1521124836513/emojis/1f61c.png diff --git a/dist/v-1520418874500/emojis/1f61d.png b/dist/v-1521124836513/emojis/1f61d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f61d.png rename to dist/v-1521124836513/emojis/1f61d.png diff --git a/dist/v-1520418874500/emojis/1f61e.png b/dist/v-1521124836513/emojis/1f61e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f61e.png rename to dist/v-1521124836513/emojis/1f61e.png diff --git a/dist/v-1520418874500/emojis/1f61f.png b/dist/v-1521124836513/emojis/1f61f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f61f.png rename to dist/v-1521124836513/emojis/1f61f.png diff --git a/dist/v-1520418874500/emojis/1f620.png b/dist/v-1521124836513/emojis/1f620.png similarity index 100% rename from dist/v-1520418874500/emojis/1f620.png rename to dist/v-1521124836513/emojis/1f620.png diff --git a/dist/v-1520418874500/emojis/1f621.png b/dist/v-1521124836513/emojis/1f621.png similarity index 100% rename from dist/v-1520418874500/emojis/1f621.png rename to dist/v-1521124836513/emojis/1f621.png diff --git a/dist/v-1520418874500/emojis/1f622.png b/dist/v-1521124836513/emojis/1f622.png similarity index 100% rename from dist/v-1520418874500/emojis/1f622.png rename to dist/v-1521124836513/emojis/1f622.png diff --git a/dist/v-1520418874500/emojis/1f623.png b/dist/v-1521124836513/emojis/1f623.png similarity index 100% rename from dist/v-1520418874500/emojis/1f623.png rename to dist/v-1521124836513/emojis/1f623.png diff --git a/dist/v-1520418874500/emojis/1f624.png b/dist/v-1521124836513/emojis/1f624.png similarity index 100% rename from dist/v-1520418874500/emojis/1f624.png rename to dist/v-1521124836513/emojis/1f624.png diff --git a/dist/v-1520418874500/emojis/1f625.png b/dist/v-1521124836513/emojis/1f625.png similarity index 100% rename from dist/v-1520418874500/emojis/1f625.png rename to dist/v-1521124836513/emojis/1f625.png diff --git a/dist/v-1520418874500/emojis/1f626.png b/dist/v-1521124836513/emojis/1f626.png similarity index 100% rename from dist/v-1520418874500/emojis/1f626.png rename to dist/v-1521124836513/emojis/1f626.png diff --git a/dist/v-1520418874500/emojis/1f627.png b/dist/v-1521124836513/emojis/1f627.png similarity index 100% rename from dist/v-1520418874500/emojis/1f627.png rename to dist/v-1521124836513/emojis/1f627.png diff --git a/dist/v-1520418874500/emojis/1f628.png b/dist/v-1521124836513/emojis/1f628.png similarity index 100% rename from dist/v-1520418874500/emojis/1f628.png rename to dist/v-1521124836513/emojis/1f628.png diff --git a/dist/v-1520418874500/emojis/1f629.png b/dist/v-1521124836513/emojis/1f629.png similarity index 100% rename from dist/v-1520418874500/emojis/1f629.png rename to dist/v-1521124836513/emojis/1f629.png diff --git a/dist/v-1520418874500/emojis/1f62a.png b/dist/v-1521124836513/emojis/1f62a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f62a.png rename to dist/v-1521124836513/emojis/1f62a.png diff --git a/dist/v-1520418874500/emojis/1f62b.png b/dist/v-1521124836513/emojis/1f62b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f62b.png rename to dist/v-1521124836513/emojis/1f62b.png diff --git a/dist/v-1520418874500/emojis/1f62c.png b/dist/v-1521124836513/emojis/1f62c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f62c.png rename to dist/v-1521124836513/emojis/1f62c.png diff --git a/dist/v-1520418874500/emojis/1f62d.png b/dist/v-1521124836513/emojis/1f62d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f62d.png rename to dist/v-1521124836513/emojis/1f62d.png diff --git a/dist/v-1520418874500/emojis/1f62e.png b/dist/v-1521124836513/emojis/1f62e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f62e.png rename to dist/v-1521124836513/emojis/1f62e.png diff --git a/dist/v-1520418874500/emojis/1f62f.png b/dist/v-1521124836513/emojis/1f62f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f62f.png rename to dist/v-1521124836513/emojis/1f62f.png diff --git a/dist/v-1520418874500/emojis/1f630.png b/dist/v-1521124836513/emojis/1f630.png similarity index 100% rename from dist/v-1520418874500/emojis/1f630.png rename to dist/v-1521124836513/emojis/1f630.png diff --git a/dist/v-1520418874500/emojis/1f631.png b/dist/v-1521124836513/emojis/1f631.png similarity index 100% rename from dist/v-1520418874500/emojis/1f631.png rename to dist/v-1521124836513/emojis/1f631.png diff --git a/dist/v-1520418874500/emojis/1f632.png b/dist/v-1521124836513/emojis/1f632.png similarity index 100% rename from dist/v-1520418874500/emojis/1f632.png rename to dist/v-1521124836513/emojis/1f632.png diff --git a/dist/v-1520418874500/emojis/1f633.png b/dist/v-1521124836513/emojis/1f633.png similarity index 100% rename from dist/v-1520418874500/emojis/1f633.png rename to dist/v-1521124836513/emojis/1f633.png diff --git a/dist/v-1520418874500/emojis/1f634.png b/dist/v-1521124836513/emojis/1f634.png similarity index 100% rename from dist/v-1520418874500/emojis/1f634.png rename to dist/v-1521124836513/emojis/1f634.png diff --git a/dist/v-1520418874500/emojis/1f635.png b/dist/v-1521124836513/emojis/1f635.png similarity index 100% rename from dist/v-1520418874500/emojis/1f635.png rename to dist/v-1521124836513/emojis/1f635.png diff --git a/dist/v-1520418874500/emojis/1f636.png b/dist/v-1521124836513/emojis/1f636.png similarity index 100% rename from dist/v-1520418874500/emojis/1f636.png rename to dist/v-1521124836513/emojis/1f636.png diff --git a/dist/v-1520418874500/emojis/1f637.png b/dist/v-1521124836513/emojis/1f637.png similarity index 100% rename from dist/v-1520418874500/emojis/1f637.png rename to dist/v-1521124836513/emojis/1f637.png diff --git a/dist/v-1520418874500/emojis/1f638.png b/dist/v-1521124836513/emojis/1f638.png similarity index 100% rename from dist/v-1520418874500/emojis/1f638.png rename to dist/v-1521124836513/emojis/1f638.png diff --git a/dist/v-1520418874500/emojis/1f639.png b/dist/v-1521124836513/emojis/1f639.png similarity index 100% rename from dist/v-1520418874500/emojis/1f639.png rename to dist/v-1521124836513/emojis/1f639.png diff --git a/dist/v-1520418874500/emojis/1f63a.png b/dist/v-1521124836513/emojis/1f63a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f63a.png rename to dist/v-1521124836513/emojis/1f63a.png diff --git a/dist/v-1520418874500/emojis/1f63b.png b/dist/v-1521124836513/emojis/1f63b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f63b.png rename to dist/v-1521124836513/emojis/1f63b.png diff --git a/dist/v-1520418874500/emojis/1f63c.png b/dist/v-1521124836513/emojis/1f63c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f63c.png rename to dist/v-1521124836513/emojis/1f63c.png diff --git a/dist/v-1520418874500/emojis/1f63d.png b/dist/v-1521124836513/emojis/1f63d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f63d.png rename to dist/v-1521124836513/emojis/1f63d.png diff --git a/dist/v-1520418874500/emojis/1f63e.png b/dist/v-1521124836513/emojis/1f63e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f63e.png rename to dist/v-1521124836513/emojis/1f63e.png diff --git a/dist/v-1520418874500/emojis/1f63f.png b/dist/v-1521124836513/emojis/1f63f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f63f.png rename to dist/v-1521124836513/emojis/1f63f.png diff --git a/dist/v-1520418874500/emojis/1f640.png b/dist/v-1521124836513/emojis/1f640.png similarity index 100% rename from dist/v-1520418874500/emojis/1f640.png rename to dist/v-1521124836513/emojis/1f640.png diff --git a/dist/v-1520418874500/emojis/1f641.png b/dist/v-1521124836513/emojis/1f641.png similarity index 100% rename from dist/v-1520418874500/emojis/1f641.png rename to dist/v-1521124836513/emojis/1f641.png diff --git a/dist/v-1520418874500/emojis/1f642.png b/dist/v-1521124836513/emojis/1f642.png similarity index 100% rename from dist/v-1520418874500/emojis/1f642.png rename to dist/v-1521124836513/emojis/1f642.png diff --git a/dist/v-1520418874500/emojis/1f643.png b/dist/v-1521124836513/emojis/1f643.png similarity index 100% rename from dist/v-1520418874500/emojis/1f643.png rename to dist/v-1521124836513/emojis/1f643.png diff --git a/dist/v-1520418874500/emojis/1f644.png b/dist/v-1521124836513/emojis/1f644.png similarity index 100% rename from dist/v-1520418874500/emojis/1f644.png rename to dist/v-1521124836513/emojis/1f644.png diff --git a/dist/v-1520418874500/emojis/1f645-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f645-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f645-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f645-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f645-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f645-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f645-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f645-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f645.png b/dist/v-1521124836513/emojis/1f645.png similarity index 100% rename from dist/v-1520418874500/emojis/1f645.png rename to dist/v-1521124836513/emojis/1f645.png diff --git a/dist/v-1520418874500/emojis/1f646-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f646-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f646-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f646-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f646-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f646-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f646-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f646-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f646.png b/dist/v-1521124836513/emojis/1f646.png similarity index 100% rename from dist/v-1520418874500/emojis/1f646.png rename to dist/v-1521124836513/emojis/1f646.png diff --git a/dist/v-1520418874500/emojis/1f647-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f647-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f647-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f647-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f647-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f647-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f647-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f647-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f647.png b/dist/v-1521124836513/emojis/1f647.png similarity index 100% rename from dist/v-1520418874500/emojis/1f647.png rename to dist/v-1521124836513/emojis/1f647.png diff --git a/dist/v-1520418874500/emojis/1f648.png b/dist/v-1521124836513/emojis/1f648.png similarity index 100% rename from dist/v-1520418874500/emojis/1f648.png rename to dist/v-1521124836513/emojis/1f648.png diff --git a/dist/v-1520418874500/emojis/1f649.png b/dist/v-1521124836513/emojis/1f649.png similarity index 100% rename from dist/v-1520418874500/emojis/1f649.png rename to dist/v-1521124836513/emojis/1f649.png diff --git a/dist/v-1520418874500/emojis/1f64a.png b/dist/v-1521124836513/emojis/1f64a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64a.png rename to dist/v-1521124836513/emojis/1f64a.png diff --git a/dist/v-1520418874500/emojis/1f64b-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f64b-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64b-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f64b-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f64b-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f64b-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64b-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f64b-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f64b.png b/dist/v-1521124836513/emojis/1f64b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64b.png rename to dist/v-1521124836513/emojis/1f64b.png diff --git a/dist/v-1520418874500/emojis/1f64c.png b/dist/v-1521124836513/emojis/1f64c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64c.png rename to dist/v-1521124836513/emojis/1f64c.png diff --git a/dist/v-1520418874500/emojis/1f64d-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f64d-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64d-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f64d-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f64d-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f64d-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64d-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f64d-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f64d.png b/dist/v-1521124836513/emojis/1f64d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64d.png rename to dist/v-1521124836513/emojis/1f64d.png diff --git a/dist/v-1520418874500/emojis/1f64e-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f64e-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64e-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f64e-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f64e-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f64e-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64e-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f64e-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f64e.png b/dist/v-1521124836513/emojis/1f64e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64e.png rename to dist/v-1521124836513/emojis/1f64e.png diff --git a/dist/v-1520418874500/emojis/1f64f.png b/dist/v-1521124836513/emojis/1f64f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f64f.png rename to dist/v-1521124836513/emojis/1f64f.png diff --git a/dist/v-1520418874500/emojis/1f680.png b/dist/v-1521124836513/emojis/1f680.png similarity index 100% rename from dist/v-1520418874500/emojis/1f680.png rename to dist/v-1521124836513/emojis/1f680.png diff --git a/dist/v-1520418874500/emojis/1f681.png b/dist/v-1521124836513/emojis/1f681.png similarity index 100% rename from dist/v-1520418874500/emojis/1f681.png rename to dist/v-1521124836513/emojis/1f681.png diff --git a/dist/v-1520418874500/emojis/1f682.png b/dist/v-1521124836513/emojis/1f682.png similarity index 100% rename from dist/v-1520418874500/emojis/1f682.png rename to dist/v-1521124836513/emojis/1f682.png diff --git a/dist/v-1520418874500/emojis/1f683.png b/dist/v-1521124836513/emojis/1f683.png similarity index 100% rename from dist/v-1520418874500/emojis/1f683.png rename to dist/v-1521124836513/emojis/1f683.png diff --git a/dist/v-1520418874500/emojis/1f684.png b/dist/v-1521124836513/emojis/1f684.png similarity index 100% rename from dist/v-1520418874500/emojis/1f684.png rename to dist/v-1521124836513/emojis/1f684.png diff --git a/dist/v-1520418874500/emojis/1f685.png b/dist/v-1521124836513/emojis/1f685.png similarity index 100% rename from dist/v-1520418874500/emojis/1f685.png rename to dist/v-1521124836513/emojis/1f685.png diff --git a/dist/v-1520418874500/emojis/1f686.png b/dist/v-1521124836513/emojis/1f686.png similarity index 100% rename from dist/v-1520418874500/emojis/1f686.png rename to dist/v-1521124836513/emojis/1f686.png diff --git a/dist/v-1520418874500/emojis/1f687.png b/dist/v-1521124836513/emojis/1f687.png similarity index 100% rename from dist/v-1520418874500/emojis/1f687.png rename to dist/v-1521124836513/emojis/1f687.png diff --git a/dist/v-1520418874500/emojis/1f688.png b/dist/v-1521124836513/emojis/1f688.png similarity index 100% rename from dist/v-1520418874500/emojis/1f688.png rename to dist/v-1521124836513/emojis/1f688.png diff --git a/dist/v-1520418874500/emojis/1f689.png b/dist/v-1521124836513/emojis/1f689.png similarity index 100% rename from dist/v-1520418874500/emojis/1f689.png rename to dist/v-1521124836513/emojis/1f689.png diff --git a/dist/v-1520418874500/emojis/1f68a.png b/dist/v-1521124836513/emojis/1f68a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f68a.png rename to dist/v-1521124836513/emojis/1f68a.png diff --git a/dist/v-1520418874500/emojis/1f68b.png b/dist/v-1521124836513/emojis/1f68b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f68b.png rename to dist/v-1521124836513/emojis/1f68b.png diff --git a/dist/v-1520418874500/emojis/1f68c.png b/dist/v-1521124836513/emojis/1f68c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f68c.png rename to dist/v-1521124836513/emojis/1f68c.png diff --git a/dist/v-1520418874500/emojis/1f68d.png b/dist/v-1521124836513/emojis/1f68d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f68d.png rename to dist/v-1521124836513/emojis/1f68d.png diff --git a/dist/v-1520418874500/emojis/1f68e.png b/dist/v-1521124836513/emojis/1f68e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f68e.png rename to dist/v-1521124836513/emojis/1f68e.png diff --git a/dist/v-1520418874500/emojis/1f68f.png b/dist/v-1521124836513/emojis/1f68f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f68f.png rename to dist/v-1521124836513/emojis/1f68f.png diff --git a/dist/v-1520418874500/emojis/1f690.png b/dist/v-1521124836513/emojis/1f690.png similarity index 100% rename from dist/v-1520418874500/emojis/1f690.png rename to dist/v-1521124836513/emojis/1f690.png diff --git a/dist/v-1520418874500/emojis/1f691.png b/dist/v-1521124836513/emojis/1f691.png similarity index 100% rename from dist/v-1520418874500/emojis/1f691.png rename to dist/v-1521124836513/emojis/1f691.png diff --git a/dist/v-1520418874500/emojis/1f692.png b/dist/v-1521124836513/emojis/1f692.png similarity index 100% rename from dist/v-1520418874500/emojis/1f692.png rename to dist/v-1521124836513/emojis/1f692.png diff --git a/dist/v-1520418874500/emojis/1f693.png b/dist/v-1521124836513/emojis/1f693.png similarity index 100% rename from dist/v-1520418874500/emojis/1f693.png rename to dist/v-1521124836513/emojis/1f693.png diff --git a/dist/v-1520418874500/emojis/1f694.png b/dist/v-1521124836513/emojis/1f694.png similarity index 100% rename from dist/v-1520418874500/emojis/1f694.png rename to dist/v-1521124836513/emojis/1f694.png diff --git a/dist/v-1520418874500/emojis/1f695.png b/dist/v-1521124836513/emojis/1f695.png similarity index 100% rename from dist/v-1520418874500/emojis/1f695.png rename to dist/v-1521124836513/emojis/1f695.png diff --git a/dist/v-1520418874500/emojis/1f696.png b/dist/v-1521124836513/emojis/1f696.png similarity index 100% rename from dist/v-1520418874500/emojis/1f696.png rename to dist/v-1521124836513/emojis/1f696.png diff --git a/dist/v-1520418874500/emojis/1f697.png b/dist/v-1521124836513/emojis/1f697.png similarity index 100% rename from dist/v-1520418874500/emojis/1f697.png rename to dist/v-1521124836513/emojis/1f697.png diff --git a/dist/v-1520418874500/emojis/1f698.png b/dist/v-1521124836513/emojis/1f698.png similarity index 100% rename from dist/v-1520418874500/emojis/1f698.png rename to dist/v-1521124836513/emojis/1f698.png diff --git a/dist/v-1520418874500/emojis/1f699.png b/dist/v-1521124836513/emojis/1f699.png similarity index 100% rename from dist/v-1520418874500/emojis/1f699.png rename to dist/v-1521124836513/emojis/1f699.png diff --git a/dist/v-1520418874500/emojis/1f69a.png b/dist/v-1521124836513/emojis/1f69a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f69a.png rename to dist/v-1521124836513/emojis/1f69a.png diff --git a/dist/v-1520418874500/emojis/1f69b.png b/dist/v-1521124836513/emojis/1f69b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f69b.png rename to dist/v-1521124836513/emojis/1f69b.png diff --git a/dist/v-1520418874500/emojis/1f69c.png b/dist/v-1521124836513/emojis/1f69c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f69c.png rename to dist/v-1521124836513/emojis/1f69c.png diff --git a/dist/v-1520418874500/emojis/1f69d.png b/dist/v-1521124836513/emojis/1f69d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f69d.png rename to dist/v-1521124836513/emojis/1f69d.png diff --git a/dist/v-1520418874500/emojis/1f69e.png b/dist/v-1521124836513/emojis/1f69e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f69e.png rename to dist/v-1521124836513/emojis/1f69e.png diff --git a/dist/v-1520418874500/emojis/1f69f.png b/dist/v-1521124836513/emojis/1f69f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f69f.png rename to dist/v-1521124836513/emojis/1f69f.png diff --git a/dist/v-1520418874500/emojis/1f6a0.png b/dist/v-1521124836513/emojis/1f6a0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a0.png rename to dist/v-1521124836513/emojis/1f6a0.png diff --git a/dist/v-1520418874500/emojis/1f6a1.png b/dist/v-1521124836513/emojis/1f6a1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a1.png rename to dist/v-1521124836513/emojis/1f6a1.png diff --git a/dist/v-1520418874500/emojis/1f6a2.png b/dist/v-1521124836513/emojis/1f6a2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a2.png rename to dist/v-1521124836513/emojis/1f6a2.png diff --git a/dist/v-1520418874500/emojis/1f6a3-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f6a3-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a3-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f6a3-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6a3-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f6a3-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a3-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f6a3-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6a3.png b/dist/v-1521124836513/emojis/1f6a3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a3.png rename to dist/v-1521124836513/emojis/1f6a3.png diff --git a/dist/v-1520418874500/emojis/1f6a4.png b/dist/v-1521124836513/emojis/1f6a4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a4.png rename to dist/v-1521124836513/emojis/1f6a4.png diff --git a/dist/v-1520418874500/emojis/1f6a5.png b/dist/v-1521124836513/emojis/1f6a5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a5.png rename to dist/v-1521124836513/emojis/1f6a5.png diff --git a/dist/v-1520418874500/emojis/1f6a6.png b/dist/v-1521124836513/emojis/1f6a6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a6.png rename to dist/v-1521124836513/emojis/1f6a6.png diff --git a/dist/v-1520418874500/emojis/1f6a7.png b/dist/v-1521124836513/emojis/1f6a7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a7.png rename to dist/v-1521124836513/emojis/1f6a7.png diff --git a/dist/v-1520418874500/emojis/1f6a8.png b/dist/v-1521124836513/emojis/1f6a8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a8.png rename to dist/v-1521124836513/emojis/1f6a8.png diff --git a/dist/v-1520418874500/emojis/1f6a9.png b/dist/v-1521124836513/emojis/1f6a9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6a9.png rename to dist/v-1521124836513/emojis/1f6a9.png diff --git a/dist/v-1520418874500/emojis/1f6aa.png b/dist/v-1521124836513/emojis/1f6aa.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6aa.png rename to dist/v-1521124836513/emojis/1f6aa.png diff --git a/dist/v-1520418874500/emojis/1f6ab.png b/dist/v-1521124836513/emojis/1f6ab.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ab.png rename to dist/v-1521124836513/emojis/1f6ab.png diff --git a/dist/v-1520418874500/emojis/1f6ac.png b/dist/v-1521124836513/emojis/1f6ac.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ac.png rename to dist/v-1521124836513/emojis/1f6ac.png diff --git a/dist/v-1520418874500/emojis/1f6ad.png b/dist/v-1521124836513/emojis/1f6ad.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ad.png rename to dist/v-1521124836513/emojis/1f6ad.png diff --git a/dist/v-1520418874500/emojis/1f6ae.png b/dist/v-1521124836513/emojis/1f6ae.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ae.png rename to dist/v-1521124836513/emojis/1f6ae.png diff --git a/dist/v-1520418874500/emojis/1f6af.png b/dist/v-1521124836513/emojis/1f6af.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6af.png rename to dist/v-1521124836513/emojis/1f6af.png diff --git a/dist/v-1520418874500/emojis/1f6b0.png b/dist/v-1521124836513/emojis/1f6b0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b0.png rename to dist/v-1521124836513/emojis/1f6b0.png diff --git a/dist/v-1520418874500/emojis/1f6b1.png b/dist/v-1521124836513/emojis/1f6b1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b1.png rename to dist/v-1521124836513/emojis/1f6b1.png diff --git a/dist/v-1520418874500/emojis/1f6b2.png b/dist/v-1521124836513/emojis/1f6b2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b2.png rename to dist/v-1521124836513/emojis/1f6b2.png diff --git a/dist/v-1520418874500/emojis/1f6b3.png b/dist/v-1521124836513/emojis/1f6b3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b3.png rename to dist/v-1521124836513/emojis/1f6b3.png diff --git a/dist/v-1520418874500/emojis/1f6b4-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f6b4-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b4-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f6b4-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6b4-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f6b4-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b4-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f6b4-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6b4.png b/dist/v-1521124836513/emojis/1f6b4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b4.png rename to dist/v-1521124836513/emojis/1f6b4.png diff --git a/dist/v-1520418874500/emojis/1f6b5-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f6b5-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b5-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f6b5-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6b5-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f6b5-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b5-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f6b5-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6b5.png b/dist/v-1521124836513/emojis/1f6b5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b5.png rename to dist/v-1521124836513/emojis/1f6b5.png diff --git a/dist/v-1520418874500/emojis/1f6b6-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f6b6-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b6-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f6b6-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6b6-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f6b6-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b6-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f6b6-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f6b6.png b/dist/v-1521124836513/emojis/1f6b6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b6.png rename to dist/v-1521124836513/emojis/1f6b6.png diff --git a/dist/v-1520418874500/emojis/1f6b7.png b/dist/v-1521124836513/emojis/1f6b7.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b7.png rename to dist/v-1521124836513/emojis/1f6b7.png diff --git a/dist/v-1520418874500/emojis/1f6b8.png b/dist/v-1521124836513/emojis/1f6b8.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b8.png rename to dist/v-1521124836513/emojis/1f6b8.png diff --git a/dist/v-1520418874500/emojis/1f6b9.png b/dist/v-1521124836513/emojis/1f6b9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6b9.png rename to dist/v-1521124836513/emojis/1f6b9.png diff --git a/dist/v-1520418874500/emojis/1f6ba.png b/dist/v-1521124836513/emojis/1f6ba.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ba.png rename to dist/v-1521124836513/emojis/1f6ba.png diff --git a/dist/v-1520418874500/emojis/1f6bb.png b/dist/v-1521124836513/emojis/1f6bb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6bb.png rename to dist/v-1521124836513/emojis/1f6bb.png diff --git a/dist/v-1520418874500/emojis/1f6bc.png b/dist/v-1521124836513/emojis/1f6bc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6bc.png rename to dist/v-1521124836513/emojis/1f6bc.png diff --git a/dist/v-1520418874500/emojis/1f6bd.png b/dist/v-1521124836513/emojis/1f6bd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6bd.png rename to dist/v-1521124836513/emojis/1f6bd.png diff --git a/dist/v-1520418874500/emojis/1f6be.png b/dist/v-1521124836513/emojis/1f6be.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6be.png rename to dist/v-1521124836513/emojis/1f6be.png diff --git a/dist/v-1520418874500/emojis/1f6bf.png b/dist/v-1521124836513/emojis/1f6bf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6bf.png rename to dist/v-1521124836513/emojis/1f6bf.png diff --git a/dist/v-1520418874500/emojis/1f6c0.png b/dist/v-1521124836513/emojis/1f6c0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6c0.png rename to dist/v-1521124836513/emojis/1f6c0.png diff --git a/dist/v-1520418874500/emojis/1f6c1.png b/dist/v-1521124836513/emojis/1f6c1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6c1.png rename to dist/v-1521124836513/emojis/1f6c1.png diff --git a/dist/v-1520418874500/emojis/1f6c2.png b/dist/v-1521124836513/emojis/1f6c2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6c2.png rename to dist/v-1521124836513/emojis/1f6c2.png diff --git a/dist/v-1520418874500/emojis/1f6c3.png b/dist/v-1521124836513/emojis/1f6c3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6c3.png rename to dist/v-1521124836513/emojis/1f6c3.png diff --git a/dist/v-1520418874500/emojis/1f6c4.png b/dist/v-1521124836513/emojis/1f6c4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6c4.png rename to dist/v-1521124836513/emojis/1f6c4.png diff --git a/dist/v-1520418874500/emojis/1f6c5.png b/dist/v-1521124836513/emojis/1f6c5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6c5.png rename to dist/v-1521124836513/emojis/1f6c5.png diff --git a/dist/v-1520418874500/emojis/1f6cb.png b/dist/v-1521124836513/emojis/1f6cb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6cb.png rename to dist/v-1521124836513/emojis/1f6cb.png diff --git a/dist/v-1520418874500/emojis/1f6cc.png b/dist/v-1521124836513/emojis/1f6cc.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6cc.png rename to dist/v-1521124836513/emojis/1f6cc.png diff --git a/dist/v-1520418874500/emojis/1f6cd.png b/dist/v-1521124836513/emojis/1f6cd.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6cd.png rename to dist/v-1521124836513/emojis/1f6cd.png diff --git a/dist/v-1520418874500/emojis/1f6ce.png b/dist/v-1521124836513/emojis/1f6ce.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ce.png rename to dist/v-1521124836513/emojis/1f6ce.png diff --git a/dist/v-1520418874500/emojis/1f6cf.png b/dist/v-1521124836513/emojis/1f6cf.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6cf.png rename to dist/v-1521124836513/emojis/1f6cf.png diff --git a/dist/v-1520418874500/emojis/1f6d0.png b/dist/v-1521124836513/emojis/1f6d0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6d0.png rename to dist/v-1521124836513/emojis/1f6d0.png diff --git a/dist/v-1520418874500/emojis/1f6d1.png b/dist/v-1521124836513/emojis/1f6d1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6d1.png rename to dist/v-1521124836513/emojis/1f6d1.png diff --git a/dist/v-1520418874500/emojis/1f6d2.png b/dist/v-1521124836513/emojis/1f6d2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6d2.png rename to dist/v-1521124836513/emojis/1f6d2.png diff --git a/dist/v-1520418874500/emojis/1f6e0.png b/dist/v-1521124836513/emojis/1f6e0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e0.png rename to dist/v-1521124836513/emojis/1f6e0.png diff --git a/dist/v-1520418874500/emojis/1f6e1.png b/dist/v-1521124836513/emojis/1f6e1.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e1.png rename to dist/v-1521124836513/emojis/1f6e1.png diff --git a/dist/v-1520418874500/emojis/1f6e2.png b/dist/v-1521124836513/emojis/1f6e2.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e2.png rename to dist/v-1521124836513/emojis/1f6e2.png diff --git a/dist/v-1520418874500/emojis/1f6e3.png b/dist/v-1521124836513/emojis/1f6e3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e3.png rename to dist/v-1521124836513/emojis/1f6e3.png diff --git a/dist/v-1520418874500/emojis/1f6e4.png b/dist/v-1521124836513/emojis/1f6e4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e4.png rename to dist/v-1521124836513/emojis/1f6e4.png diff --git a/dist/v-1520418874500/emojis/1f6e5.png b/dist/v-1521124836513/emojis/1f6e5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e5.png rename to dist/v-1521124836513/emojis/1f6e5.png diff --git a/dist/v-1520418874500/emojis/1f6e9.png b/dist/v-1521124836513/emojis/1f6e9.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6e9.png rename to dist/v-1521124836513/emojis/1f6e9.png diff --git a/dist/v-1520418874500/emojis/1f6eb.png b/dist/v-1521124836513/emojis/1f6eb.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6eb.png rename to dist/v-1521124836513/emojis/1f6eb.png diff --git a/dist/v-1520418874500/emojis/1f6ec.png b/dist/v-1521124836513/emojis/1f6ec.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6ec.png rename to dist/v-1521124836513/emojis/1f6ec.png diff --git a/dist/v-1520418874500/emojis/1f6f0.png b/dist/v-1521124836513/emojis/1f6f0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6f0.png rename to dist/v-1521124836513/emojis/1f6f0.png diff --git a/dist/v-1520418874500/emojis/1f6f3.png b/dist/v-1521124836513/emojis/1f6f3.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6f3.png rename to dist/v-1521124836513/emojis/1f6f3.png diff --git a/dist/v-1520418874500/emojis/1f6f4.png b/dist/v-1521124836513/emojis/1f6f4.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6f4.png rename to dist/v-1521124836513/emojis/1f6f4.png diff --git a/dist/v-1520418874500/emojis/1f6f5.png b/dist/v-1521124836513/emojis/1f6f5.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6f5.png rename to dist/v-1521124836513/emojis/1f6f5.png diff --git a/dist/v-1520418874500/emojis/1f6f6.png b/dist/v-1521124836513/emojis/1f6f6.png similarity index 100% rename from dist/v-1520418874500/emojis/1f6f6.png rename to dist/v-1521124836513/emojis/1f6f6.png diff --git a/dist/v-1520418874500/emojis/1f910.png b/dist/v-1521124836513/emojis/1f910.png similarity index 100% rename from dist/v-1520418874500/emojis/1f910.png rename to dist/v-1521124836513/emojis/1f910.png diff --git a/dist/v-1520418874500/emojis/1f911.png b/dist/v-1521124836513/emojis/1f911.png similarity index 100% rename from dist/v-1520418874500/emojis/1f911.png rename to dist/v-1521124836513/emojis/1f911.png diff --git a/dist/v-1520418874500/emojis/1f912.png b/dist/v-1521124836513/emojis/1f912.png similarity index 100% rename from dist/v-1520418874500/emojis/1f912.png rename to dist/v-1521124836513/emojis/1f912.png diff --git a/dist/v-1520418874500/emojis/1f913.png b/dist/v-1521124836513/emojis/1f913.png similarity index 100% rename from dist/v-1520418874500/emojis/1f913.png rename to dist/v-1521124836513/emojis/1f913.png diff --git a/dist/v-1520418874500/emojis/1f914.png b/dist/v-1521124836513/emojis/1f914.png similarity index 100% rename from dist/v-1520418874500/emojis/1f914.png rename to dist/v-1521124836513/emojis/1f914.png diff --git a/dist/v-1520418874500/emojis/1f915.png b/dist/v-1521124836513/emojis/1f915.png similarity index 100% rename from dist/v-1520418874500/emojis/1f915.png rename to dist/v-1521124836513/emojis/1f915.png diff --git a/dist/v-1520418874500/emojis/1f916.png b/dist/v-1521124836513/emojis/1f916.png similarity index 100% rename from dist/v-1520418874500/emojis/1f916.png rename to dist/v-1521124836513/emojis/1f916.png diff --git a/dist/v-1520418874500/emojis/1f917.png b/dist/v-1521124836513/emojis/1f917.png similarity index 100% rename from dist/v-1520418874500/emojis/1f917.png rename to dist/v-1521124836513/emojis/1f917.png diff --git a/dist/v-1520418874500/emojis/1f918.png b/dist/v-1521124836513/emojis/1f918.png similarity index 100% rename from dist/v-1520418874500/emojis/1f918.png rename to dist/v-1521124836513/emojis/1f918.png diff --git a/dist/v-1520418874500/emojis/1f919.png b/dist/v-1521124836513/emojis/1f919.png similarity index 100% rename from dist/v-1520418874500/emojis/1f919.png rename to dist/v-1521124836513/emojis/1f919.png diff --git a/dist/v-1520418874500/emojis/1f91a.png b/dist/v-1521124836513/emojis/1f91a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f91a.png rename to dist/v-1521124836513/emojis/1f91a.png diff --git a/dist/v-1520418874500/emojis/1f91b.png b/dist/v-1521124836513/emojis/1f91b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f91b.png rename to dist/v-1521124836513/emojis/1f91b.png diff --git a/dist/v-1520418874500/emojis/1f91c.png b/dist/v-1521124836513/emojis/1f91c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f91c.png rename to dist/v-1521124836513/emojis/1f91c.png diff --git a/dist/v-1520418874500/emojis/1f91d.png b/dist/v-1521124836513/emojis/1f91d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f91d.png rename to dist/v-1521124836513/emojis/1f91d.png diff --git a/dist/v-1520418874500/emojis/1f91e.png b/dist/v-1521124836513/emojis/1f91e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f91e.png rename to dist/v-1521124836513/emojis/1f91e.png diff --git a/dist/v-1520418874500/emojis/1f920.png b/dist/v-1521124836513/emojis/1f920.png similarity index 100% rename from dist/v-1520418874500/emojis/1f920.png rename to dist/v-1521124836513/emojis/1f920.png diff --git a/dist/v-1520418874500/emojis/1f921.png b/dist/v-1521124836513/emojis/1f921.png similarity index 100% rename from dist/v-1520418874500/emojis/1f921.png rename to dist/v-1521124836513/emojis/1f921.png diff --git a/dist/v-1520418874500/emojis/1f922.png b/dist/v-1521124836513/emojis/1f922.png similarity index 100% rename from dist/v-1520418874500/emojis/1f922.png rename to dist/v-1521124836513/emojis/1f922.png diff --git a/dist/v-1520418874500/emojis/1f923.png b/dist/v-1521124836513/emojis/1f923.png similarity index 100% rename from dist/v-1520418874500/emojis/1f923.png rename to dist/v-1521124836513/emojis/1f923.png diff --git a/dist/v-1520418874500/emojis/1f924.png b/dist/v-1521124836513/emojis/1f924.png similarity index 100% rename from dist/v-1520418874500/emojis/1f924.png rename to dist/v-1521124836513/emojis/1f924.png diff --git a/dist/v-1520418874500/emojis/1f925.png b/dist/v-1521124836513/emojis/1f925.png similarity index 100% rename from dist/v-1520418874500/emojis/1f925.png rename to dist/v-1521124836513/emojis/1f925.png diff --git a/dist/v-1520418874500/emojis/1f926-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f926-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f926-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f926-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f926-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f926-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f926-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f926-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f926.png b/dist/v-1521124836513/emojis/1f926.png similarity index 100% rename from dist/v-1520418874500/emojis/1f926.png rename to dist/v-1521124836513/emojis/1f926.png diff --git a/dist/v-1520418874500/emojis/1f927.png b/dist/v-1521124836513/emojis/1f927.png similarity index 100% rename from dist/v-1520418874500/emojis/1f927.png rename to dist/v-1521124836513/emojis/1f927.png diff --git a/dist/v-1520418874500/emojis/1f930.png b/dist/v-1521124836513/emojis/1f930.png similarity index 100% rename from dist/v-1520418874500/emojis/1f930.png rename to dist/v-1521124836513/emojis/1f930.png diff --git a/dist/v-1520418874500/emojis/1f933.png b/dist/v-1521124836513/emojis/1f933.png similarity index 100% rename from dist/v-1520418874500/emojis/1f933.png rename to dist/v-1521124836513/emojis/1f933.png diff --git a/dist/v-1520418874500/emojis/1f934.png b/dist/v-1521124836513/emojis/1f934.png similarity index 100% rename from dist/v-1520418874500/emojis/1f934.png rename to dist/v-1521124836513/emojis/1f934.png diff --git a/dist/v-1520418874500/emojis/1f935.png b/dist/v-1521124836513/emojis/1f935.png similarity index 100% rename from dist/v-1520418874500/emojis/1f935.png rename to dist/v-1521124836513/emojis/1f935.png diff --git a/dist/v-1520418874500/emojis/1f936.png b/dist/v-1521124836513/emojis/1f936.png similarity index 100% rename from dist/v-1520418874500/emojis/1f936.png rename to dist/v-1521124836513/emojis/1f936.png diff --git a/dist/v-1520418874500/emojis/1f937-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f937-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f937-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f937-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f937-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f937-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f937-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f937-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f937.png b/dist/v-1521124836513/emojis/1f937.png similarity index 100% rename from dist/v-1520418874500/emojis/1f937.png rename to dist/v-1521124836513/emojis/1f937.png diff --git a/dist/v-1520418874500/emojis/1f938-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f938-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f938-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f938-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f938-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f938-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f938-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f938-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f938.png b/dist/v-1521124836513/emojis/1f938.png similarity index 100% rename from dist/v-1520418874500/emojis/1f938.png rename to dist/v-1521124836513/emojis/1f938.png diff --git a/dist/v-1520418874500/emojis/1f939-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f939-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f939-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f939-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f939-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f939-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f939-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f939-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f939.png b/dist/v-1521124836513/emojis/1f939.png similarity index 100% rename from dist/v-1520418874500/emojis/1f939.png rename to dist/v-1521124836513/emojis/1f939.png diff --git a/dist/v-1520418874500/emojis/1f93a.png b/dist/v-1521124836513/emojis/1f93a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93a.png rename to dist/v-1521124836513/emojis/1f93a.png diff --git a/dist/v-1520418874500/emojis/1f93c-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f93c-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93c-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f93c-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f93c-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f93c-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93c-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f93c-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f93c.png b/dist/v-1521124836513/emojis/1f93c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93c.png rename to dist/v-1521124836513/emojis/1f93c.png diff --git a/dist/v-1520418874500/emojis/1f93d-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f93d-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93d-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f93d-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f93d-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f93d-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93d-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f93d-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f93d.png b/dist/v-1521124836513/emojis/1f93d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93d.png rename to dist/v-1521124836513/emojis/1f93d.png diff --git a/dist/v-1520418874500/emojis/1f93e-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/1f93e-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93e-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/1f93e-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f93e-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/1f93e-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93e-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/1f93e-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/1f93e.png b/dist/v-1521124836513/emojis/1f93e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f93e.png rename to dist/v-1521124836513/emojis/1f93e.png diff --git a/dist/v-1520418874500/emojis/1f940.png b/dist/v-1521124836513/emojis/1f940.png similarity index 100% rename from dist/v-1520418874500/emojis/1f940.png rename to dist/v-1521124836513/emojis/1f940.png diff --git a/dist/v-1520418874500/emojis/1f941.png b/dist/v-1521124836513/emojis/1f941.png similarity index 100% rename from dist/v-1520418874500/emojis/1f941.png rename to dist/v-1521124836513/emojis/1f941.png diff --git a/dist/v-1520418874500/emojis/1f942.png b/dist/v-1521124836513/emojis/1f942.png similarity index 100% rename from dist/v-1520418874500/emojis/1f942.png rename to dist/v-1521124836513/emojis/1f942.png diff --git a/dist/v-1520418874500/emojis/1f943.png b/dist/v-1521124836513/emojis/1f943.png similarity index 100% rename from dist/v-1520418874500/emojis/1f943.png rename to dist/v-1521124836513/emojis/1f943.png diff --git a/dist/v-1520418874500/emojis/1f944.png b/dist/v-1521124836513/emojis/1f944.png similarity index 100% rename from dist/v-1520418874500/emojis/1f944.png rename to dist/v-1521124836513/emojis/1f944.png diff --git a/dist/v-1520418874500/emojis/1f945.png b/dist/v-1521124836513/emojis/1f945.png similarity index 100% rename from dist/v-1520418874500/emojis/1f945.png rename to dist/v-1521124836513/emojis/1f945.png diff --git a/dist/v-1520418874500/emojis/1f947.png b/dist/v-1521124836513/emojis/1f947.png similarity index 100% rename from dist/v-1520418874500/emojis/1f947.png rename to dist/v-1521124836513/emojis/1f947.png diff --git a/dist/v-1520418874500/emojis/1f948.png b/dist/v-1521124836513/emojis/1f948.png similarity index 100% rename from dist/v-1520418874500/emojis/1f948.png rename to dist/v-1521124836513/emojis/1f948.png diff --git a/dist/v-1520418874500/emojis/1f949.png b/dist/v-1521124836513/emojis/1f949.png similarity index 100% rename from dist/v-1520418874500/emojis/1f949.png rename to dist/v-1521124836513/emojis/1f949.png diff --git a/dist/v-1520418874500/emojis/1f94a.png b/dist/v-1521124836513/emojis/1f94a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f94a.png rename to dist/v-1521124836513/emojis/1f94a.png diff --git a/dist/v-1520418874500/emojis/1f94b.png b/dist/v-1521124836513/emojis/1f94b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f94b.png rename to dist/v-1521124836513/emojis/1f94b.png diff --git a/dist/v-1520418874500/emojis/1f950.png b/dist/v-1521124836513/emojis/1f950.png similarity index 100% rename from dist/v-1520418874500/emojis/1f950.png rename to dist/v-1521124836513/emojis/1f950.png diff --git a/dist/v-1520418874500/emojis/1f951.png b/dist/v-1521124836513/emojis/1f951.png similarity index 100% rename from dist/v-1520418874500/emojis/1f951.png rename to dist/v-1521124836513/emojis/1f951.png diff --git a/dist/v-1520418874500/emojis/1f952.png b/dist/v-1521124836513/emojis/1f952.png similarity index 100% rename from dist/v-1520418874500/emojis/1f952.png rename to dist/v-1521124836513/emojis/1f952.png diff --git a/dist/v-1520418874500/emojis/1f953.png b/dist/v-1521124836513/emojis/1f953.png similarity index 100% rename from dist/v-1520418874500/emojis/1f953.png rename to dist/v-1521124836513/emojis/1f953.png diff --git a/dist/v-1520418874500/emojis/1f954.png b/dist/v-1521124836513/emojis/1f954.png similarity index 100% rename from dist/v-1520418874500/emojis/1f954.png rename to dist/v-1521124836513/emojis/1f954.png diff --git a/dist/v-1520418874500/emojis/1f955.png b/dist/v-1521124836513/emojis/1f955.png similarity index 100% rename from dist/v-1520418874500/emojis/1f955.png rename to dist/v-1521124836513/emojis/1f955.png diff --git a/dist/v-1520418874500/emojis/1f956.png b/dist/v-1521124836513/emojis/1f956.png similarity index 100% rename from dist/v-1520418874500/emojis/1f956.png rename to dist/v-1521124836513/emojis/1f956.png diff --git a/dist/v-1520418874500/emojis/1f957.png b/dist/v-1521124836513/emojis/1f957.png similarity index 100% rename from dist/v-1520418874500/emojis/1f957.png rename to dist/v-1521124836513/emojis/1f957.png diff --git a/dist/v-1520418874500/emojis/1f958.png b/dist/v-1521124836513/emojis/1f958.png similarity index 100% rename from dist/v-1520418874500/emojis/1f958.png rename to dist/v-1521124836513/emojis/1f958.png diff --git a/dist/v-1520418874500/emojis/1f959.png b/dist/v-1521124836513/emojis/1f959.png similarity index 100% rename from dist/v-1520418874500/emojis/1f959.png rename to dist/v-1521124836513/emojis/1f959.png diff --git a/dist/v-1520418874500/emojis/1f95a.png b/dist/v-1521124836513/emojis/1f95a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f95a.png rename to dist/v-1521124836513/emojis/1f95a.png diff --git a/dist/v-1520418874500/emojis/1f95b.png b/dist/v-1521124836513/emojis/1f95b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f95b.png rename to dist/v-1521124836513/emojis/1f95b.png diff --git a/dist/v-1520418874500/emojis/1f95c.png b/dist/v-1521124836513/emojis/1f95c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f95c.png rename to dist/v-1521124836513/emojis/1f95c.png diff --git a/dist/v-1520418874500/emojis/1f95d.png b/dist/v-1521124836513/emojis/1f95d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f95d.png rename to dist/v-1521124836513/emojis/1f95d.png diff --git a/dist/v-1520418874500/emojis/1f95e.png b/dist/v-1521124836513/emojis/1f95e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f95e.png rename to dist/v-1521124836513/emojis/1f95e.png diff --git a/dist/v-1520418874500/emojis/1f980.png b/dist/v-1521124836513/emojis/1f980.png similarity index 100% rename from dist/v-1520418874500/emojis/1f980.png rename to dist/v-1521124836513/emojis/1f980.png diff --git a/dist/v-1520418874500/emojis/1f981.png b/dist/v-1521124836513/emojis/1f981.png similarity index 100% rename from dist/v-1520418874500/emojis/1f981.png rename to dist/v-1521124836513/emojis/1f981.png diff --git a/dist/v-1520418874500/emojis/1f982.png b/dist/v-1521124836513/emojis/1f982.png similarity index 100% rename from dist/v-1520418874500/emojis/1f982.png rename to dist/v-1521124836513/emojis/1f982.png diff --git a/dist/v-1520418874500/emojis/1f983.png b/dist/v-1521124836513/emojis/1f983.png similarity index 100% rename from dist/v-1520418874500/emojis/1f983.png rename to dist/v-1521124836513/emojis/1f983.png diff --git a/dist/v-1520418874500/emojis/1f984.png b/dist/v-1521124836513/emojis/1f984.png similarity index 100% rename from dist/v-1520418874500/emojis/1f984.png rename to dist/v-1521124836513/emojis/1f984.png diff --git a/dist/v-1520418874500/emojis/1f985.png b/dist/v-1521124836513/emojis/1f985.png similarity index 100% rename from dist/v-1520418874500/emojis/1f985.png rename to dist/v-1521124836513/emojis/1f985.png diff --git a/dist/v-1520418874500/emojis/1f986.png b/dist/v-1521124836513/emojis/1f986.png similarity index 100% rename from dist/v-1520418874500/emojis/1f986.png rename to dist/v-1521124836513/emojis/1f986.png diff --git a/dist/v-1520418874500/emojis/1f987.png b/dist/v-1521124836513/emojis/1f987.png similarity index 100% rename from dist/v-1520418874500/emojis/1f987.png rename to dist/v-1521124836513/emojis/1f987.png diff --git a/dist/v-1520418874500/emojis/1f988.png b/dist/v-1521124836513/emojis/1f988.png similarity index 100% rename from dist/v-1520418874500/emojis/1f988.png rename to dist/v-1521124836513/emojis/1f988.png diff --git a/dist/v-1520418874500/emojis/1f989.png b/dist/v-1521124836513/emojis/1f989.png similarity index 100% rename from dist/v-1520418874500/emojis/1f989.png rename to dist/v-1521124836513/emojis/1f989.png diff --git a/dist/v-1520418874500/emojis/1f98a.png b/dist/v-1521124836513/emojis/1f98a.png similarity index 100% rename from dist/v-1520418874500/emojis/1f98a.png rename to dist/v-1521124836513/emojis/1f98a.png diff --git a/dist/v-1520418874500/emojis/1f98b.png b/dist/v-1521124836513/emojis/1f98b.png similarity index 100% rename from dist/v-1520418874500/emojis/1f98b.png rename to dist/v-1521124836513/emojis/1f98b.png diff --git a/dist/v-1520418874500/emojis/1f98c.png b/dist/v-1521124836513/emojis/1f98c.png similarity index 100% rename from dist/v-1520418874500/emojis/1f98c.png rename to dist/v-1521124836513/emojis/1f98c.png diff --git a/dist/v-1520418874500/emojis/1f98d.png b/dist/v-1521124836513/emojis/1f98d.png similarity index 100% rename from dist/v-1520418874500/emojis/1f98d.png rename to dist/v-1521124836513/emojis/1f98d.png diff --git a/dist/v-1520418874500/emojis/1f98e.png b/dist/v-1521124836513/emojis/1f98e.png similarity index 100% rename from dist/v-1520418874500/emojis/1f98e.png rename to dist/v-1521124836513/emojis/1f98e.png diff --git a/dist/v-1520418874500/emojis/1f98f.png b/dist/v-1521124836513/emojis/1f98f.png similarity index 100% rename from dist/v-1520418874500/emojis/1f98f.png rename to dist/v-1521124836513/emojis/1f98f.png diff --git a/dist/v-1520418874500/emojis/1f990.png b/dist/v-1521124836513/emojis/1f990.png similarity index 100% rename from dist/v-1520418874500/emojis/1f990.png rename to dist/v-1521124836513/emojis/1f990.png diff --git a/dist/v-1520418874500/emojis/1f991.png b/dist/v-1521124836513/emojis/1f991.png similarity index 100% rename from dist/v-1520418874500/emojis/1f991.png rename to dist/v-1521124836513/emojis/1f991.png diff --git a/dist/v-1520418874500/emojis/1f9c0.png b/dist/v-1521124836513/emojis/1f9c0.png similarity index 100% rename from dist/v-1520418874500/emojis/1f9c0.png rename to dist/v-1521124836513/emojis/1f9c0.png diff --git a/dist/v-1520418874500/emojis/203c.png b/dist/v-1521124836513/emojis/203c.png similarity index 100% rename from dist/v-1520418874500/emojis/203c.png rename to dist/v-1521124836513/emojis/203c.png diff --git a/dist/v-1520418874500/emojis/2049.png b/dist/v-1521124836513/emojis/2049.png similarity index 100% rename from dist/v-1520418874500/emojis/2049.png rename to dist/v-1521124836513/emojis/2049.png diff --git a/dist/v-1520418874500/emojis/2122.png b/dist/v-1521124836513/emojis/2122.png similarity index 100% rename from dist/v-1520418874500/emojis/2122.png rename to dist/v-1521124836513/emojis/2122.png diff --git a/dist/v-1520418874500/emojis/2139.png b/dist/v-1521124836513/emojis/2139.png similarity index 100% rename from dist/v-1520418874500/emojis/2139.png rename to dist/v-1521124836513/emojis/2139.png diff --git a/dist/v-1520418874500/emojis/2194.png b/dist/v-1521124836513/emojis/2194.png similarity index 100% rename from dist/v-1520418874500/emojis/2194.png rename to dist/v-1521124836513/emojis/2194.png diff --git a/dist/v-1520418874500/emojis/2195.png b/dist/v-1521124836513/emojis/2195.png similarity index 100% rename from dist/v-1520418874500/emojis/2195.png rename to dist/v-1521124836513/emojis/2195.png diff --git a/dist/v-1520418874500/emojis/2196.png b/dist/v-1521124836513/emojis/2196.png similarity index 100% rename from dist/v-1520418874500/emojis/2196.png rename to dist/v-1521124836513/emojis/2196.png diff --git a/dist/v-1520418874500/emojis/2197.png b/dist/v-1521124836513/emojis/2197.png similarity index 100% rename from dist/v-1520418874500/emojis/2197.png rename to dist/v-1521124836513/emojis/2197.png diff --git a/dist/v-1520418874500/emojis/2198.png b/dist/v-1521124836513/emojis/2198.png similarity index 100% rename from dist/v-1520418874500/emojis/2198.png rename to dist/v-1521124836513/emojis/2198.png diff --git a/dist/v-1520418874500/emojis/2199.png b/dist/v-1521124836513/emojis/2199.png similarity index 100% rename from dist/v-1520418874500/emojis/2199.png rename to dist/v-1521124836513/emojis/2199.png diff --git a/dist/v-1520418874500/emojis/21a9.png b/dist/v-1521124836513/emojis/21a9.png similarity index 100% rename from dist/v-1520418874500/emojis/21a9.png rename to dist/v-1521124836513/emojis/21a9.png diff --git a/dist/v-1520418874500/emojis/21aa.png b/dist/v-1521124836513/emojis/21aa.png similarity index 100% rename from dist/v-1520418874500/emojis/21aa.png rename to dist/v-1521124836513/emojis/21aa.png diff --git a/dist/v-1520418874500/emojis/231a.png b/dist/v-1521124836513/emojis/231a.png similarity index 100% rename from dist/v-1520418874500/emojis/231a.png rename to dist/v-1521124836513/emojis/231a.png diff --git a/dist/v-1520418874500/emojis/231b.png b/dist/v-1521124836513/emojis/231b.png similarity index 100% rename from dist/v-1520418874500/emojis/231b.png rename to dist/v-1521124836513/emojis/231b.png diff --git a/dist/v-1520418874500/emojis/2328.png b/dist/v-1521124836513/emojis/2328.png similarity index 100% rename from dist/v-1520418874500/emojis/2328.png rename to dist/v-1521124836513/emojis/2328.png diff --git a/dist/v-1520418874500/emojis/23cf.png b/dist/v-1521124836513/emojis/23cf.png similarity index 100% rename from dist/v-1520418874500/emojis/23cf.png rename to dist/v-1521124836513/emojis/23cf.png diff --git a/dist/v-1520418874500/emojis/23e9.png b/dist/v-1521124836513/emojis/23e9.png similarity index 100% rename from dist/v-1520418874500/emojis/23e9.png rename to dist/v-1521124836513/emojis/23e9.png diff --git a/dist/v-1520418874500/emojis/23ea.png b/dist/v-1521124836513/emojis/23ea.png similarity index 100% rename from dist/v-1520418874500/emojis/23ea.png rename to dist/v-1521124836513/emojis/23ea.png diff --git a/dist/v-1520418874500/emojis/23eb.png b/dist/v-1521124836513/emojis/23eb.png similarity index 100% rename from dist/v-1520418874500/emojis/23eb.png rename to dist/v-1521124836513/emojis/23eb.png diff --git a/dist/v-1520418874500/emojis/23ec.png b/dist/v-1521124836513/emojis/23ec.png similarity index 100% rename from dist/v-1520418874500/emojis/23ec.png rename to dist/v-1521124836513/emojis/23ec.png diff --git a/dist/v-1520418874500/emojis/23ed.png b/dist/v-1521124836513/emojis/23ed.png similarity index 100% rename from dist/v-1520418874500/emojis/23ed.png rename to dist/v-1521124836513/emojis/23ed.png diff --git a/dist/v-1520418874500/emojis/23ee.png b/dist/v-1521124836513/emojis/23ee.png similarity index 100% rename from dist/v-1520418874500/emojis/23ee.png rename to dist/v-1521124836513/emojis/23ee.png diff --git a/dist/v-1520418874500/emojis/23ef.png b/dist/v-1521124836513/emojis/23ef.png similarity index 100% rename from dist/v-1520418874500/emojis/23ef.png rename to dist/v-1521124836513/emojis/23ef.png diff --git a/dist/v-1520418874500/emojis/23f0.png b/dist/v-1521124836513/emojis/23f0.png similarity index 100% rename from dist/v-1520418874500/emojis/23f0.png rename to dist/v-1521124836513/emojis/23f0.png diff --git a/dist/v-1520418874500/emojis/23f1.png b/dist/v-1521124836513/emojis/23f1.png similarity index 100% rename from dist/v-1520418874500/emojis/23f1.png rename to dist/v-1521124836513/emojis/23f1.png diff --git a/dist/v-1520418874500/emojis/23f2.png b/dist/v-1521124836513/emojis/23f2.png similarity index 100% rename from dist/v-1520418874500/emojis/23f2.png rename to dist/v-1521124836513/emojis/23f2.png diff --git a/dist/v-1520418874500/emojis/23f3.png b/dist/v-1521124836513/emojis/23f3.png similarity index 100% rename from dist/v-1520418874500/emojis/23f3.png rename to dist/v-1521124836513/emojis/23f3.png diff --git a/dist/v-1520418874500/emojis/23f8.png b/dist/v-1521124836513/emojis/23f8.png similarity index 100% rename from dist/v-1520418874500/emojis/23f8.png rename to dist/v-1521124836513/emojis/23f8.png diff --git a/dist/v-1520418874500/emojis/23f9.png b/dist/v-1521124836513/emojis/23f9.png similarity index 100% rename from dist/v-1520418874500/emojis/23f9.png rename to dist/v-1521124836513/emojis/23f9.png diff --git a/dist/v-1520418874500/emojis/23fa.png b/dist/v-1521124836513/emojis/23fa.png similarity index 100% rename from dist/v-1520418874500/emojis/23fa.png rename to dist/v-1521124836513/emojis/23fa.png diff --git a/dist/v-1520418874500/emojis/24c2.png b/dist/v-1521124836513/emojis/24c2.png similarity index 100% rename from dist/v-1520418874500/emojis/24c2.png rename to dist/v-1521124836513/emojis/24c2.png diff --git a/dist/v-1520418874500/emojis/25aa.png b/dist/v-1521124836513/emojis/25aa.png similarity index 100% rename from dist/v-1520418874500/emojis/25aa.png rename to dist/v-1521124836513/emojis/25aa.png diff --git a/dist/v-1520418874500/emojis/25ab.png b/dist/v-1521124836513/emojis/25ab.png similarity index 100% rename from dist/v-1520418874500/emojis/25ab.png rename to dist/v-1521124836513/emojis/25ab.png diff --git a/dist/v-1520418874500/emojis/25b6.png b/dist/v-1521124836513/emojis/25b6.png similarity index 100% rename from dist/v-1520418874500/emojis/25b6.png rename to dist/v-1521124836513/emojis/25b6.png diff --git a/dist/v-1520418874500/emojis/25c0.png b/dist/v-1521124836513/emojis/25c0.png similarity index 100% rename from dist/v-1520418874500/emojis/25c0.png rename to dist/v-1521124836513/emojis/25c0.png diff --git a/dist/v-1520418874500/emojis/25fb.png b/dist/v-1521124836513/emojis/25fb.png similarity index 100% rename from dist/v-1520418874500/emojis/25fb.png rename to dist/v-1521124836513/emojis/25fb.png diff --git a/dist/v-1520418874500/emojis/25fc.png b/dist/v-1521124836513/emojis/25fc.png similarity index 100% rename from dist/v-1520418874500/emojis/25fc.png rename to dist/v-1521124836513/emojis/25fc.png diff --git a/dist/v-1520418874500/emojis/25fd.png b/dist/v-1521124836513/emojis/25fd.png similarity index 100% rename from dist/v-1520418874500/emojis/25fd.png rename to dist/v-1521124836513/emojis/25fd.png diff --git a/dist/v-1520418874500/emojis/25fe.png b/dist/v-1521124836513/emojis/25fe.png similarity index 100% rename from dist/v-1520418874500/emojis/25fe.png rename to dist/v-1521124836513/emojis/25fe.png diff --git a/dist/v-1520418874500/emojis/2600.png b/dist/v-1521124836513/emojis/2600.png similarity index 100% rename from dist/v-1520418874500/emojis/2600.png rename to dist/v-1521124836513/emojis/2600.png diff --git a/dist/v-1520418874500/emojis/2601.png b/dist/v-1521124836513/emojis/2601.png similarity index 100% rename from dist/v-1520418874500/emojis/2601.png rename to dist/v-1521124836513/emojis/2601.png diff --git a/dist/v-1520418874500/emojis/2602.png b/dist/v-1521124836513/emojis/2602.png similarity index 100% rename from dist/v-1520418874500/emojis/2602.png rename to dist/v-1521124836513/emojis/2602.png diff --git a/dist/v-1520418874500/emojis/2603.png b/dist/v-1521124836513/emojis/2603.png similarity index 100% rename from dist/v-1520418874500/emojis/2603.png rename to dist/v-1521124836513/emojis/2603.png diff --git a/dist/v-1520418874500/emojis/2604.png b/dist/v-1521124836513/emojis/2604.png similarity index 100% rename from dist/v-1520418874500/emojis/2604.png rename to dist/v-1521124836513/emojis/2604.png diff --git a/dist/v-1520418874500/emojis/260e.png b/dist/v-1521124836513/emojis/260e.png similarity index 100% rename from dist/v-1520418874500/emojis/260e.png rename to dist/v-1521124836513/emojis/260e.png diff --git a/dist/v-1520418874500/emojis/2611.png b/dist/v-1521124836513/emojis/2611.png similarity index 100% rename from dist/v-1520418874500/emojis/2611.png rename to dist/v-1521124836513/emojis/2611.png diff --git a/dist/v-1520418874500/emojis/2614.png b/dist/v-1521124836513/emojis/2614.png similarity index 100% rename from dist/v-1520418874500/emojis/2614.png rename to dist/v-1521124836513/emojis/2614.png diff --git a/dist/v-1520418874500/emojis/2615.png b/dist/v-1521124836513/emojis/2615.png similarity index 100% rename from dist/v-1520418874500/emojis/2615.png rename to dist/v-1521124836513/emojis/2615.png diff --git a/dist/v-1520418874500/emojis/2618.png b/dist/v-1521124836513/emojis/2618.png similarity index 100% rename from dist/v-1520418874500/emojis/2618.png rename to dist/v-1521124836513/emojis/2618.png diff --git a/dist/v-1520418874500/emojis/261d.png b/dist/v-1521124836513/emojis/261d.png similarity index 100% rename from dist/v-1520418874500/emojis/261d.png rename to dist/v-1521124836513/emojis/261d.png diff --git a/dist/v-1520418874500/emojis/2620.png b/dist/v-1521124836513/emojis/2620.png similarity index 100% rename from dist/v-1520418874500/emojis/2620.png rename to dist/v-1521124836513/emojis/2620.png diff --git a/dist/v-1520418874500/emojis/2622.png b/dist/v-1521124836513/emojis/2622.png similarity index 100% rename from dist/v-1520418874500/emojis/2622.png rename to dist/v-1521124836513/emojis/2622.png diff --git a/dist/v-1520418874500/emojis/2623.png b/dist/v-1521124836513/emojis/2623.png similarity index 100% rename from dist/v-1520418874500/emojis/2623.png rename to dist/v-1521124836513/emojis/2623.png diff --git a/dist/v-1520418874500/emojis/2626.png b/dist/v-1521124836513/emojis/2626.png similarity index 100% rename from dist/v-1520418874500/emojis/2626.png rename to dist/v-1521124836513/emojis/2626.png diff --git a/dist/v-1520418874500/emojis/262a.png b/dist/v-1521124836513/emojis/262a.png similarity index 100% rename from dist/v-1520418874500/emojis/262a.png rename to dist/v-1521124836513/emojis/262a.png diff --git a/dist/v-1520418874500/emojis/262e.png b/dist/v-1521124836513/emojis/262e.png similarity index 100% rename from dist/v-1520418874500/emojis/262e.png rename to dist/v-1521124836513/emojis/262e.png diff --git a/dist/v-1520418874500/emojis/262f.png b/dist/v-1521124836513/emojis/262f.png similarity index 100% rename from dist/v-1520418874500/emojis/262f.png rename to dist/v-1521124836513/emojis/262f.png diff --git a/dist/v-1520418874500/emojis/2638.png b/dist/v-1521124836513/emojis/2638.png similarity index 100% rename from dist/v-1520418874500/emojis/2638.png rename to dist/v-1521124836513/emojis/2638.png diff --git a/dist/v-1520418874500/emojis/2639.png b/dist/v-1521124836513/emojis/2639.png similarity index 100% rename from dist/v-1520418874500/emojis/2639.png rename to dist/v-1521124836513/emojis/2639.png diff --git a/dist/v-1520418874500/emojis/263a.png b/dist/v-1521124836513/emojis/263a.png similarity index 100% rename from dist/v-1520418874500/emojis/263a.png rename to dist/v-1521124836513/emojis/263a.png diff --git a/dist/v-1520418874500/emojis/2640.png b/dist/v-1521124836513/emojis/2640.png similarity index 100% rename from dist/v-1520418874500/emojis/2640.png rename to dist/v-1521124836513/emojis/2640.png diff --git a/dist/v-1520418874500/emojis/2642.png b/dist/v-1521124836513/emojis/2642.png similarity index 100% rename from dist/v-1520418874500/emojis/2642.png rename to dist/v-1521124836513/emojis/2642.png diff --git a/dist/v-1520418874500/emojis/2648.png b/dist/v-1521124836513/emojis/2648.png similarity index 100% rename from dist/v-1520418874500/emojis/2648.png rename to dist/v-1521124836513/emojis/2648.png diff --git a/dist/v-1520418874500/emojis/2649.png b/dist/v-1521124836513/emojis/2649.png similarity index 100% rename from dist/v-1520418874500/emojis/2649.png rename to dist/v-1521124836513/emojis/2649.png diff --git a/dist/v-1520418874500/emojis/264a.png b/dist/v-1521124836513/emojis/264a.png similarity index 100% rename from dist/v-1520418874500/emojis/264a.png rename to dist/v-1521124836513/emojis/264a.png diff --git a/dist/v-1520418874500/emojis/264b.png b/dist/v-1521124836513/emojis/264b.png similarity index 100% rename from dist/v-1520418874500/emojis/264b.png rename to dist/v-1521124836513/emojis/264b.png diff --git a/dist/v-1520418874500/emojis/264c.png b/dist/v-1521124836513/emojis/264c.png similarity index 100% rename from dist/v-1520418874500/emojis/264c.png rename to dist/v-1521124836513/emojis/264c.png diff --git a/dist/v-1520418874500/emojis/264d.png b/dist/v-1521124836513/emojis/264d.png similarity index 100% rename from dist/v-1520418874500/emojis/264d.png rename to dist/v-1521124836513/emojis/264d.png diff --git a/dist/v-1520418874500/emojis/264e.png b/dist/v-1521124836513/emojis/264e.png similarity index 100% rename from dist/v-1520418874500/emojis/264e.png rename to dist/v-1521124836513/emojis/264e.png diff --git a/dist/v-1520418874500/emojis/264f.png b/dist/v-1521124836513/emojis/264f.png similarity index 100% rename from dist/v-1520418874500/emojis/264f.png rename to dist/v-1521124836513/emojis/264f.png diff --git a/dist/v-1520418874500/emojis/2650.png b/dist/v-1521124836513/emojis/2650.png similarity index 100% rename from dist/v-1520418874500/emojis/2650.png rename to dist/v-1521124836513/emojis/2650.png diff --git a/dist/v-1520418874500/emojis/2651.png b/dist/v-1521124836513/emojis/2651.png similarity index 100% rename from dist/v-1520418874500/emojis/2651.png rename to dist/v-1521124836513/emojis/2651.png diff --git a/dist/v-1520418874500/emojis/2652.png b/dist/v-1521124836513/emojis/2652.png similarity index 100% rename from dist/v-1520418874500/emojis/2652.png rename to dist/v-1521124836513/emojis/2652.png diff --git a/dist/v-1520418874500/emojis/2653.png b/dist/v-1521124836513/emojis/2653.png similarity index 100% rename from dist/v-1520418874500/emojis/2653.png rename to dist/v-1521124836513/emojis/2653.png diff --git a/dist/v-1520418874500/emojis/2660.png b/dist/v-1521124836513/emojis/2660.png similarity index 100% rename from dist/v-1520418874500/emojis/2660.png rename to dist/v-1521124836513/emojis/2660.png diff --git a/dist/v-1520418874500/emojis/2663.png b/dist/v-1521124836513/emojis/2663.png similarity index 100% rename from dist/v-1520418874500/emojis/2663.png rename to dist/v-1521124836513/emojis/2663.png diff --git a/dist/v-1520418874500/emojis/2665.png b/dist/v-1521124836513/emojis/2665.png similarity index 100% rename from dist/v-1520418874500/emojis/2665.png rename to dist/v-1521124836513/emojis/2665.png diff --git a/dist/v-1520418874500/emojis/2666.png b/dist/v-1521124836513/emojis/2666.png similarity index 100% rename from dist/v-1520418874500/emojis/2666.png rename to dist/v-1521124836513/emojis/2666.png diff --git a/dist/v-1520418874500/emojis/2668.png b/dist/v-1521124836513/emojis/2668.png similarity index 100% rename from dist/v-1520418874500/emojis/2668.png rename to dist/v-1521124836513/emojis/2668.png diff --git a/dist/v-1520418874500/emojis/267b.png b/dist/v-1521124836513/emojis/267b.png similarity index 100% rename from dist/v-1520418874500/emojis/267b.png rename to dist/v-1521124836513/emojis/267b.png diff --git a/dist/v-1520418874500/emojis/267f.png b/dist/v-1521124836513/emojis/267f.png similarity index 100% rename from dist/v-1520418874500/emojis/267f.png rename to dist/v-1521124836513/emojis/267f.png diff --git a/dist/v-1520418874500/emojis/2692.png b/dist/v-1521124836513/emojis/2692.png similarity index 100% rename from dist/v-1520418874500/emojis/2692.png rename to dist/v-1521124836513/emojis/2692.png diff --git a/dist/v-1520418874500/emojis/2693.png b/dist/v-1521124836513/emojis/2693.png similarity index 100% rename from dist/v-1520418874500/emojis/2693.png rename to dist/v-1521124836513/emojis/2693.png diff --git a/dist/v-1520418874500/emojis/2694.png b/dist/v-1521124836513/emojis/2694.png similarity index 100% rename from dist/v-1520418874500/emojis/2694.png rename to dist/v-1521124836513/emojis/2694.png diff --git a/dist/v-1520418874500/emojis/2695.png b/dist/v-1521124836513/emojis/2695.png similarity index 100% rename from dist/v-1520418874500/emojis/2695.png rename to dist/v-1521124836513/emojis/2695.png diff --git a/dist/v-1520418874500/emojis/2696.png b/dist/v-1521124836513/emojis/2696.png similarity index 100% rename from dist/v-1520418874500/emojis/2696.png rename to dist/v-1521124836513/emojis/2696.png diff --git a/dist/v-1520418874500/emojis/2697.png b/dist/v-1521124836513/emojis/2697.png similarity index 100% rename from dist/v-1520418874500/emojis/2697.png rename to dist/v-1521124836513/emojis/2697.png diff --git a/dist/v-1520418874500/emojis/2699.png b/dist/v-1521124836513/emojis/2699.png similarity index 100% rename from dist/v-1520418874500/emojis/2699.png rename to dist/v-1521124836513/emojis/2699.png diff --git a/dist/v-1520418874500/emojis/269b.png b/dist/v-1521124836513/emojis/269b.png similarity index 100% rename from dist/v-1520418874500/emojis/269b.png rename to dist/v-1521124836513/emojis/269b.png diff --git a/dist/v-1520418874500/emojis/269c.png b/dist/v-1521124836513/emojis/269c.png similarity index 100% rename from dist/v-1520418874500/emojis/269c.png rename to dist/v-1521124836513/emojis/269c.png diff --git a/dist/v-1520418874500/emojis/26a0.png b/dist/v-1521124836513/emojis/26a0.png similarity index 100% rename from dist/v-1520418874500/emojis/26a0.png rename to dist/v-1521124836513/emojis/26a0.png diff --git a/dist/v-1520418874500/emojis/26a1.png b/dist/v-1521124836513/emojis/26a1.png similarity index 100% rename from dist/v-1520418874500/emojis/26a1.png rename to dist/v-1521124836513/emojis/26a1.png diff --git a/dist/v-1520418874500/emojis/26aa.png b/dist/v-1521124836513/emojis/26aa.png similarity index 100% rename from dist/v-1520418874500/emojis/26aa.png rename to dist/v-1521124836513/emojis/26aa.png diff --git a/dist/v-1520418874500/emojis/26ab.png b/dist/v-1521124836513/emojis/26ab.png similarity index 100% rename from dist/v-1520418874500/emojis/26ab.png rename to dist/v-1521124836513/emojis/26ab.png diff --git a/dist/v-1520418874500/emojis/26b0.png b/dist/v-1521124836513/emojis/26b0.png similarity index 100% rename from dist/v-1520418874500/emojis/26b0.png rename to dist/v-1521124836513/emojis/26b0.png diff --git a/dist/v-1520418874500/emojis/26b1.png b/dist/v-1521124836513/emojis/26b1.png similarity index 100% rename from dist/v-1520418874500/emojis/26b1.png rename to dist/v-1521124836513/emojis/26b1.png diff --git a/dist/v-1520418874500/emojis/26bd.png b/dist/v-1521124836513/emojis/26bd.png similarity index 100% rename from dist/v-1520418874500/emojis/26bd.png rename to dist/v-1521124836513/emojis/26bd.png diff --git a/dist/v-1520418874500/emojis/26be.png b/dist/v-1521124836513/emojis/26be.png similarity index 100% rename from dist/v-1520418874500/emojis/26be.png rename to dist/v-1521124836513/emojis/26be.png diff --git a/dist/v-1520418874500/emojis/26c4.png b/dist/v-1521124836513/emojis/26c4.png similarity index 100% rename from dist/v-1520418874500/emojis/26c4.png rename to dist/v-1521124836513/emojis/26c4.png diff --git a/dist/v-1520418874500/emojis/26c5.png b/dist/v-1521124836513/emojis/26c5.png similarity index 100% rename from dist/v-1520418874500/emojis/26c5.png rename to dist/v-1521124836513/emojis/26c5.png diff --git a/dist/v-1520418874500/emojis/26c8.png b/dist/v-1521124836513/emojis/26c8.png similarity index 100% rename from dist/v-1520418874500/emojis/26c8.png rename to dist/v-1521124836513/emojis/26c8.png diff --git a/dist/v-1520418874500/emojis/26ce.png b/dist/v-1521124836513/emojis/26ce.png similarity index 100% rename from dist/v-1520418874500/emojis/26ce.png rename to dist/v-1521124836513/emojis/26ce.png diff --git a/dist/v-1520418874500/emojis/26cf.png b/dist/v-1521124836513/emojis/26cf.png similarity index 100% rename from dist/v-1520418874500/emojis/26cf.png rename to dist/v-1521124836513/emojis/26cf.png diff --git a/dist/v-1520418874500/emojis/26d1.png b/dist/v-1521124836513/emojis/26d1.png similarity index 100% rename from dist/v-1520418874500/emojis/26d1.png rename to dist/v-1521124836513/emojis/26d1.png diff --git a/dist/v-1520418874500/emojis/26d3.png b/dist/v-1521124836513/emojis/26d3.png similarity index 100% rename from dist/v-1520418874500/emojis/26d3.png rename to dist/v-1521124836513/emojis/26d3.png diff --git a/dist/v-1520418874500/emojis/26d4.png b/dist/v-1521124836513/emojis/26d4.png similarity index 100% rename from dist/v-1520418874500/emojis/26d4.png rename to dist/v-1521124836513/emojis/26d4.png diff --git a/dist/v-1520418874500/emojis/26e9.png b/dist/v-1521124836513/emojis/26e9.png similarity index 100% rename from dist/v-1520418874500/emojis/26e9.png rename to dist/v-1521124836513/emojis/26e9.png diff --git a/dist/v-1520418874500/emojis/26ea.png b/dist/v-1521124836513/emojis/26ea.png similarity index 100% rename from dist/v-1520418874500/emojis/26ea.png rename to dist/v-1521124836513/emojis/26ea.png diff --git a/dist/v-1520418874500/emojis/26f0.png b/dist/v-1521124836513/emojis/26f0.png similarity index 100% rename from dist/v-1520418874500/emojis/26f0.png rename to dist/v-1521124836513/emojis/26f0.png diff --git a/dist/v-1520418874500/emojis/26f1.png b/dist/v-1521124836513/emojis/26f1.png similarity index 100% rename from dist/v-1520418874500/emojis/26f1.png rename to dist/v-1521124836513/emojis/26f1.png diff --git a/dist/v-1520418874500/emojis/26f2.png b/dist/v-1521124836513/emojis/26f2.png similarity index 100% rename from dist/v-1520418874500/emojis/26f2.png rename to dist/v-1521124836513/emojis/26f2.png diff --git a/dist/v-1520418874500/emojis/26f3.png b/dist/v-1521124836513/emojis/26f3.png similarity index 100% rename from dist/v-1520418874500/emojis/26f3.png rename to dist/v-1521124836513/emojis/26f3.png diff --git a/dist/v-1520418874500/emojis/26f4.png b/dist/v-1521124836513/emojis/26f4.png similarity index 100% rename from dist/v-1520418874500/emojis/26f4.png rename to dist/v-1521124836513/emojis/26f4.png diff --git a/dist/v-1520418874500/emojis/26f5.png b/dist/v-1521124836513/emojis/26f5.png similarity index 100% rename from dist/v-1520418874500/emojis/26f5.png rename to dist/v-1521124836513/emojis/26f5.png diff --git a/dist/v-1520418874500/emojis/26f7.png b/dist/v-1521124836513/emojis/26f7.png similarity index 100% rename from dist/v-1520418874500/emojis/26f7.png rename to dist/v-1521124836513/emojis/26f7.png diff --git a/dist/v-1520418874500/emojis/26f8.png b/dist/v-1521124836513/emojis/26f8.png similarity index 100% rename from dist/v-1520418874500/emojis/26f8.png rename to dist/v-1521124836513/emojis/26f8.png diff --git a/dist/v-1520418874500/emojis/26f9-fe0f-200d-2640-fe0f.png b/dist/v-1521124836513/emojis/26f9-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/26f9-fe0f-200d-2640-fe0f.png rename to dist/v-1521124836513/emojis/26f9-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1520418874500/emojis/26f9-fe0f-200d-2642-fe0f.png b/dist/v-1521124836513/emojis/26f9-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1520418874500/emojis/26f9-fe0f-200d-2642-fe0f.png rename to dist/v-1521124836513/emojis/26f9-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1520418874500/emojis/26f9.png b/dist/v-1521124836513/emojis/26f9.png similarity index 100% rename from dist/v-1520418874500/emojis/26f9.png rename to dist/v-1521124836513/emojis/26f9.png diff --git a/dist/v-1520418874500/emojis/26fa.png b/dist/v-1521124836513/emojis/26fa.png similarity index 100% rename from dist/v-1520418874500/emojis/26fa.png rename to dist/v-1521124836513/emojis/26fa.png diff --git a/dist/v-1520418874500/emojis/26fd.png b/dist/v-1521124836513/emojis/26fd.png similarity index 100% rename from dist/v-1520418874500/emojis/26fd.png rename to dist/v-1521124836513/emojis/26fd.png diff --git a/dist/v-1520418874500/emojis/2702.png b/dist/v-1521124836513/emojis/2702.png similarity index 100% rename from dist/v-1520418874500/emojis/2702.png rename to dist/v-1521124836513/emojis/2702.png diff --git a/dist/v-1520418874500/emojis/2705.png b/dist/v-1521124836513/emojis/2705.png similarity index 100% rename from dist/v-1520418874500/emojis/2705.png rename to dist/v-1521124836513/emojis/2705.png diff --git a/dist/v-1520418874500/emojis/2708.png b/dist/v-1521124836513/emojis/2708.png similarity index 100% rename from dist/v-1520418874500/emojis/2708.png rename to dist/v-1521124836513/emojis/2708.png diff --git a/dist/v-1520418874500/emojis/2709.png b/dist/v-1521124836513/emojis/2709.png similarity index 100% rename from dist/v-1520418874500/emojis/2709.png rename to dist/v-1521124836513/emojis/2709.png diff --git a/dist/v-1520418874500/emojis/270a.png b/dist/v-1521124836513/emojis/270a.png similarity index 100% rename from dist/v-1520418874500/emojis/270a.png rename to dist/v-1521124836513/emojis/270a.png diff --git a/dist/v-1520418874500/emojis/270b.png b/dist/v-1521124836513/emojis/270b.png similarity index 100% rename from dist/v-1520418874500/emojis/270b.png rename to dist/v-1521124836513/emojis/270b.png diff --git a/dist/v-1520418874500/emojis/270c.png b/dist/v-1521124836513/emojis/270c.png similarity index 100% rename from dist/v-1520418874500/emojis/270c.png rename to dist/v-1521124836513/emojis/270c.png diff --git a/dist/v-1520418874500/emojis/270d.png b/dist/v-1521124836513/emojis/270d.png similarity index 100% rename from dist/v-1520418874500/emojis/270d.png rename to dist/v-1521124836513/emojis/270d.png diff --git a/dist/v-1520418874500/emojis/270f.png b/dist/v-1521124836513/emojis/270f.png similarity index 100% rename from dist/v-1520418874500/emojis/270f.png rename to dist/v-1521124836513/emojis/270f.png diff --git a/dist/v-1520418874500/emojis/2712.png b/dist/v-1521124836513/emojis/2712.png similarity index 100% rename from dist/v-1520418874500/emojis/2712.png rename to dist/v-1521124836513/emojis/2712.png diff --git a/dist/v-1520418874500/emojis/2714.png b/dist/v-1521124836513/emojis/2714.png similarity index 100% rename from dist/v-1520418874500/emojis/2714.png rename to dist/v-1521124836513/emojis/2714.png diff --git a/dist/v-1520418874500/emojis/2716.png b/dist/v-1521124836513/emojis/2716.png similarity index 100% rename from dist/v-1520418874500/emojis/2716.png rename to dist/v-1521124836513/emojis/2716.png diff --git a/dist/v-1520418874500/emojis/271d.png b/dist/v-1521124836513/emojis/271d.png similarity index 100% rename from dist/v-1520418874500/emojis/271d.png rename to dist/v-1521124836513/emojis/271d.png diff --git a/dist/v-1520418874500/emojis/2721.png b/dist/v-1521124836513/emojis/2721.png similarity index 100% rename from dist/v-1520418874500/emojis/2721.png rename to dist/v-1521124836513/emojis/2721.png diff --git a/dist/v-1520418874500/emojis/2728.png b/dist/v-1521124836513/emojis/2728.png similarity index 100% rename from dist/v-1520418874500/emojis/2728.png rename to dist/v-1521124836513/emojis/2728.png diff --git a/dist/v-1520418874500/emojis/2733.png b/dist/v-1521124836513/emojis/2733.png similarity index 100% rename from dist/v-1520418874500/emojis/2733.png rename to dist/v-1521124836513/emojis/2733.png diff --git a/dist/v-1520418874500/emojis/2734.png b/dist/v-1521124836513/emojis/2734.png similarity index 100% rename from dist/v-1520418874500/emojis/2734.png rename to dist/v-1521124836513/emojis/2734.png diff --git a/dist/v-1520418874500/emojis/2744.png b/dist/v-1521124836513/emojis/2744.png similarity index 100% rename from dist/v-1520418874500/emojis/2744.png rename to dist/v-1521124836513/emojis/2744.png diff --git a/dist/v-1520418874500/emojis/2747.png b/dist/v-1521124836513/emojis/2747.png similarity index 100% rename from dist/v-1520418874500/emojis/2747.png rename to dist/v-1521124836513/emojis/2747.png diff --git a/dist/v-1520418874500/emojis/274c.png b/dist/v-1521124836513/emojis/274c.png similarity index 100% rename from dist/v-1520418874500/emojis/274c.png rename to dist/v-1521124836513/emojis/274c.png diff --git a/dist/v-1520418874500/emojis/274e.png b/dist/v-1521124836513/emojis/274e.png similarity index 100% rename from dist/v-1520418874500/emojis/274e.png rename to dist/v-1521124836513/emojis/274e.png diff --git a/dist/v-1520418874500/emojis/2753.png b/dist/v-1521124836513/emojis/2753.png similarity index 100% rename from dist/v-1520418874500/emojis/2753.png rename to dist/v-1521124836513/emojis/2753.png diff --git a/dist/v-1520418874500/emojis/2754.png b/dist/v-1521124836513/emojis/2754.png similarity index 100% rename from dist/v-1520418874500/emojis/2754.png rename to dist/v-1521124836513/emojis/2754.png diff --git a/dist/v-1520418874500/emojis/2755.png b/dist/v-1521124836513/emojis/2755.png similarity index 100% rename from dist/v-1520418874500/emojis/2755.png rename to dist/v-1521124836513/emojis/2755.png diff --git a/dist/v-1520418874500/emojis/2757.png b/dist/v-1521124836513/emojis/2757.png similarity index 100% rename from dist/v-1520418874500/emojis/2757.png rename to dist/v-1521124836513/emojis/2757.png diff --git a/dist/v-1520418874500/emojis/2763.png b/dist/v-1521124836513/emojis/2763.png similarity index 100% rename from dist/v-1520418874500/emojis/2763.png rename to dist/v-1521124836513/emojis/2763.png diff --git a/dist/v-1520418874500/emojis/2764.png b/dist/v-1521124836513/emojis/2764.png similarity index 100% rename from dist/v-1520418874500/emojis/2764.png rename to dist/v-1521124836513/emojis/2764.png diff --git a/dist/v-1520418874500/emojis/2795.png b/dist/v-1521124836513/emojis/2795.png similarity index 100% rename from dist/v-1520418874500/emojis/2795.png rename to dist/v-1521124836513/emojis/2795.png diff --git a/dist/v-1520418874500/emojis/2796.png b/dist/v-1521124836513/emojis/2796.png similarity index 100% rename from dist/v-1520418874500/emojis/2796.png rename to dist/v-1521124836513/emojis/2796.png diff --git a/dist/v-1520418874500/emojis/2797.png b/dist/v-1521124836513/emojis/2797.png similarity index 100% rename from dist/v-1520418874500/emojis/2797.png rename to dist/v-1521124836513/emojis/2797.png diff --git a/dist/v-1520418874500/emojis/27a1.png b/dist/v-1521124836513/emojis/27a1.png similarity index 100% rename from dist/v-1520418874500/emojis/27a1.png rename to dist/v-1521124836513/emojis/27a1.png diff --git a/dist/v-1520418874500/emojis/27b0.png b/dist/v-1521124836513/emojis/27b0.png similarity index 100% rename from dist/v-1520418874500/emojis/27b0.png rename to dist/v-1521124836513/emojis/27b0.png diff --git a/dist/v-1520418874500/emojis/27bf.png b/dist/v-1521124836513/emojis/27bf.png similarity index 100% rename from dist/v-1520418874500/emojis/27bf.png rename to dist/v-1521124836513/emojis/27bf.png diff --git a/dist/v-1520418874500/emojis/2934.png b/dist/v-1521124836513/emojis/2934.png similarity index 100% rename from dist/v-1520418874500/emojis/2934.png rename to dist/v-1521124836513/emojis/2934.png diff --git a/dist/v-1520418874500/emojis/2935.png b/dist/v-1521124836513/emojis/2935.png similarity index 100% rename from dist/v-1520418874500/emojis/2935.png rename to dist/v-1521124836513/emojis/2935.png diff --git a/dist/v-1520418874500/emojis/2b05.png b/dist/v-1521124836513/emojis/2b05.png similarity index 100% rename from dist/v-1520418874500/emojis/2b05.png rename to dist/v-1521124836513/emojis/2b05.png diff --git a/dist/v-1520418874500/emojis/2b06.png b/dist/v-1521124836513/emojis/2b06.png similarity index 100% rename from dist/v-1520418874500/emojis/2b06.png rename to dist/v-1521124836513/emojis/2b06.png diff --git a/dist/v-1520418874500/emojis/2b07.png b/dist/v-1521124836513/emojis/2b07.png similarity index 100% rename from dist/v-1520418874500/emojis/2b07.png rename to dist/v-1521124836513/emojis/2b07.png diff --git a/dist/v-1520418874500/emojis/2b1b.png b/dist/v-1521124836513/emojis/2b1b.png similarity index 100% rename from dist/v-1520418874500/emojis/2b1b.png rename to dist/v-1521124836513/emojis/2b1b.png diff --git a/dist/v-1520418874500/emojis/2b1c.png b/dist/v-1521124836513/emojis/2b1c.png similarity index 100% rename from dist/v-1520418874500/emojis/2b1c.png rename to dist/v-1521124836513/emojis/2b1c.png diff --git a/dist/v-1520418874500/emojis/2b50.png b/dist/v-1521124836513/emojis/2b50.png similarity index 100% rename from dist/v-1520418874500/emojis/2b50.png rename to dist/v-1521124836513/emojis/2b50.png diff --git a/dist/v-1520418874500/emojis/2b55.png b/dist/v-1521124836513/emojis/2b55.png similarity index 100% rename from dist/v-1520418874500/emojis/2b55.png rename to dist/v-1521124836513/emojis/2b55.png diff --git a/dist/v-1520418874500/emojis/3030.png b/dist/v-1521124836513/emojis/3030.png similarity index 100% rename from dist/v-1520418874500/emojis/3030.png rename to dist/v-1521124836513/emojis/3030.png diff --git a/dist/v-1520418874500/emojis/303d.png b/dist/v-1521124836513/emojis/303d.png similarity index 100% rename from dist/v-1520418874500/emojis/303d.png rename to dist/v-1521124836513/emojis/303d.png diff --git a/dist/v-1520418874500/emojis/3297.png b/dist/v-1521124836513/emojis/3297.png similarity index 100% rename from dist/v-1520418874500/emojis/3297.png rename to dist/v-1521124836513/emojis/3297.png diff --git a/dist/v-1520418874500/emojis/3299.png b/dist/v-1521124836513/emojis/3299.png similarity index 100% rename from dist/v-1520418874500/emojis/3299.png rename to dist/v-1521124836513/emojis/3299.png diff --git a/dist/v-1520418874500/emojis/emojis-data.json b/dist/v-1521124836513/emojis/emojis-data.json similarity index 100% rename from dist/v-1520418874500/emojis/emojis-data.json rename to dist/v-1521124836513/emojis/emojis-data.json diff --git a/dist/v-1520418874500/fonts/OpenSans-Bold.ttf b/dist/v-1521124836513/fonts/OpenSans-Bold.ttf similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-Bold.ttf rename to dist/v-1521124836513/fonts/OpenSans-Bold.ttf diff --git a/dist/v-1520418874500/fonts/OpenSans-CondLight.eot b/dist/v-1521124836513/fonts/OpenSans-CondLight.eot similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-CondLight.eot rename to dist/v-1521124836513/fonts/OpenSans-CondLight.eot diff --git a/dist/v-1520418874500/fonts/OpenSans-CondLight.svg b/dist/v-1521124836513/fonts/OpenSans-CondLight.svg similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-CondLight.svg rename to dist/v-1521124836513/fonts/OpenSans-CondLight.svg diff --git a/dist/v-1520418874500/fonts/OpenSans-CondLight.ttf b/dist/v-1521124836513/fonts/OpenSans-CondLight.ttf similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-CondLight.ttf rename to dist/v-1521124836513/fonts/OpenSans-CondLight.ttf diff --git a/dist/v-1520418874500/fonts/OpenSans-CondLight.woff b/dist/v-1521124836513/fonts/OpenSans-CondLight.woff similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-CondLight.woff rename to dist/v-1521124836513/fonts/OpenSans-CondLight.woff diff --git a/dist/v-1520418874500/fonts/OpenSans-Light.ttf b/dist/v-1521124836513/fonts/OpenSans-Light.ttf similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-Light.ttf rename to dist/v-1521124836513/fonts/OpenSans-Light.ttf diff --git a/dist/v-1520418874500/fonts/OpenSans-Regular.ttf b/dist/v-1521124836513/fonts/OpenSans-Regular.ttf similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-Regular.ttf rename to dist/v-1521124836513/fonts/OpenSans-Regular.ttf diff --git a/dist/v-1520418874500/fonts/OpenSans-Semibold.ttf b/dist/v-1521124836513/fonts/OpenSans-Semibold.ttf similarity index 100% rename from dist/v-1520418874500/fonts/OpenSans-Semibold.ttf rename to dist/v-1521124836513/fonts/OpenSans-Semibold.ttf diff --git a/dist/v-1520418874500/fonts/taiga.eot b/dist/v-1521124836513/fonts/taiga.eot similarity index 100% rename from dist/v-1520418874500/fonts/taiga.eot rename to dist/v-1521124836513/fonts/taiga.eot diff --git a/dist/v-1520418874500/fonts/taiga.svg b/dist/v-1521124836513/fonts/taiga.svg similarity index 100% rename from dist/v-1520418874500/fonts/taiga.svg rename to dist/v-1521124836513/fonts/taiga.svg diff --git a/dist/v-1520418874500/fonts/taiga.ttf b/dist/v-1521124836513/fonts/taiga.ttf similarity index 100% rename from dist/v-1520418874500/fonts/taiga.ttf rename to dist/v-1521124836513/fonts/taiga.ttf diff --git a/dist/v-1520418874500/fonts/taiga.woff b/dist/v-1521124836513/fonts/taiga.woff similarity index 100% rename from dist/v-1520418874500/fonts/taiga.woff rename to dist/v-1521124836513/fonts/taiga.woff diff --git a/dist/v-1520418874500/images/attachment-gallery.png b/dist/v-1521124836513/images/attachment-gallery.png similarity index 100% rename from dist/v-1520418874500/images/attachment-gallery.png rename to dist/v-1521124836513/images/attachment-gallery.png diff --git a/dist/v-1520418874500/images/bg.png b/dist/v-1521124836513/images/bg.png similarity index 100% rename from dist/v-1520418874500/images/bg.png rename to dist/v-1521124836513/images/bg.png diff --git a/dist/v-1520418874500/images/discover.png b/dist/v-1521124836513/images/discover.png similarity index 100% rename from dist/v-1520418874500/images/discover.png rename to dist/v-1521124836513/images/discover.png diff --git a/dist/v-1520418874500/images/empty/empty_contact.png b/dist/v-1521124836513/images/empty/empty_contact.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_contact.png rename to dist/v-1521124836513/images/empty/empty_contact.png diff --git a/dist/v-1520418874500/images/empty/empty_des.png b/dist/v-1521124836513/images/empty/empty_des.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_des.png rename to dist/v-1521124836513/images/empty/empty_des.png diff --git a/dist/v-1520418874500/images/empty/empty_field.png b/dist/v-1521124836513/images/empty/empty_field.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_field.png rename to dist/v-1521124836513/images/empty/empty_field.png diff --git a/dist/v-1520418874500/images/empty/empty_like.png b/dist/v-1521124836513/images/empty/empty_like.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_like.png rename to dist/v-1521124836513/images/empty/empty_like.png diff --git a/dist/v-1520418874500/images/empty/empty_mex.png b/dist/v-1521124836513/images/empty/empty_mex.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_mex.png rename to dist/v-1521124836513/images/empty/empty_mex.png diff --git a/dist/v-1520418874500/images/empty/empty_moon.png b/dist/v-1521124836513/images/empty/empty_moon.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_moon.png rename to dist/v-1521124836513/images/empty/empty_moon.png diff --git a/dist/v-1520418874500/images/empty/empty_sprint.png b/dist/v-1521124836513/images/empty/empty_sprint.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_sprint.png rename to dist/v-1521124836513/images/empty/empty_sprint.png diff --git a/dist/v-1520418874500/images/empty/empty_tex.png b/dist/v-1521124836513/images/empty/empty_tex.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_tex.png rename to dist/v-1521124836513/images/empty/empty_tex.png diff --git a/dist/v-1520418874500/images/empty/empty_upvote.png b/dist/v-1521124836513/images/empty/empty_upvote.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_upvote.png rename to dist/v-1521124836513/images/empty/empty_upvote.png diff --git a/dist/v-1520418874500/images/empty/empty_watch.png b/dist/v-1521124836513/images/empty/empty_watch.png similarity index 100% rename from dist/v-1520418874500/images/empty/empty_watch.png rename to dist/v-1521124836513/images/empty/empty_watch.png diff --git a/dist/v-1520418874500/images/epics-empty.png b/dist/v-1521124836513/images/epics-empty.png similarity index 100% rename from dist/v-1520418874500/images/epics-empty.png rename to dist/v-1521124836513/images/epics-empty.png diff --git a/dist/v-1520418874500/images/favicon.png b/dist/v-1521124836513/images/favicon.png similarity index 100% rename from dist/v-1520418874500/images/favicon.png rename to dist/v-1521124836513/images/favicon.png diff --git a/dist/v-1520418874500/images/import-logos/asana.png b/dist/v-1521124836513/images/import-logos/asana.png similarity index 100% rename from dist/v-1520418874500/images/import-logos/asana.png rename to dist/v-1521124836513/images/import-logos/asana.png diff --git a/dist/v-1520418874500/images/import-logos/github.png b/dist/v-1521124836513/images/import-logos/github.png similarity index 100% rename from dist/v-1520418874500/images/import-logos/github.png rename to dist/v-1521124836513/images/import-logos/github.png diff --git a/dist/v-1520418874500/images/import-logos/jira.png b/dist/v-1521124836513/images/import-logos/jira.png similarity index 100% rename from dist/v-1520418874500/images/import-logos/jira.png rename to dist/v-1521124836513/images/import-logos/jira.png diff --git a/dist/v-1520418874500/images/import-logos/trello.png b/dist/v-1521124836513/images/import-logos/trello.png similarity index 100% rename from dist/v-1520418874500/images/import-logos/trello.png rename to dist/v-1521124836513/images/import-logos/trello.png diff --git a/dist/v-1520418874500/images/invitation_bg.jpg b/dist/v-1521124836513/images/invitation_bg.jpg similarity index 100% rename from dist/v-1520418874500/images/invitation_bg.jpg rename to dist/v-1521124836513/images/invitation_bg.jpg diff --git a/dist/v-1520418874500/images/logo-color.png b/dist/v-1521124836513/images/logo-color.png similarity index 100% rename from dist/v-1520418874500/images/logo-color.png rename to dist/v-1521124836513/images/logo-color.png diff --git a/dist/v-1520418874500/images/logo.png b/dist/v-1521124836513/images/logo.png similarity index 100% rename from dist/v-1520418874500/images/logo.png rename to dist/v-1521124836513/images/logo.png diff --git a/dist/v-1520418874500/images/looking-for-people.png b/dist/v-1521124836513/images/looking-for-people.png similarity index 100% rename from dist/v-1520418874500/images/looking-for-people.png rename to dist/v-1521124836513/images/looking-for-people.png diff --git a/dist/v-1520418874500/images/markitup/bg-container.png b/dist/v-1521124836513/images/markitup/bg-container.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-container.png rename to dist/v-1521124836513/images/markitup/bg-container.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-bbcode.png b/dist/v-1521124836513/images/markitup/bg-editor-bbcode.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-bbcode.png rename to dist/v-1521124836513/images/markitup/bg-editor-bbcode.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-dotclear.png b/dist/v-1521124836513/images/markitup/bg-editor-dotclear.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-dotclear.png rename to dist/v-1521124836513/images/markitup/bg-editor-dotclear.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-html.png b/dist/v-1521124836513/images/markitup/bg-editor-html.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-html.png rename to dist/v-1521124836513/images/markitup/bg-editor-html.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-json.png b/dist/v-1521124836513/images/markitup/bg-editor-json.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-json.png rename to dist/v-1521124836513/images/markitup/bg-editor-json.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-markdown.png b/dist/v-1521124836513/images/markitup/bg-editor-markdown.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-markdown.png rename to dist/v-1521124836513/images/markitup/bg-editor-markdown.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-textile.png b/dist/v-1521124836513/images/markitup/bg-editor-textile.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-textile.png rename to dist/v-1521124836513/images/markitup/bg-editor-textile.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-wiki.png b/dist/v-1521124836513/images/markitup/bg-editor-wiki.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-wiki.png rename to dist/v-1521124836513/images/markitup/bg-editor-wiki.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor-xml.png b/dist/v-1521124836513/images/markitup/bg-editor-xml.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor-xml.png rename to dist/v-1521124836513/images/markitup/bg-editor-xml.png diff --git a/dist/v-1520418874500/images/markitup/bg-editor.png b/dist/v-1521124836513/images/markitup/bg-editor.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bg-editor.png rename to dist/v-1521124836513/images/markitup/bg-editor.png diff --git a/dist/v-1520418874500/images/markitup/body.png b/dist/v-1521124836513/images/markitup/body.png similarity index 100% rename from dist/v-1520418874500/images/markitup/body.png rename to dist/v-1521124836513/images/markitup/body.png diff --git a/dist/v-1520418874500/images/markitup/bold.png b/dist/v-1521124836513/images/markitup/bold.png similarity index 100% rename from dist/v-1520418874500/images/markitup/bold.png rename to dist/v-1521124836513/images/markitup/bold.png diff --git a/dist/v-1520418874500/images/markitup/clean.png b/dist/v-1521124836513/images/markitup/clean.png similarity index 100% rename from dist/v-1520418874500/images/markitup/clean.png rename to dist/v-1521124836513/images/markitup/clean.png diff --git a/dist/v-1520418874500/images/markitup/code.png b/dist/v-1521124836513/images/markitup/code.png similarity index 100% rename from dist/v-1520418874500/images/markitup/code.png rename to dist/v-1521124836513/images/markitup/code.png diff --git a/dist/v-1520418874500/images/markitup/h1.png b/dist/v-1521124836513/images/markitup/h1.png similarity index 100% rename from dist/v-1520418874500/images/markitup/h1.png rename to dist/v-1521124836513/images/markitup/h1.png diff --git a/dist/v-1520418874500/images/markitup/h2.png b/dist/v-1521124836513/images/markitup/h2.png similarity index 100% rename from dist/v-1520418874500/images/markitup/h2.png rename to dist/v-1521124836513/images/markitup/h2.png diff --git a/dist/v-1520418874500/images/markitup/h3.png b/dist/v-1521124836513/images/markitup/h3.png similarity index 100% rename from dist/v-1520418874500/images/markitup/h3.png rename to dist/v-1521124836513/images/markitup/h3.png diff --git a/dist/v-1520418874500/images/markitup/h4.png b/dist/v-1521124836513/images/markitup/h4.png similarity index 100% rename from dist/v-1520418874500/images/markitup/h4.png rename to dist/v-1521124836513/images/markitup/h4.png diff --git a/dist/v-1520418874500/images/markitup/h5.png b/dist/v-1521124836513/images/markitup/h5.png similarity index 100% rename from dist/v-1520418874500/images/markitup/h5.png rename to dist/v-1521124836513/images/markitup/h5.png diff --git a/dist/v-1520418874500/images/markitup/h6.png b/dist/v-1521124836513/images/markitup/h6.png similarity index 100% rename from dist/v-1520418874500/images/markitup/h6.png rename to dist/v-1521124836513/images/markitup/h6.png diff --git a/dist/v-1520418874500/images/markitup/handle.png b/dist/v-1521124836513/images/markitup/handle.png similarity index 100% rename from dist/v-1520418874500/images/markitup/handle.png rename to dist/v-1521124836513/images/markitup/handle.png diff --git a/dist/v-1520418874500/images/markitup/help.png b/dist/v-1521124836513/images/markitup/help.png similarity index 100% rename from dist/v-1520418874500/images/markitup/help.png rename to dist/v-1521124836513/images/markitup/help.png diff --git a/dist/v-1520418874500/images/markitup/image.png b/dist/v-1521124836513/images/markitup/image.png similarity index 100% rename from dist/v-1520418874500/images/markitup/image.png rename to dist/v-1521124836513/images/markitup/image.png diff --git a/dist/v-1520418874500/images/markitup/italic.png b/dist/v-1521124836513/images/markitup/italic.png similarity index 100% rename from dist/v-1520418874500/images/markitup/italic.png rename to dist/v-1521124836513/images/markitup/italic.png diff --git a/dist/v-1520418874500/images/markitup/jaysalvat.png b/dist/v-1521124836513/images/markitup/jaysalvat.png similarity index 100% rename from dist/v-1520418874500/images/markitup/jaysalvat.png rename to dist/v-1521124836513/images/markitup/jaysalvat.png diff --git a/dist/v-1520418874500/images/markitup/link.png b/dist/v-1521124836513/images/markitup/link.png similarity index 100% rename from dist/v-1520418874500/images/markitup/link.png rename to dist/v-1521124836513/images/markitup/link.png diff --git a/dist/v-1520418874500/images/markitup/list-bullet.png b/dist/v-1521124836513/images/markitup/list-bullet.png similarity index 100% rename from dist/v-1520418874500/images/markitup/list-bullet.png rename to dist/v-1521124836513/images/markitup/list-bullet.png diff --git a/dist/v-1520418874500/images/markitup/list-numeric.png b/dist/v-1521124836513/images/markitup/list-numeric.png similarity index 100% rename from dist/v-1520418874500/images/markitup/list-numeric.png rename to dist/v-1521124836513/images/markitup/list-numeric.png diff --git a/dist/v-1520418874500/images/markitup/markitup.png b/dist/v-1521124836513/images/markitup/markitup.png similarity index 100% rename from dist/v-1520418874500/images/markitup/markitup.png rename to dist/v-1521124836513/images/markitup/markitup.png diff --git a/dist/v-1520418874500/images/markitup/menu.png b/dist/v-1521124836513/images/markitup/menu.png similarity index 100% rename from dist/v-1520418874500/images/markitup/menu.png rename to dist/v-1521124836513/images/markitup/menu.png diff --git a/dist/v-1520418874500/images/markitup/picture.png b/dist/v-1521124836513/images/markitup/picture.png similarity index 100% rename from dist/v-1520418874500/images/markitup/picture.png rename to dist/v-1521124836513/images/markitup/picture.png diff --git a/dist/v-1520418874500/images/markitup/preview.png b/dist/v-1521124836513/images/markitup/preview.png similarity index 100% rename from dist/v-1520418874500/images/markitup/preview.png rename to dist/v-1521124836513/images/markitup/preview.png diff --git a/dist/v-1520418874500/images/markitup/preview_ico.png b/dist/v-1521124836513/images/markitup/preview_ico.png similarity index 100% rename from dist/v-1520418874500/images/markitup/preview_ico.png rename to dist/v-1521124836513/images/markitup/preview_ico.png diff --git a/dist/v-1520418874500/images/markitup/quotes.png b/dist/v-1521124836513/images/markitup/quotes.png similarity index 100% rename from dist/v-1520418874500/images/markitup/quotes.png rename to dist/v-1521124836513/images/markitup/quotes.png diff --git a/dist/v-1520418874500/images/markitup/stroke.png b/dist/v-1521124836513/images/markitup/stroke.png similarity index 100% rename from dist/v-1520418874500/images/markitup/stroke.png rename to dist/v-1521124836513/images/markitup/stroke.png diff --git a/dist/v-1520418874500/images/markitup/submenu.png b/dist/v-1521124836513/images/markitup/submenu.png similarity index 100% rename from dist/v-1520418874500/images/markitup/submenu.png rename to dist/v-1521124836513/images/markitup/submenu.png diff --git a/dist/v-1520418874500/images/menu-vert.png b/dist/v-1521124836513/images/menu-vert.png similarity index 100% rename from dist/v-1520418874500/images/menu-vert.png rename to dist/v-1521124836513/images/menu-vert.png diff --git a/dist/v-1520418874500/images/menu.png b/dist/v-1521124836513/images/menu.png similarity index 100% rename from dist/v-1520418874500/images/menu.png rename to dist/v-1521124836513/images/menu.png diff --git a/dist/v-1520418874500/images/monster-fight.png b/dist/v-1521124836513/images/monster-fight.png similarity index 100% rename from dist/v-1520418874500/images/monster-fight.png rename to dist/v-1521124836513/images/monster-fight.png diff --git a/dist/v-1520418874500/images/notification-decoration.png b/dist/v-1521124836513/images/notification-decoration.png similarity index 100% rename from dist/v-1520418874500/images/notification-decoration.png rename to dist/v-1521124836513/images/notification-decoration.png diff --git a/dist/v-1520418874500/images/project-logos/project-logo-01.png b/dist/v-1521124836513/images/project-logos/project-logo-01.png similarity index 100% rename from dist/v-1520418874500/images/project-logos/project-logo-01.png rename to dist/v-1521124836513/images/project-logos/project-logo-01.png diff --git a/dist/v-1520418874500/images/project-logos/project-logo-02.png b/dist/v-1521124836513/images/project-logos/project-logo-02.png similarity index 100% rename from dist/v-1520418874500/images/project-logos/project-logo-02.png rename to dist/v-1521124836513/images/project-logos/project-logo-02.png diff --git a/dist/v-1520418874500/images/project-logos/project-logo-03.png b/dist/v-1521124836513/images/project-logos/project-logo-03.png similarity index 100% rename from dist/v-1520418874500/images/project-logos/project-logo-03.png rename to dist/v-1521124836513/images/project-logos/project-logo-03.png diff --git a/dist/v-1520418874500/images/project-logos/project-logo-04.png b/dist/v-1521124836513/images/project-logos/project-logo-04.png similarity index 100% rename from dist/v-1520418874500/images/project-logos/project-logo-04.png rename to dist/v-1521124836513/images/project-logos/project-logo-04.png diff --git a/dist/v-1520418874500/images/project-logos/project-logo-05.png b/dist/v-1521124836513/images/project-logos/project-logo-05.png similarity index 100% rename from dist/v-1520418874500/images/project-logos/project-logo-05.png rename to dist/v-1521124836513/images/project-logos/project-logo-05.png diff --git a/dist/v-1520418874500/images/quote.png b/dist/v-1521124836513/images/quote.png similarity index 100% rename from dist/v-1520418874500/images/quote.png rename to dist/v-1521124836513/images/quote.png diff --git a/dist/v-1520418874500/images/tribe-logo.png b/dist/v-1521124836513/images/tribe-logo.png similarity index 100% rename from dist/v-1520418874500/images/tribe-logo.png rename to dist/v-1521124836513/images/tribe-logo.png diff --git a/dist/v-1520418874500/images/unnamed.png b/dist/v-1521124836513/images/unnamed.png similarity index 100% rename from dist/v-1520418874500/images/unnamed.png rename to dist/v-1521124836513/images/unnamed.png diff --git a/dist/v-1520418874500/images/user-avatars/user-avatar-01.png b/dist/v-1521124836513/images/user-avatars/user-avatar-01.png similarity index 100% rename from dist/v-1520418874500/images/user-avatars/user-avatar-01.png rename to dist/v-1521124836513/images/user-avatars/user-avatar-01.png diff --git a/dist/v-1520418874500/images/user-avatars/user-avatar-02.png b/dist/v-1521124836513/images/user-avatars/user-avatar-02.png similarity index 100% rename from dist/v-1520418874500/images/user-avatars/user-avatar-02.png rename to dist/v-1521124836513/images/user-avatars/user-avatar-02.png diff --git a/dist/v-1520418874500/images/user-avatars/user-avatar-03.png b/dist/v-1521124836513/images/user-avatars/user-avatar-03.png similarity index 100% rename from dist/v-1520418874500/images/user-avatars/user-avatar-03.png rename to dist/v-1521124836513/images/user-avatars/user-avatar-03.png diff --git a/dist/v-1520418874500/images/user-avatars/user-avatar-04.png b/dist/v-1521124836513/images/user-avatars/user-avatar-04.png similarity index 100% rename from dist/v-1520418874500/images/user-avatars/user-avatar-04.png rename to dist/v-1521124836513/images/user-avatars/user-avatar-04.png diff --git a/dist/v-1520418874500/images/user-avatars/user-avatar-05.png b/dist/v-1521124836513/images/user-avatars/user-avatar-05.png similarity index 100% rename from dist/v-1520418874500/images/user-avatars/user-avatar-05.png rename to dist/v-1521124836513/images/user-avatars/user-avatar-05.png diff --git a/dist/v-1520418874500/images/user-noimage.png b/dist/v-1521124836513/images/user-noimage.png similarity index 100% rename from dist/v-1520418874500/images/user-noimage.png rename to dist/v-1521124836513/images/user-noimage.png diff --git a/dist/v-1520418874500/js/app-loader.js b/dist/v-1521124836513/js/app-loader.js similarity index 96% rename from dist/v-1520418874500/js/app-loader.js rename to dist/v-1521124836513/js/app-loader.js index 13cd809..2e26c02 100644 --- a/dist/v-1520418874500/js/app-loader.js +++ b/dist/v-1521124836513/js/app-loader.js @@ -1 +1 @@ -(function(){var n,t,e,i;window._version="v-1520418874500",window.taigaConfig={api:"http://localhost:8000/api/v1/",eventsUrl:null,tribeHost:null,eventsMaxMissedHeartbeats:5,eventsHeartbeatIntervalTime:6e4,debug:!0,defaultLanguage:"en",themes:["taiga","material-design","high-contrast"],defaultTheme:"taiga",publicRegisterEnabled:!0,feedbackEnabled:!0,supportUrl:null,privacyPolicyUrl:null,termsOfServiceUrl:null,maxUploadFileSize:null,importers:[],contribPlugins:[]},window.taigaContribPlugins=[],window._decorators=[],window.addDecorator=function(n,t){return window._decorators.push({provider:n,decorator:t})},window.getDecorators=function(){return window._decorators},e=function(n){return $("head").append('')},n=function(n){return new Promise(function(t,i){var o,r;return r=function(n){var i,o,r,a;if(n.isPack)for(a=n.plugins,i=0,r=a.length;i0?t(window.taigaConfig.contribPlugins).then(function(){return ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})}):ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})})}).call(this); \ No newline at end of file +(function(){var n,t,e,i;window._version="v-1521124836513",window.taigaConfig={api:"http://localhost:8000/api/v1/",eventsUrl:null,tribeHost:null,eventsMaxMissedHeartbeats:5,eventsHeartbeatIntervalTime:6e4,debug:!0,defaultLanguage:"en",themes:["taiga","material-design","high-contrast"],defaultTheme:"taiga",publicRegisterEnabled:!0,feedbackEnabled:!0,supportUrl:null,privacyPolicyUrl:null,termsOfServiceUrl:null,maxUploadFileSize:null,importers:[],contribPlugins:[]},window.taigaContribPlugins=[],window._decorators=[],window.addDecorator=function(n,t){return window._decorators.push({provider:n,decorator:t})},window.getDecorators=function(){return window._decorators},e=function(n){return $("head").append('')},n=function(n){return new Promise(function(t,i){var o,r;return r=function(n){var i,o,r,a;if(n.isPack)for(a=n.plugins,i=0,r=a.length;i0?t(window.taigaConfig.contribPlugins).then(function(){return ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})}):ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})})}).call(this); \ No newline at end of file diff --git a/dist/v-1520418874500/js/app.js b/dist/v-1521124836513/js/app.js similarity index 67% rename from dist/v-1520418874500/js/app.js rename to dist/v-1521124836513/js/app.js index 9e153df..7febcd3 100644 --- a/dist/v-1520418874500/js/app.js +++ b/dist/v-1521124836513/js/app.js @@ -1,17 +1,17 @@ (function(){var t,e,r,n,i,o,s,a;this.taiga=a={},a.emojis=window.emojis,this.taigaContribPlugins=this.taigaContribPlugins||window.taigaContribPlugins||[],a.generateHash=function(t){return null==t&&(t=[]),t=_.map(t,function(t){return JSON.stringify(t)}),hex_sha1(t.join(":"))},a.generateUniqueSessionIdentifier=function(){var t,e;return t=(new Date).getTime(),e=Math.floor(150994944*Math.random()),a.generateHash([t,e])},a.sessionId=a.generateUniqueSessionIdentifier(),t=function(t,e,r,n,i,o,s,c,u){var l,p,h,f,d,g,m,v,y;return u.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/),g=t.when,t.when=function(e,r){return r.resolve||(r.resolve={}),angular.extend(r.resolve,{languageLoad:["$q","$translate",function(t,e){var r;return r=t.defer(),e().then(function(){return r.resolve()}),r.promise}],projectLoaded:["$q","tgProjectService","$route",function(t,e,r){var n,i;return n=t.defer(),e.setSection(null!=(i=r.current.$$route)?i.section:void 0),r.current.params.pslug?e.setProjectBySlug(r.current.params.pslug).then(n.resolve):(e.cleanProject(),n.resolve()),n.promise}]}),g.call(t,e,r)},t.when("/",{templateUrl:"home/home.html",controller:"Home",controllerAs:"vm",loader:!0,title:"HOME.PAGE_TITLE",loader:!0,description:"HOME.PAGE_DESCRIPTION",joyride:"dashboard"}),t.when("/discover",{templateUrl:"discover/discover-home/discover-home.html",controller:"DiscoverHome",controllerAs:"vm",title:"PROJECT.NAVIGATION.DISCOVER",loader:!0}),t.when("/discover/search",{templateUrl:"discover/discover-search/discover-search.html",title:"PROJECT.NAVIGATION.DISCOVER",loader:!0,controller:"DiscoverSearch",controllerAs:"vm",reloadOnSearch:!1}),t.when("/projects/",{templateUrl:"projects/listing/projects-listing.html",access:{requiresLogin:!0},title:"PROJECTS.PAGE_TITLE",description:"PROJECTS.PAGE_DESCRIPTION",loader:!0,controller:"ProjectsListing",controllerAs:"vm"}),t.when("/project/new",{title:"PROJECT.CREATE.TITLE",templateUrl:"projects/create/create-project.html",loader:!0,controller:"CreateProjectCtrl",controllerAs:"vm"}),t.when("/project/new/scrum",{title:"PROJECT.CREATE.TITLE",template:'',loader:!0}),t.when("/project/new/kanban",{title:"PROJECT.CREATE.TITLE",template:'',loader:!0}),t.when("/project/new/duplicate",{title:"PROJECT.CREATE.TITLE",template:"",loader:!0}),t.when("/project/new/import/:platform?",{title:"PROJECT.CREATE.TITLE",template:"",loader:!0}),t.when("/project/:pslug/",{templateUrl:"projects/project/project.html",loader:!0,controller:"Project",controllerAs:"vm",section:"project-timeline"}),t.when("/project/:pslug/t/:ref",{loader:!0,controller:"DetailController",template:""}),t.when("/project/:pslug/search",{templateUrl:"search/search.html",reloadOnSearch:!1,section:"search",loader:!0}),t.when("/project/:pslug/epics",{section:"epics",templateUrl:"epics/dashboard/epics-dashboard.html",loader:!0,controller:"EpicsDashboardCtrl",controllerAs:"vm"}),t.when("/project/:pslug/epic/:epicref",{templateUrl:"epic/epic-detail.html",loader:!0,section:"epics"}),t.when("/project/:pslug/backlog",{templateUrl:"backlog/backlog.html",loader:!0,section:"backlog",joyride:"backlog"}),t.when("/project/:pslug/kanban",{templateUrl:"kanban/kanban.html",loader:!0,section:"kanban",joyride:"kanban"}),t.when("/project/:pslug/taskboard/:sslug",{templateUrl:"taskboard/taskboard.html",loader:!0,section:"backlog"}),t.when("/project/:pslug/us/:usref",{templateUrl:"us/us-detail.html",loader:!0,section:"backlog-kanban"}),t.when("/project/:pslug/task/:taskref",{templateUrl:"task/task-detail.html",loader:!0,section:"backlog-kanban"}),t.when("/project/:pslug/wiki",{redirectTo:function(t){return"/project/"+t.pslug+"/wiki/home"}}),t.when("/project/:pslug/wiki-list",{templateUrl:"wiki/wiki-list.html",loader:!0,section:"wiki"}),t.when("/project/:pslug/wiki/:slug",{templateUrl:"wiki/wiki.html",loader:!0,section:"wiki"}),t.when("/project/:pslug/team",{templateUrl:"team/team.html",loader:!0,section:"team"}),t.when("/project/:pslug/issues",{templateUrl:"issue/issues.html",loader:!0,section:"issues"}),t.when("/project/:pslug/issue/:issueref",{templateUrl:"issue/issues-detail.html",loader:!0,section:"issues"}),t.when("/project/:pslug/admin/project-profile/details",{templateUrl:"admin/admin-project-profile.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/default-values",{templateUrl:"admin/admin-project-default-values.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/modules",{templateUrl:"admin/admin-project-modules.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/export",{templateUrl:"admin/admin-project-export.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/reports",{templateUrl:"admin/admin-project-reports.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/status",{templateUrl:"admin/admin-project-values-status.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/points",{templateUrl:"admin/admin-project-values-points.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/priorities",{templateUrl:"admin/admin-project-values-priorities.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/severities",{templateUrl:"admin/admin-project-values-severities.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/types",{templateUrl:"admin/admin-project-values-types.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/custom-fields",{templateUrl:"admin/admin-project-values-custom-fields.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/tags",{templateUrl:"admin/admin-project-values-tags.html",section:"admin"}),t.when("/project/:pslug/admin/memberships",{templateUrl:"admin/admin-memberships.html",section:"admin"}),t.when("/project/:pslug/admin/roles",{templateUrl:"admin/admin-roles.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/webhooks",{templateUrl:"admin/admin-third-parties-webhooks.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/github",{templateUrl:"admin/admin-third-parties-github.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/gitlab",{templateUrl:"admin/admin-third-parties-gitlab.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/bitbucket",{templateUrl:"admin/admin-third-parties-bitbucket.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/gogs",{templateUrl:"admin/admin-third-parties-gogs.html",section:"admin"}),t.when("/project/:pslug/admin/contrib/:plugin",{templateUrl:"contrib/main.html"}),t.when("/project/:pslug/transfer/:token",{templateUrl:"projects/transfer/transfer-page.html",loader:!0,controller:"Project",controllerAs:"vm"}),t.when("/user-settings/user-profile",{templateUrl:"user/user-profile.html"}),t.when("/user-settings/user-change-password",{templateUrl:"user/user-change-password.html"}),t.when("/user-settings/mail-notifications",{templateUrl:"user/mail-notifications.html"}),t.when("/change-email/:email_token",{templateUrl:"user/change-email.html"}),t.when("/cancel-account/:cancel_token",{templateUrl:"user/cancel-account.html"}),t.when("/user-settings/contrib/:plugin",{templateUrl:"contrib/user-settings.html"}),t.when("/profile",{templateUrl:"profile/profile.html",loader:!0,access:{requiresLogin:!0},controller:"Profile",controllerAs:"vm"}),t.when("/profile/:slug",{templateUrl:"profile/profile.html",loader:!0,controller:"Profile",controllerAs:"vm"}),t.when("/login",{templateUrl:"auth/login.html",title:"LOGIN.PAGE_TITLE",description:"LOGIN.PAGE_DESCRIPTION",disableHeader:!0,controller:"LoginPage"}),t.when("/register",{templateUrl:"auth/register.html",title:"REGISTER.PAGE_TITLE",description:"REGISTER.PAGE_DESCRIPTION",disableHeader:!0}),t.when("/forgot-password",{templateUrl:"auth/forgot-password.html",title:"FORGOT_PASSWORD.PAGE_TITLE",description:"FORGOT_PASSWORD.PAGE_DESCRIPTION",disableHeader:!0}),t.when("/change-password/:token",{templateUrl:"auth/change-password-from-recovery.html",title:"CHANGE_PASSWORD.PAGE_TITLE",description:"CHANGE_PASSWORD.PAGE_TITLE",disableHeader:!0}),t.when("/invitation/:token",{templateUrl:"auth/invitation.html",title:"INVITATION.PAGE_TITLE",description:"INVITATION.PAGE_DESCRIPTION",disableHeader:!0}),t.when("/external-apps",{templateUrl:"external-apps/external-app.html",title:"EXTERNAL_APP.PAGE_TITLE",description:"EXTERNAL_APP.PAGE_DESCRIPTION",controller:"ExternalApp",controllerAs:"vm",disableHeader:!0,mobileViewport:!0}),t.when("/blocked-project/:pslug/",{templateUrl:"projects/project/blocked-project.html",loader:!0}),t.when("/error",{templateUrl:"error/error.html"}),t.when("/not-found",{templateUrl:"error/not-found.html"}),t.when("/permission-denied",{templateUrl:"error/permission-denied.html"}),t.otherwise({templateUrl:"error/not-found.html"}),e.html5Mode({enabled:!0,requireBase:!1}),f={"Content-Type":"application/json","Accept-Language":window.taigaConfig.defaultLanguage||"en","X-Session-Id":a.sessionId},r.defaults.headers["delete"]=f,r.defaults.headers.patch=f,r.defaults.headers.post=f,r.defaults.headers.put=f,r.defaults.headers.get={"X-Session-Id":a.sessionId},r.useApplyAsync(!0),i.setSessionId(a.sessionId),l=function(t,e,r,n,i){var o;return o=function(o){var s,a;return 0===o.status||o.status===-1&&!o.config.cancelable?(n.closeAll(),i.error()):401===o.status&&e.url().indexOf("/login")===-1&&(s=e.url(),a=e.search(),a.force_next?e.url(r.resolve("login")).search("force_next",a.force_next):e.url(r.resolve("login")).search({unauthorized:!0,next:s})),t.reject(o)},{responseError:o}},n.factory("authHttpIntercept",["$q","$location","$tgNavUrls","lightboxService","tgErrorHandlingService",l]),r.interceptors.push("authHttpIntercept"),d=function(t,e){return{request:function(t){return e.logRequest(),t},requestError:function(r){return e.logResponse(),t.reject(r)},responseError:function(r){return e.logResponse(),t.reject(r)},response:function(t){return e.logResponse(),t}}},n.factory("loaderIntercept",["$q","tgLoader",d]),r.interceptors.push("loaderIntercept"),y=function(t){var e;return e=function(e){var r;return 400===e.status&&e.data.version&&(r=angular.element("body").injector(),r.invoke(["$tgConfirm","$translate",function(t){return function(t,e){var r;return r=e.instant("ERROR.VERSION_ERROR"),t.notify("error",r,null,1e4)}}(this)])),t.reject(e)},{responseError:e}},n.factory("versionCheckHttpIntercept",["$q",y]),r.interceptors.push("versionCheckHttpIntercept"),p=function(t,e){var r,n,i;return r=function(){return e.block()},i=function(t){return t.data.blocked_code&&r(),t},n=function(e){return 451===e.status&&r(),t.reject(e)},{response:i,responseError:n}},n.factory("blockingIntercept",["$q","tgErrorHandlingService",p]),r.interceptors.push("blockingIntercept"),o.debugInfoEnabled(window.taigaConfig.debugInfo||!1),localStorage.userInfo&&(v=JSON.parse(localStorage.userInfo)),m=(null!=v?v.lang:void 0)||window.taigaConfig.defaultLanguage||"en",c.addPart("taiga"),s.useLoader("$translatePartialLoader",{urlTemplate:"/"+window._version+"/locales/{part}/locale-{lang}.json"}).useSanitizeValueStrategy("escapeParameters").addInterpolation("$translateMessageFormatInterpolation").preferredLanguage(m),s.fallbackLanguage(m),h=window.getDecorators(),_.each(h,function(t){return n.decorator(t.provider,t.decorator)})},e=function(t,e){var r;return moment.locale(t),"en"!==t&&ljs.load("/"+window._version+"/locales/moment-locales/"+t+".js"),r={defaultMessage:e.instant("COMMON.FORM_ERRORS.DEFAULT_MESSAGE"),type:{email:e.instant("COMMON.FORM_ERRORS.TYPE_EMAIL"),url:e.instant("COMMON.FORM_ERRORS.TYPE_URL"),urlstrict:e.instant("COMMON.FORM_ERRORS.TYPE_URLSTRICT"),number:e.instant("COMMON.FORM_ERRORS.TYPE_NUMBER"),digits:e.instant("COMMON.FORM_ERRORS.TYPE_DIGITS"),dateIso:e.instant("COMMON.FORM_ERRORS.TYPE_DATEISO"),alphanum:e.instant("COMMON.FORM_ERRORS.TYPE_ALPHANUM"),phone:e.instant("COMMON.FORM_ERRORS.TYPE_PHONE")},notnull:e.instant("COMMON.FORM_ERRORS.NOTNULL"),notblank:e.instant("COMMON.FORM_ERRORS.NOT_BLANK"),required:e.instant("COMMON.FORM_ERRORS.REQUIRED"),regexp:e.instant("COMMON.FORM_ERRORS.REGEXP"),min:e.instant("COMMON.FORM_ERRORS.MIN"),max:e.instant("COMMON.FORM_ERRORS.MAX"),range:e.instant("COMMON.FORM_ERRORS.RANGE"),minlength:e.instant("COMMON.FORM_ERRORS.MIN_LENGTH"),maxlength:e.instant("COMMON.FORM_ERRORS.MAX_LENGTH"),rangelength:e.instant("COMMON.FORM_ERRORS.RANGE_LENGTH"),mincheck:e.instant("COMMON.FORM_ERRORS.MIN_CHECK"),maxcheck:e.instant("COMMON.FORM_ERRORS.MAX_CHECK"),rangecheck:e.instant("COMMON.FORM_ERRORS.RANGE_CHECK"),equalto:e.instant("COMMON.FORM_ERRORS.EQUAL_TO"),linewidth:e.instant("COMMON.FORM_ERRORS.LINEWIDTH"),pikaday:e.instant("COMMON.FORM_ERRORS.PIKADAY")},checksley.updateMessages("default",r)},r=function(t,r,n,i,o,s,c,u,l,p,h,f,d){var g,m,v;return t.debug("Initialize application"),r.$on("$translatePartialLoaderStructureChanged",function(){return s.refresh()}),v={linewidth:function(t,e){var r,n;return r=a.nl2br(t).split("
    "),n=_.every(r,function(t){return t.length\r\n]?)(\r\n|\n\r|\r|\n)/g,"$1"+e+"$2")}}(this),r=function(t){return function(t){var e,r;return e=_.keys(t),r=[],_.forIn(t,function(t,n){if(R.call(e,n)<0&&_.isFunction(t))return r.push(n)}),_.bindAll(t,r)}}(this),n=function(t){return function(t,e,r){var n,i;return i=t.$eval(e),void 0!==i?r(i):(n=null,n=t.$watch(e,function(t){if(void 0!==t)return r(t),n?n():void 0}))}}(this),m=function(){var t,e,r,n,i,o,s,a;for(e=arguments[0],o=2<=arguments.length?M.call(arguments,1):[],t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return U(e,t),e}(e),r=o.length-1;r>=0;r+=-1){i=o[r],a=i.prototype;for(s in a)n=a[s],t.prototype[s]=n}return t},w=function(t,e){return _.trim(t,e)},k=function(t){return t.toString().toLowerCase().trim().replace(/\s+/g,"-").replace(/&/g,"-and-").replace(/[^\w\-]+/g,"").replace(/\-\-+/g,"-")},O=function(t){return t?_.capitalize(t.replace(/-/g," ")):t},P=function(t,e){var r,n;return r=t.data("nextTextPosition"),(null==r||r>=e.length)&&(r=0),n=e[r],t.data("nextTextPosition",r+1),t.text(n)},p=function(t,e){var r,n,i,o;for(o={},r=0,i=t.length;re&&(n=n.substring(0,e+1),n=n.substring(0,Math.min(n.length,n.lastIndexOf(" "))),n+=r),n):t},j=function(t,e){var r,n,i;return null==e&&(e=1),isNaN(parseFloat(t))||!isFinite(t)?"-":0===t?"0 bytes":(i=["bytes","KB","MB","GB","TB","PB"],r=Math.floor(Math.log(t)/Math.log(1024)),r>5&&(r=5),n=(t/Math.pow(1024,r)).toFixed(e),n+" "+i[r])},I=function(t,e){var r;return e?(r=new RegExp("<(?!"+e+"s*/?)[^>]+>","gi"),String(t).replace(r,"")):String(t).replace(/<\/?[^>]+>/g,"")},b=function(t,e,r){var n;return n=new RegExp("<("+e+")>","gi"),t=t.replace(n,"<"+r+">"),n=new RegExp("","gi"),t=t.replace(n,"")},a=function(t){return function(t,e,r){return Object.defineProperty(t,e,{get:function(){var t;if(!_.isFunction(r))throw"defineImmutableProperty third param must be a function";if(t=r(),t&&_.isObject(t)&&void 0===t.size)throw"defineImmutableProperty must return immutable data";return t}})}}(this),_.mixin({removeKeys:function(t,e){return _.chain([e]).flatten().reduce(function(t,e){return delete t[e],t},t).value()},cartesianProduct:function(){return _.reduceRight(arguments,function(t,e){return _.flatten(_.map(t,function(t){return _.map(e,function(e){return[e].concat(t)})}),!0)},[[]])}}),f=function(t){return null!==t.match(/\.(jpe?g|png|gif|gifv|webm|svg|psd)/i)},h=function(t){return null!=t&&null!==t.match(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)},d=function(t){return null!==t.match(/\.(pdf)/i)},y=function(t,e){var r;return r={},e.forEach(function(e,n){if(e!==t.get(n))return e.toJS?r[n]=e.toJS():r[n]=e}),r},t=["#fce94f","#edd400","#c4a000","#8ae234","#73d216","#4e9a06","#d3d7cf","#fcaf3e","#f57900","#ce5c00","#729fcf","#3465a4","#204a87","#888a85","#ad7fa8","#75507b","#5c3566","#ef2929","#cc0000","#a40000","#222222"],l=function(){return _.sample(t)},c=function(){return _.clone(t)},u=function(t,e,r){var n,i;for(r||(r=1),i=[],n=null;n=e.exec(t);)r===-1?i.push(n):i.push(n[r]);return i},E=this.taiga,E.addClass=e,E.nl2br=v,E.bindMethods=r,E.bindOnce=n,E.mixOf=m,E.trim=w,E.slugify=k,E.unslugify=O,E.toggleText=P,E.groupBy=p,E.timeout=T,E.cancelTimeout=i,E.scopeDefer=S,E.toString=C,E.joinStr=g,E.truncate=A,E.debounce=o,E.debounceLeading=s,E.startswith=$,E.sizeFormat=j,E.stripTags=I,E.replaceTags=b,E.defineImmutableProperty=a,E.isImage=f,E.isEmail=h,E.isPdf=d,E.patch=y,E.getRandomDefaultColor=l,E.getDefaulColorList=c,E.getMatches=u}.call(this),function(){var t,e,r,n,i,o,s,a;o=this.taiga,n=this.taiga.groupBy,i=this.taiga.joinStr,a=this.taiga.trim,s=this.taiga.toString,e=function(){function t(){}return t.prototype.fillUsersAndRoles=function(t,e){var r,i;return r=_.filter(t,function(t){return function(t){return t.is_active}}(this)),this.scope.activeUsers=_.sortBy(r,"full_name_display"),this.scope.activeUsersById=n(this.scope.activeUsers,function(t){return t.id}),this.scope.users=_.sortBy(t,"full_name_display"),this.scope.usersById=n(this.scope.users,function(t){return t.id}),this.scope.roles=_.sortBy(e,"order"),i=_(this.scope.project.members).map("role").uniq().value(),this.scope.computableRoles=_(e).filter("computable").filter(function(t){return _.includes(i,t.id)}).value()},t.prototype.loadUsersAndRoles=function(){var t;return t=this.q.all([this.rs.projects.usersList(this.scope.projectId),this.rs.projects.rolesList(this.scope.projectId)]),t.then(function(t){return function(e){var r,n;return n=e[0],r=e[1],t.fillUsersAndRoles(n,r),e}}(this))},t}(),o.PageMixin=e,t=function(){function t(){}return t.prototype.selectFilter=function(t,e,r){var n,s,c;if(null==r&&(r=!1),c=this.location.search(),void 0!==c[t]&&"page"!==t&&(n=_.map(o.toString(c[t]).split(","),function(t){return a(t)}),n.push(o.toString(e)),n=_.compact(n),e=i(",",_.uniq(n))),!this.location.isInCurrentRouteParams(t,e))return s=r?this.location:this.location.noreload(this.scope),s.search(t,e)},t.prototype.replaceFilter=function(t,e,r){var n;if(null==r&&(r=!1),!this.location.isInCurrentRouteParams(t,e))return n=r?this.location:this.location.noreload(this.scope),n.search(t,e)},t.prototype.replaceAllFilters=function(t,e){var r;return null==e&&(e=!1),r=e?this.location:this.location.noreload(this.scope),r.search(t)},t.prototype.unselectFilter=function(t,e,r){var n,s,c,u;if(null==r&&(r=!1),c=this.location.search(),void 0!==c[t])return void 0!==e&&null!==e||delete c[t],u=_.map(o.toString(c[t]).split(","),function(t){return a(t)}),s=_.reject(u,function(t){return t===o.toString(e)}),s=_.compact(s),e=_.isEmpty(s)?null:i(",",_.uniq(s)),n=r?this.location:this.location.noreload(this.scope),n.search(t,e)},t.prototype.applyStoredFilters=function(t,e){var r;return!(!_.isEmpty(this.location.search())||(r=this.getFilters(t,e),!Object.keys(r).length))&&(this.location.search(r),this.location.replace(),!0)},t.prototype.storeFilters=function(t,e,r){var n,i;return i=t+":"+r,n=o.generateHash([t,i]),this.storage.set(n,e)},t.prototype.getFilters=function(t,e){var r,n;return n=t+":"+e,r=o.generateHash([t,n]),this.storage.get(r)||{}},t.prototype.formatSelectedFilters=function(t,e,r){var n,i,o,s,a;return s=r.split(","),o=_.filter(e,function(t){return s.indexOf(_.toString(t.id))!==-1}),i=_.filter(s,function(t){return!_.find(o,function(e){return _.toString(e.id)===t})}),n=_.map(i,function(e){return{id:e,key:t+":"+e,dataType:t,name:e}}),a=_.map(o,function(e){return{id:e.id,key:t+":"+e.id,dataType:t,name:e.name,color:e.color}}),n.concat(a)},t}(),o.FiltersMixin=t,r=function(){function t(){}return t.prototype.changeQ=function(t){return this.replaceFilter("q",t),this.filtersReloadContent(),this.generateFilters()},t.prototype.removeFilter=function(t){return this.unselectFilter(t.dataType,t.id),this.filtersReloadContent(),this.generateFilters()},t.prototype.addFilter=function(t){return this.selectFilter(t.category.dataType,t.filter.id),this.filtersReloadContent(),this.generateFilters()},t.prototype.selectCustomFilter=function(t){return this.replaceAllFilters(t.filter),this.filtersReloadContent(),this.generateFilters()},t.prototype.saveCustomFilter=function(t){var e,r;return e={},r=this.location.search(),e.tags=r.tags,e.status=r.status,e.assigned_to=r.assigned_to,e.owner=r.owner,e.epic=r.epic,e.role=r.role,this.filterRemoteStorageService.getFilters(this.scope.projectId,this.storeCustomFiltersName).then(function(r){return function(n){return n[t]=e,r.filterRemoteStorageService.storeFilters(r.scope.projectId,n,r.storeCustomFiltersName).then(r.generateFilters)}}(this))},t.prototype.removeCustomFilter=function(t){return this.filterRemoteStorageService.getFilters(this.scope.projectId,this.storeCustomFiltersName).then(function(e){return function(r){return delete r[t.id],e.filterRemoteStorageService.storeFilters(e.scope.projectId,r,e.storeCustomFiltersName).then(e.generateFilters),e.generateFilters()}}(this))},t.prototype.isFilterDataTypeSelected=function(t){var e,r,n,i;for(i=this.selectedFilters,r=0,n=i.length;r0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),c=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),a=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),s=_.map(o.epics,function(t){return t.id?(t.id=t.id.toString(),t.name="#"+t.ref+" "+t.subject):(t.id="null",t.name="Not in an epic"),t}),t.selectedFilters=[],e.status&&(u=t.formatSelectedFilters("status",l,e.status),t.selectedFilters=t.selectedFilters.concat(u)),e.tags&&(u=t.formatSelectedFilters("tags",p,e.tags),t.selectedFilters=t.selectedFilters.concat(u)),e.assigned_to&&(u=t.formatSelectedFilters("assigned_to",n,e.assigned_to),t.selectedFilters=t.selectedFilters.concat(u)),e.owner&&(u=t.formatSelectedFilters("owner",a,e.owner),t.selectedFilters=t.selectedFilters.concat(u)),e.epic&&(u=t.formatSelectedFilters("epic",s,e.epic),t.selectedFilters=t.selectedFilters.concat(u)),e.role&&(u=t.formatSelectedFilters("role",c,e.role),t.selectedFilters=t.selectedFilters.concat(u)),t.filterQ=e.q,t.filters=[{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:l},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:p,hideEmpty:!0,totalTaggedElements:h.length},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:c},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:a},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.EPIC"),dataType:"epic",content:s}],t.customFilters=[],_.forOwn(i,function(e,r){return t.customFilters.push({id:r,name:r,filter:e})})}}(this))},t}(),o.UsFiltersMixin=r}.call(this),function(){var t;t=angular.module("taigaAdmin",[])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f=function(t,e){function r(){this.constructor=t}for(var n in e)d.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},d={}.hasOwnProperty;h=this.taiga,l=this.taiga.debounce,p=angular.module("taigaAuth",["taigaResources"]),a=function(){function t(t,e,r,n,i){var o;t.isAuthenticated()&&(n.force_login||(o=r.resolve("home"),n.next&&(o=decodeURIComponent(n.next),e.search("next",null)),n.unauthorized?(i.clear(),i.removeToken()):e.url(o)))}return t.$inject=["tgCurrentUserService","$location","$tgNavUrls","$routeParams","$tgAuth"],t}(),p.controller("LoginPage",a),t=function(t){function e(t,r,n,i,o,s,a,c,u,l,p){var h;this.rootscope=t,this.storage=r,this.model=n,this.rs=i,this.http=o,this.urls=s,this.config=a,this.translate=c,this.currentUserService=u,this.themeService=l,this.analytics=p,e.__super__.constructor.call(this),h=this.getUser(),this._currentTheme=this._getUserTheme(),this.setUserdata(h)}return f(e,t),e.$inject=["$rootScope","$tgStorage","$tgModel","$tgResources","$tgHttp","$tgUrls","$tgConfig","$translate","tgCurrentUserService","tgThemeService","$tgAnalytics"],e.prototype.setUserdata=function(t){return t?(this.userData=Immutable.fromJS(t.getAttrs()),this.currentUserService.setUser(this.userData)):this.userData=null,this.analytics.setUserId()},e.prototype._getUserTheme=function(){var t;return(null!=(t=this.rootscope.user)?t.theme:void 0)||this.config.get("defaultTheme")||"taiga"},e.prototype._setTheme=function(){var t;if(t=this._getUserTheme(),this._currentTheme!==t)return this._currentTheme=t,this.themeService.use(this._currentTheme)},e.prototype._setLocales=function(){var t,e;return t=(null!=(e=this.rootscope.user)?e.lang:void 0)||this.config.get("defaultLanguage")||"en",this.translate.preferredLanguage(t),this.translate.use(t)},e.prototype.getUser=function(){var t,e;return this.rootscope.user?this.rootscope.user:(e=this.storage.get("userInfo"))?(t=this.model.make_model("users",e),this.rootscope.user=t,this._setLocales(),this._setTheme(),t):(this._setTheme(),null)},e.prototype.setUser=function(t){return this.rootscope.auth=t,this.storage.set("userInfo",t.getAttrs()),this.rootscope.user=t,this.setUserdata(t),this._setLocales(),this._setTheme()},e.prototype.clear=function(){return this.rootscope.auth=null,this.rootscope.user=null,this.storage.remove("userInfo")},e.prototype.setToken=function(t){return this.storage.set("token",t)},e.prototype.getToken=function(){return this.storage.get("token")},e.prototype.removeToken=function(){return this.storage.remove("token")},e.prototype.isAuthenticated=function(){return null!==this.getUser()},e.prototype.refresh=function(){var t;return t=this.urls.resolve("user-me"),this.http.get(t).then(function(t){return function(e,r){var n;return n=e.data,n.token=t.getUser().auth_token,n=t.model.make_model("users",n),t.setUser(n),t.rootscope.$broadcast("auth:refresh",n),n}}(this))},e.prototype.login=function(t,e){var r;return r=this.urls.resolve("auth"),t=_.clone(t,!1),t.type=e?e:"normal",this.removeToken(),this.http.post(r,t).then(function(t){return function(e,r){var n;return n=t.model.make_model("users",e.data),t.setToken(n.auth_token),t.setUser(n),t.rootscope.$broadcast("auth:login",n),n}}(this))},e.prototype.logout=function(){return this.removeToken(),this.clear(),this.currentUserService.removeUser(),this._setTheme(),this._setLocales(),this.rootscope.$broadcast("auth:logout"),this.analytics.setUserId()},e.prototype.register=function(t,e,r){var n;return n=this.urls.resolve("auth-register"),t=_.clone(t,!1),t.type=e?e:"public","private"===e&&(t.existing=!!r&&r),this.removeToken(),this.http.post(n,t).then(function(t){return function(e){ -var r;return r=t.model.make_model("users",e.data),t.setToken(r.auth_token),t.setUser(r),t.rootscope.$broadcast("auth:register",r),r}}(this))},e.prototype.getInvitation=function(t){return this.rs.invitations.get(t)},e.prototype.acceptInvitiationWithNewUser=function(t){return this.register(t,"private",!1)},e.prototype.forgotPassword=function(t){var e;return e=this.urls.resolve("users-password-recovery"),t=_.clone(t,!1),this.removeToken(),this.http.post(e,t)},e.prototype.changePasswordFromRecovery=function(t){var e;return e=this.urls.resolve("users-change-password-from-recovery"),t=_.clone(t,!1),this.removeToken(),this.http.post(e,t)},e.prototype.changeEmail=function(t){var e;return e=this.urls.resolve("users-change-email"),t=_.clone(t,!1),this.http.post(e,t)},e.prototype.cancelAccount=function(t){var e;return e=this.urls.resolve("users-cancel-account"),t=_.clone(t,!1),this.http.post(e,t)},e}(h.Service),p.service("$tgAuth",t),c=function(t,e,r,n){var i,o;return i=n.get("auth/login-text.html",!0),o=function(){var n,o,s;return(o=t.get("publicRegisterEnabled"))?(s=e.resolve("register"),r.force_next&&(n=encodeURIComponent(r.force_next),s+="?next="+n),i({url:s})):""},{restrict:"AE",scope:{},template:o}},p.directive("tgPublicRegisterMessage",["$tgConfig","$tgNavUrls","$routeParams","$tgTemplate",c]),s=function(t,e,r,n,i,o,s,a,c,u){var p;return p=function(p,h,f){var d,g,m,v;return d=new checksley.Form(h.find("form.login-form")),i.next&&i.next!==o.resolve("login")?p.nextUrl=decodeURIComponent(i.next):p.nextUrl=o.resolve("home"),i.force_next&&(p.nextUrl=decodeURIComponent(i.force_next)),m=function(t){return s.setupConnection(),u.trackEvent("auth","login","user login",1),0===p.nextUrl.indexOf("http")?c.location.href=p.nextUrl:r.url(p.nextUrl)},g=function(t){return e.notify("light-error",a.instant("LOGIN_FORM.ERROR_AUTH_INCORRECT"))},p.onKeyUp=function(t){var e,r;if(e=angular.element(t.currentTarget),r=e.val(),p.iscapsLockActivated=!1,r!==r.toLowerCase())return p.iscapsLockActivated=!0},v=l(2e3,function(e){return function(e){var r,i,o;if(e.preventDefault(),d.validate())return r={username:h.find("form.login-form input[name=username]").val(),password:h.find("form.login-form input[name=password]").val()},i=n.get("loginFormType","normal"),o=t.login(r,i),o.then(m,g)}}(this)),h.on("submit","form",v),window.prerenderReady=!0,p.$on("$destroy",function(){return h.off()})},{link:p}},p.directive("tgLogin",["$tgAuth","$tgConfirm","$tgLocation","$tgConfig","$routeParams","$tgNavUrls","$tgEvents","$translate","$window","$tgAnalytics",s]),u=function(t,e,r,n,i,o,s,a,c){var u;return u=function(u,p,h){var f,d,g,m;return i.get("publicRegisterEnabled")||(r.path(n.resolve("not-found")),r.replace()),u.data={},f=p.find("form").checksley({onlyOneErrorElement:!0}),o.next&&o.next!==n.resolve("login")?u.nextUrl=decodeURIComponent(o.next):u.nextUrl=n.resolve("home"),g=function(t){return s.trackEvent("auth","register","user registration",1),0===u.nextUrl.indexOf("http")?c.location.href=u.nextUrl:r.url(u.nextUrl)},d=function(t){var r;return t.data._error_message&&(r=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),e.notify("light-error",r)),f.setErrors(t.data)},m=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),f.validate())return r=t.register(u.data),r.then(g,d)}}(this)),p.on("submit","form",m),u.$on("$destroy",function(){return p.off()}),window.prerenderReady=!0},{link:u}},p.directive("tgRegister",["$tgAuth","$tgConfirm","$tgLocation","$tgNavUrls","$tgConfig","$routeParams","$tgAnalytics","$translate","$window",u]),i=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,p,h;return o.data={},c=s.find("form").checksley(),p=function(t){var o,s;return r.path(n.resolve("login")),s=i.instant("FORGOT_PASSWORD_FORM.SUCCESS_TITLE"),o=i.instant("FORGOT_PASSWORD_FORM.SUCCESS_TEXT"),e.success(s,o)},u=function(t){var r;return r=i.instant("FORGOT_PASSWORD_FORM.ERROR"),e.notify("light-error",r)},h=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),c.validate())return r=t.forgotPassword(o.data),r.then(p,u)}}(this)),s.on("submit","form",h),o.$on("$destroy",function(){return s.off()}),window.prerenderReady=!0},{link:o}},p.directive("tgForgotPassword",["$tgAuth","$tgConfirm","$tgLocation","$tgNavUrls","$translate",i]),n=function(t,e,r,n,i,o){var s;return s=function(s,a,c){var u,p,h,f,d;return s.data={},null!=n.token?(s.tokenInParams=!0,s.data.token=n.token):(r.path(i.resolve("login")),d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.ERROR"),e.notify("light-error",d)),u=a.find("form").checksley(),h=function(t){return r.path(i.resolve("login")),d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS"),e.success(d)},p=function(t){return d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.ERROR"),e.notify("light-error",d)},f=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),u.validate())return r=t.changePasswordFromRecovery(s.data),r.then(h,p)}}(this)),a.on("submit","form",f),s.$on("$destroy",function(){return a.off()})},{link:s}},p.directive("tgChangePasswordFromRecovery",["$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls","$translate",n]),o=function(t,e,r,n,i,o,s,a,c){var u;return u=function(u,p,h){var f,d,g,m,v,y,b,S,j,k;return k=i.token,y=t.getInvitation(k),y.then(function(t){return u.invitation=t,u.publicRegisterEnabled=c.get("publicRegisterEnabled")}),y.then(null,function(t){var n;return r.path(o.resolve("login")),n=a.instant("INVITATION_LOGIN_FORM.NOT_FOUND"),e.notify("light-error",n)}),u.dataLogin={token:k},f=p.find("form.login-form").checksley({onlyOneErrorElement:!0}),m=function(t){var n;return s.trackEvent("auth","invitationAccept","invitation accept with existing user",1),r.path(o.resolve("project",{project:u.invitation.project_slug})),n=a.instant("INVITATION_LOGIN_FORM.SUCCESS",{project_name:u.invitation.project_name}),e.notify("success",n)},d=function(t){return e.notify("light-error",t.data._error_message)},S=l(2e3,function(e){return function(e){var r,i;if(e.preventDefault(),f.validate())return i=n.get("loginFormType","normal"),r=u.dataLogin,y=t.login({username:r.username,password:r.password,invitation_token:r.token},i),y.then(m,d)}}(this)),p.on("submit","form.login-form",S),p.on("click",".button-login",S),u.dataRegister={token:k},b=p.find("form.register-form").checksley({onlyOneErrorElement:!0}),v=function(t){return s.trackEvent("auth","invitationAccept","invitation accept with new user",1),r.path(o.resolve("project",{project:u.invitation.project_slug})),e.notify("success","You've successfully joined this project","Welcome to "+_.escape(u.invitation.project_name))},g=function(t){var r;return t.data._error_message&&(r=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),e.notify("light-error",r)),b.setErrors(t.data)},j=l(2e3,function(e){return function(e){if(e.preventDefault(),b.validate())return y=t.acceptInvitiationWithNewUser(u.dataRegister),y.then(v,g)}}(this)),p.on("submit","form.register-form",j),p.on("click",".button-register",j),u.$on("$destroy",function(){return p.off()})},{link:u}},p.directive("tgInvitation",["$tgAuth","$tgConfirm","$tgLocation","$tgConfig","$routeParams","$tgNavUrls","$tgAnalytics","$translate","$tgConfig",o]),r=function(t,e,r,n,i,o,s,a){var c;return c=function(e,c,u){var l,p,h,f;return e.data={},e.data.email_token=o.email_token,l=c.find("form").checksley(),h=function(e){var o;return r.isAuthenticated()?t.queryOne("users",r.getUser().id).then(function(t){return function(t){return r.setUser(t),i.path(s.resolve("home")),i.replace()}}(this)):(i.path(s.resolve("login")),i.replace()),o=a.instant("CHANGE_EMAIL_FORM.SUCCESS"),n.success(o)},p=function(t){var e;return e=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),n.notify("light-error",e)},f=function(){var t;if(l.validate())return t=r.changeEmail(e.data),t.then(h,p)},c.on("submit",function(t){return t.preventDefault(),f()}),c.on("click","a.button-change-email",function(t){return t.preventDefault(),f()}),e.$on("$destroy",function(){return c.off()})},{link:c}},p.directive("tgChangeEmail",["$tgRepo","$tgModel","$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls","$translate",r]),e=function(t,e,r,n,i,o,s){var a;return a=function(t,e,a){var c,u,p,h;return t.data={},t.data.cancel_token=o.cancel_token,c=e.find("form").checksley(),p=function(t){var e;return r.logout(),i.path(s.resolve("home")),e=$translate.instant("CANCEL_ACCOUNT.SUCCESS"),n.success(e)},u=function(t){var e;return e=$translate.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),n.notify("error",e)},h=l(2e3,function(e){return function(e){var n;if(e.preventDefault(),c.validate())return n=r.cancelAccount(t.data),n.then(p,u)}}(this)),e.on("submit","form",h),t.$on("$destroy",function(){return e.off()})},{link:a}},p.directive("tgCancelAccount",["$tgRepo","$tgModel","$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls",e])}.call(this),function(){var t;t=angular.module("taigaBacklog",[])}.call(this),function(){var t,e,r,n,i,o,s;o=this.taiga,r=this.taiga.groupBy,e=this.taiga.bindOnce,i=angular.module("taigaBase",[]),t=function(t,e){var r;return r=function(r,n,i){return e.onresize=function(){return t.$broadcast("resize")}},{link:r}},i.directive("tgMain",["$rootScope","$window",t]),s={home:"/",projects:"/projects",error:"/error","not-found":"/not-found","permission-denied":"/permission-denied",discover:"/discover","discover-search":"/discover/search",login:"/login","forgot-password":"/forgot-password","change-password":"/change-password/:token","change-email":"/change-email/:token","cancel-account":"/cancel-account/:token",register:"/register",invitation:"/invitation/:token","create-project":"/project/new","create-project-scrum":"/project/new/scrum","create-project-kanban":"/project/new/kanban","create-project-duplicate":"/project/new/duplicate","create-project-import":"/project/new/import","create-project-import-platform":"/project/new/import/:platform",profile:"/profile","user-profile":"/profile/:username","blocked-project":"/blocked-project/:project",project:"/project/:project","project-detail-ref":"/project/:project/t/:ref","project-backlog":"/project/:project/backlog","project-taskboard":"/project/:project/taskboard/:sprint","project-kanban":"/project/:project/kanban","project-issues":"/project/:project/issues","project-epics":"/project/:project/epics","project-search":"/project/:project/search","project-epics-detail":"/project/:project/epic/:ref","project-userstories-detail":"/project/:project/us/:ref","project-tasks-detail":"/project/:project/task/:ref","project-issues-detail":"/project/:project/issue/:ref","project-wiki":"/project/:project/wiki","project-wiki-list":"/project/:project/wiki-list","project-wiki-page":"/project/:project/wiki/:slug","project-team":"/project/:project/team","project-admin-home":"/project/:project/admin/project-profile/details","project-admin-project-profile-details":"/project/:project/admin/project-profile/details","project-admin-project-profile-default-values":"/project/:project/admin/project-profile/default-values","project-admin-project-profile-modules":"/project/:project/admin/project-profile/modules","project-admin-project-profile-export":"/project/:project/admin/project-profile/export","project-admin-project-profile-reports":"/project/:project/admin/project-profile/reports","project-admin-project-values-status":"/project/:project/admin/project-values/status","project-admin-project-values-points":"/project/:project/admin/project-values/points","project-admin-project-values-priorities":"/project/:project/admin/project-values/priorities","project-admin-project-values-severities":"/project/:project/admin/project-values/severities","project-admin-project-values-types":"/project/:project/admin/project-values/types","project-admin-project-values-custom-fields":"/project/:project/admin/project-values/custom-fields","project-admin-project-values-tags":"/project/:project/admin/project-values/tags","project-admin-memberships":"/project/:project/admin/memberships","project-admin-roles":"/project/:project/admin/roles","project-admin-third-parties-webhooks":"/project/:project/admin/third-parties/webhooks","project-admin-third-parties-github":"/project/:project/admin/third-parties/github","project-admin-third-parties-gitlab":"/project/:project/admin/third-parties/gitlab","project-admin-third-parties-bitbucket":"/project/:project/admin/third-parties/bitbucket","project-admin-third-parties-gogs":"/project/:project/admin/third-parties/gogs","project-admin-contrib":"/project/:project/admin/contrib/:plugin","user-settings-user-profile":"/user-settings/user-profile","user-settings-user-change-password":"/user-settings/user-change-password","user-settings-user-avatar":"/user-settings/user-avatar","user-settings-mail-notifications":"/user-settings/mail-notifications","user-settings-contrib":"/user-settings/contrib/:plugin"},n=function(t,e){return t.debug("Initialize navigation urls"),e.update(s)},i.run(["$log","$tgNavUrls",n])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m=[].slice,v=function(t,e){function r(){this.constructor=t}for(var n in e)y.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},y={}.hasOwnProperty;g=this.taiga,d=angular.module("taigaCommon",[]),o=function(t){return{get:function(){return{i18n:{previousMonth:t.instant("COMMON.PICKERDATE.PREV_MONTH"),nextMonth:t.instant("COMMON.PICKERDATE.NEXT_MONTH"),months:[t.instant("COMMON.PICKERDATE.MONTHS.JAN"),t.instant("COMMON.PICKERDATE.MONTHS.FEB"),t.instant("COMMON.PICKERDATE.MONTHS.MAR"),t.instant("COMMON.PICKERDATE.MONTHS.APR"),t.instant("COMMON.PICKERDATE.MONTHS.MAY"),t.instant("COMMON.PICKERDATE.MONTHS.JUN"),t.instant("COMMON.PICKERDATE.MONTHS.JUL"),t.instant("COMMON.PICKERDATE.MONTHS.AUG"),t.instant("COMMON.PICKERDATE.MONTHS.SEP"),t.instant("COMMON.PICKERDATE.MONTHS.OCT"),t.instant("COMMON.PICKERDATE.MONTHS.NOV"),t.instant("COMMON.PICKERDATE.MONTHS.DEC")],weekdays:[t.instant("COMMON.PICKERDATE.WEEK_DAYS.SUN"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.MON"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.TUE"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.WED"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.THU"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.FRI"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.SAT")],weekdaysShort:[t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT")]},isRTL:"true"===t.instant("COMMON.PICKERDATE.IS_RTL"),firstDay:parseInt(t.instant("COMMON.PICKERDATE.FIRST_DAY_OF_WEEK"),10),format:t.instant("COMMON.PICKERDATE.FORMAT")}}}},d.factory("tgDatePickerConfigService",["$translate",o]),l=function(t,e){var r;return r=function(){return t.getSelection?t.getSelection().toString():e.selection?e.selection.createRange().text:""},{get:r}},d.factory("$selectedText",["$window","$document",l]),n=function(t){var e,r;return r=function(t,e,r){if(e&&r&&e.get("my_permissions").indexOf(r)>-1)return t.removeClass("hidden")},e=function(e,n,i){var o,s,a;return n.addClass("hidden"),o=i.tgCheckPermission,a=e.$watch(function(){return t.project},function(){if(t.project)return r(n,t.project,o),a()}),s=i.$observe("tgCheckPermission",function(e){if(e)return r(n,t.project,e),s()}),e.$on("$destroy",function(){return n.off()})},{link:e}},n.$inject=["tgProjectService"],d.directive("tgCheckPermission",n),i=function(){var t,e;return e="tgClassPermission",t=function(t,r,n){var i,o,s;return i=function(t,e,n){var i;return i="!"===n[0],i&&(n=n.slice(1)),i&&t.my_permissions.indexOf(n)===-1?r.addClass(e):i||t.my_permissions.indexOf(n)===-1?r.removeClass(e):r.addClass(e)},o=function(r){var o,a,c,u;if(r){s(),a=t.$eval(n[e]),u=[];for(o in a)c=a[o],u.push(i(r,o,c));return u}},s=t.$watch("project",o)},{link:t}},d.directive("tgClassPermission",i),t=function(){var t,e,r,n;return e=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,r=function(t){return function(t){var i;if(i=n.shift(),i(),n.length)return e(r)}}(this),n=[],t=function(){var t,i,o,s;for(s=[],i=0,o=arguments.length;i-1?t.resolve("project-backlog",r):e.is_kanban_activated&&e.my_permissions.indexOf("view_us")>-1?t.resolve("project-kanban",r):e.is_wiki_activated&&e.my_permissions.indexOf("view_wiki_pages")>-1?t.resolve("project-wiki",r):e.is_issues_activated&&e.my_permissions.indexOf("view_issues")>-1?t.resolve("project-issues",r):t.resolve("project",r)},{get:e}},d.factory("$projectUrl",["$tgNavUrls",a]),c=function(t){var e,r,n;return e=t.defer(),e.resolve(),r=e.promise,n={bindAdd:function(t){return function(e){return function(){var n;return n=1<=arguments.length?m.call(arguments,0):[],r=r.then(function(){return e.apply(t,n)})}}}(this),add:function(t){return function(t){return r=r?r.then(t):t(),n}}(this)}},d.factory("$tgQqueue",["$q",c]),u=function(t){function e(t,e,r,n){this.qqueue=t,this.repo=e,this.q=r,this.model=n}return v(e,t),e.$inject=["$tgQqueue","$tgRepo","$q","$tgModel"],e.prototype.setObject=function(t,e){this.scope=t,this.prop=e},e.prototype.clone=function(){var t,e;return t=_.cloneDeep(this.scope[this.prop]._attrs),e=this.model.make_model(this.scope[this.prop]._name,t)},e.prototype.getObj=function(){return this.scope[this.prop]},e.prototype.save=function(t){var e;return e=this.q.defer(),this.qqueue.add(function(r){return function(){var n,i,o,s,a;return s=r.getObj(),i=s.comment,s.comment="",n=r.clone(),o=_.omit(s._modifiedAttrs,["version"]),n=_.assign(n,o),t(n),i.length&&(n.comment=i),a=function(){return r.scope[r.prop]=n,e.resolve.apply(null,arguments)},r.repo.save(n).then(a,e.reject)}}(this)),e.promise},e}(g.Service),d.service("$tgQueueModelTransformation",u),h=function(t){return{get:function(e){return function(e,r){var n;return null==r&&(r=!1),n=t.get(e),r&&(n=_.template(n)),n}}(this)}},d.factory("$tgTemplate",["$templateCache",h]),r=function(){var t;return t="",{template:t}},d.directive("tgCapslock",[r]),s=function(){var t,e;return e='\n \n',t=function(t,e,r){},{scope:{onClose:"&"},link:t,template:e}},d.directive("tgLightboxClose",[s]),p=function(){var t;return t='\n \n {{svgTitle}}\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\n \n',{scope:{svgIcon:"@",svgTitle:"@",svgTitleTranslate:"@",svgTitleTranslateValues:"="},template:t}},d.directive("tgSvg",[p]),e=function(t,e,r){return{restrict:"A",link:function(r,n,i){var o;return i.ngShow?(o=e(i.ngShow),r.$watch(o,function(e){if(e===!0)return t(function(){return n[0].focus()})})):t(function(){return n[0].focus()})}}},d.directive("tgAutofocus",["$timeout","$parse","animationFrame",e]),d.directive("tgPreloadImage",function(){var t,e,r;return e="loading...",r="
    \n \n
    ",t=function(t,e){var r;return r=new Image,r.onload=e,r.src=t,r},{template:r,transclude:!0,replace:!0,link:function(r,n,i){var o,s,a;return o=n.find("img:last"),a=null,s=function(){if(n.find(".loading-spinner").remove(),o.show(),a)return clearTimeout(a),a=null},i.$observe("preloadSrc",function(r){return a&&clearTimeout(a),n.find(".loading-spinner").remove(),a=setTimeout(function(){return n.prepend(e)},200),o.hide(),t(r,s)})}}})}.call(this),function(){var t,e,r,n,i,o,s,a,c;a=this.taiga,o=this.taiga.mixOf,c=this.taiga.toString,i=this.taiga.joinStr,n=this.taiga.groupBy,r=this.taiga.bindOnce,e=this.taiga.bindMethods,s=angular.module("taigaCommon"),t=function(){function t(t,e,r,n,i){this.params=t,this.repo=e,this.projectService=r,this.navurls=n,this.location=i,this.repo.resolve({pslug:this.params.pslug,ref:this.params.ref}).then(function(t){return function(e){var r;return e.issue?r=t.navurls.resolve("project-issues-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.task?r=t.navurls.resolve("project-tasks-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.us?r=t.navurls.resolve("project-userstories-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.epic?r=t.navurls.resolve("project-epics-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.wikipage&&(r=t.navurls.resolve("project-wiki-page",{project:t.projectService.project.get("slug"),slug:t.params.ref})),t.location.path(r)}}(this))}return t.$inject=["$routeParams","$tgRepo","tgProjectService","$tgNavUrls","$location"],t}(),s.controller("DetailController",t)}.call(this),function(){var t;t=angular.module("taigaEpics",[])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){return function(){return t.apply(e,arguments)}};o=this.taiga,i=this.taiga.startswith,r=this.taiga.bindMethods,n=angular.module("taigaEvents",[]),e=function(){function t(t,e,n,i,o,a){this.win=t,this.log=e,this.config=n,this.auth=i,this.liveAnnouncementService=o,this.rootScope=a,this.processMessage=s(this.processMessage,this),r(this)}return t.prototype.initialize=function(t){if(this.sessionId=t,this.subscriptions={},this.connected=!1,this.error=!1,this.pendingMessages=[],this.missedHeartbeats=0,this.heartbeatInterval=null,void 0===this.win.WebSocket)return this.log.info("WebSockets not supported on your browser")},t.prototype.setupConnection=function(){var t,e,r,n;if(this.stopExistingConnection(),n=this.config.get("eventsUrl"))return i(n,"ws:")||i(n,"wss:")||(t=this.win.location,r="https:"===t.protocol?"wss:":"ws:",e=_.trimStart(n,"/"),n=r+"//"+t.host+"/"+e),this.error=!1,this.ws=new this.win.WebSocket(n),this.ws.addEventListener("open",this.onOpen),this.ws.addEventListener("message",this.onMessage),this.ws.addEventListener("error",this.onError),this.ws.addEventListener("close",this.onClose)},t.prototype.stopExistingConnection=function(){if(void 0!==this.ws)return this.ws.removeEventListener("open",this.onOpen),this.ws.removeEventListener("close",this.onClose),this.ws.removeEventListener("error",this.onError),this.ws.removeEventListener("message",this.onMessage),this.stopHeartBeatMessages(),this.ws.close(),delete this.ws},t.prototype.notifications=function(){return this.subscribe(null,"notifications",function(t){return function(e){return t.liveAnnouncementService.show(e.title,e.desc),t.rootScope.$digest()}}(this))},t.prototype.startHeartBeatMessages=function(){var t,e,r;if(!this.heartbeatInterval)return e=this.config.get("eventsMaxMissedHeartbeats",5),t=this.config.get("eventsHeartbeatIntervalTime",6e4),r=this.config.get("eventsReconnectTryInterval",1e4),this.missedHeartbeats=0,this.heartbeatInterval=setInterval(function(t){return function(){var r;try{if(t.missedHeartbeats>=e)throw new Error("Too many missed heartbeats PINGs.");return t.missedHeartbeats++,t.sendMessage({cmd:"ping"}),t.log.debug("HeartBeat send PING")}catch(n){return r=n,t.log.error("HeartBeat error: "+r.message),t.setupConnection()}}}(this),t),this.log.debug("HeartBeat enabled")},t.prototype.stopHeartBeatMessages=function(){if(this.heartbeatInterval)return clearInterval(this.heartbeatInterval),this.heartbeatInterval=null,this.log.debug("HeartBeat disabled")},t.prototype.processHeartBeatPongMessage=function(t){return this.missedHeartbeats=0,this.log.debug("HeartBeat recived PONG")},t.prototype.serialize=function(t){return _.isObject(t)?JSON.stringify(t):t},t.prototype.sendMessage=function(t){var e,r,n,i,o;if(this.pendingMessages.push(t),this.connected){for(n=_.map(this.pendingMessages,this.serialize),this.pendingMessages=[],o=[],e=0,r=n.length;e\n
    <%- name %>
    '),i=function(i,c,u){var l,p,h,f,d;return d=function(t){var e,o,a;return o={name:r.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},a=i.usersById[t.assigned_to],e=n.getAvatar(a),o.imgurl=e.url,o.bg=e.bg,a&&(o.name=a.full_name_display),c.find(".avatar").html(s(o)),c.find(".task-assignedto").attr("title",o.name)},l=c.controller(),f=i.$eval(u.tgRelatedTaskAssignedToInlineEdition),h=i.$eval(u.notAutoSave),p=!h,i.$watch(u.tgRelatedTaskAssignedToInlineEdition,function(){return f=i.$eval(u.tgRelatedTaskAssignedToInlineEdition),d(f)}),d(f),c.on("click",".task-assignedto",function(t){return e.$broadcast("assigned-to:add",f)}),a.bindOnce(i,"project",function(t){if(t.my_permissions.indexOf("modify_task")===-1)return c.unbind("click"),c.find("a").addClass("not-clickable")}),i.$on("assigned-to:added",o(2e3,function(e){return function(e,r,n){if(n.id===f.id)return n.assigned_to=r,p&&t.save(n).then(function(){return i.$emit("related-tasks:assigned-to-changed")}),d(n)}}(this))),i.$on("$destroy",function(){return c.off()})},{link:i}},s.directive("tgRelatedTaskAssignedToInlineEdition",["$tgRepo","$rootScope","$translate","tgAvatarService",t])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;i=this.taiga,t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return s(e,t),e}(i.Service),o={auth:"/auth","auth-register":"/auth/register",invitations:"/invitations",users:"/users",by_username:"/users/by_username","users-password-recovery":"/users/password_recovery","users-change-password-from-recovery":"/users/change_password_from_recovery","users-change-password":"/users/change_password","users-change-email":"/users/change_email","users-cancel-account":"/users/cancel","user-stats":"/users/%s/stats","user-liked":"/users/%s/liked","user-voted":"/users/%s/voted","user-watched":"/users/%s/watched","user-contacts":"/users/%s/contacts","user-me":"/users/me",permissions:"/permissions","notify-policies":"/notify-policies","user-storage":"/user-storage",memberships:"/memberships","bulk-create-memberships":"/memberships/bulk_create",roles:"/roles",permissions:"/permissions",resolver:"/resolver",projects:"/projects","project-templates":"/project-templates","project-modules":"/projects/%s/modules","bulk-update-projects-order":"/projects/bulk_update_order","project-like":"/projects/%s/like","project-unlike":"/projects/%s/unlike","project-watch":"/projects/%s/watch","project-unwatch":"/projects/%s/unwatch","project-contact":"contact","project-transfer-validate-token":"/projects/%s/transfer_validate_token","project-transfer-accept":"/projects/%s/transfer_accept","project-transfer-reject":"/projects/%s/transfer_reject","project-transfer-request":"/projects/%s/transfer_request","project-transfer-start":"/projects/%s/transfer_start","epic-statuses":"/epic-statuses","userstory-statuses":"/userstory-statuses",points:"/points","task-statuses":"/task-statuses","issue-statuses":"/issue-statuses","issue-types":"/issue-types",priorities:"/priorities",severities:"/severities",milestones:"/milestones",epics:"/epics","epic-upvote":"/epics/%s/upvote","epic-downvote":"/epics/%s/downvote","epic-watch":"/epics/%s/watch","epic-unwatch":"/epics/%s/unwatch","epic-related-userstories":"/epics/%s/related_userstories","epic-related-userstories-bulk-create":"/epics/%s/related_userstories/bulk_create",userstories:"/userstories","bulk-create-us":"/userstories/bulk_create","bulk-update-us-backlog-order":"/userstories/bulk_update_backlog_order","bulk-update-us-milestone":"/userstories/bulk_update_milestone","bulk-update-us-miles-order":"/userstories/bulk_update_sprint_order","bulk-update-us-kanban-order":"/userstories/bulk_update_kanban_order","bulk-update-us-milestone":"/userstories/bulk_update_milestone","userstories-filters":"/userstories/filters_data","userstory-upvote":"/userstories/%s/upvote","userstory-downvote":"/userstories/%s/downvote","userstory-watch":"/userstories/%s/watch","userstory-unwatch":"/userstories/%s/unwatch",tasks:"/tasks","bulk-create-tasks":"/tasks/bulk_create","bulk-update-task-taskboard-order":"/tasks/bulk_update_taskboard_order","task-upvote":"/tasks/%s/upvote","task-downvote":"/tasks/%s/downvote","task-watch":"/tasks/%s/watch","task-unwatch":"/tasks/%s/unwatch","task-filters":"/tasks/filters_data",issues:"/issues","bulk-create-issues":"/issues/bulk_create","issues-filters":"/issues/filters_data","issue-upvote":"/issues/%s/upvote","issue-downvote":"/issues/%s/downvote","issue-watch":"/issues/%s/watch","issue-unwatch":"/issues/%s/unwatch",wiki:"/wiki","wiki-restore":"/wiki/%s/restore","wiki-links":"/wiki-links","history/epic":"/history/epic","history/us":"/history/userstory","history/issue":"/history/issue","history/task":"/history/task","history/wiki":"/history/wiki/%s","attachments/epic":"/epics/attachments","attachments/us":"/userstories/attachments","attachments/issue":"/issues/attachments","attachments/task":"/tasks/attachments","attachments/wiki_page":"/wiki/attachments","custom-attributes/epic":"/epic-custom-attributes","custom-attributes/userstory":"/userstory-custom-attributes","custom-attributes/task":"/task-custom-attributes","custom-attributes/issue":"/issue-custom-attributes","custom-attributes-values/epic":"/epics/custom-attributes-values","custom-attributes-values/userstory":"/userstories/custom-attributes-values","custom-attributes-values/task":"/tasks/custom-attributes-values","custom-attributes-values/issue":"/issues/custom-attributes-values",webhooks:"/webhooks","webhooks-test":"/webhooks/%s/test",webhooklogs:"/webhooklogs","webhooklogs-resend":"/webhooklogs/%s/resend","epics-csv":"/epics/csv?uuid=%s","userstories-csv":"/userstories/csv?uuid=%s","tasks-csv":"/tasks/csv?uuid=%s","issues-csv":"/issues/csv?uuid=%s","timeline-profile":"/timeline/profile","timeline-user":"/timeline/user","timeline-project":"/timeline/project",search:"/search",exporter:"/exporter",importer:"/importer/load_dump",feedback:"/feedback",locales:"/locales",applications:"/applications","application-tokens":"/application-tokens","stats-discover":"/stats/discover","importers-trello-auth-url":"/importers/trello/auth_url","importers-trello-authorize":"/importers/trello/authorize","importers-trello-list-projects":"/importers/trello/list_projects","importers-trello-list-users":"/importers/trello/list_users","importers-trello-import-project":"/importers/trello/import_project","importers-jira-auth-url":"/importers/jira/auth_url","importers-jira-authorize":"/importers/jira/authorize","importers-jira-list-projects":"/importers/jira/list_projects","importers-jira-list-users":"/importers/jira/list_users","importers-jira-import-project":"/importers/jira/import_project","importers-github-auth-url":"/importers/github/auth_url","importers-github-authorize":"/importers/github/authorize","importers-github-list-projects":"/importers/github/list_projects","importers-github-list-users":"/importers/github/list_users","importers-github-import-project":"/importers/github/import_project","importers-asana-auth-url":"/importers/asana/auth_url","importers-asana-authorize":"/importers/asana/authorize","importers-asana-list-projects":"/importers/asana/list_projects","importers-asana-list-users":"/importers/asana/list_users","importers-asana-import-project":"/importers/asana/import_project"},r=function(t,e){return t.debug("Initialize api urls"),e.update(o)},e=function(t,e){var r,n,i,o,s;for(t.debug("Initialize resources"),o=_.toArray(arguments).slice(2),s=[],r=0,n=o.length;rn){n=a.length,s.name=i,s.value=a;break}return 0===n?s:s},d=function(t){var e,r,n;r=[];for(e in t)n=t[e],m.find("li."+e).show(),r.push(m.find("li."+e+" .num").html(n.length));return r},f=function(t){return m.find("a.active").removeClass("active"),m.find("li."+t.name+" a").addClass("active"),u=!1,c=t.name},v={epics:r.get("search-epics"),issues:r.get("search-issues"),tasks:r.get("search-tasks"),userstories:r.get("search-userstories"),wikipages:r.get("search-wikipages")},g=function(r){var i,o,s,a,c;return o=n.find(".search-result-table").children(),s=o.scope(),s&&(s.$destroy(),o.remove()),a=t.$new(),a[r.name]=r.value,c=angular.element.parseHTML(l(v[r.name])),i=e(c)(a),n.find(".search-result-table").html(i)},t.$watch("searchResults",function(t){var e;if(h=t)return e=p(t),d(t),g(e),f(e)}),t.$watch("searchTerm",function(t){return void 0!==t&&i.search("text",t),o.trackPage(i.url(),"Search")}),n.on("click",".search-filter li > a",function(e){var r,n,i,o;return e.preventDefault(),o=angular.element(e.currentTarget),i=o.parent().data("name"),n=h?h[i]:[],r={name:i,value:n},t.$apply(function(){return g(r),f(r)})})},s=function(t,e,r){var i,o;return i=e.controller(),a(t,e,r,i),o=n.text,t.$watch("projectId",function(e){if(null!=e)return t.searchTerm=o})},{link:s}},c.directive("tgSearch",["$log","$compile","$templateCache","$routeParams","$tgLocation","$tgAnalytics",r])}.call(this),function(){var t;t=angular.module("taigaTaskboard",[])}.call(this),function(){var t;t=angular.module("taigaTasks",[])}.call(this),function(){var t;t=angular.module("taigaTeam",[])}.call(this),function(){var t;t=angular.module("taigaUserSettings",[])}.call(this),function(){var t;t=angular.module("taigaUserStories",[])}.call(this),function(){var t;t=angular.module("taigaWiki",[])}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=angular.module("taigaCommon"),t=function(t){function e(t,e,r,n,i,o){var s;this.rootscope=t,this.log=e,this.config=r,this.win=n,this.doc=i,this.location=o,this.initialized=!1,s=this.config.get("analytics",{}),this.accountId=s.accountId,this.pageEvent=s.pageEvent||"$routeChangeSuccess",this.trackRoutes=s.trackRoutes||!0,this.ignoreFirstPageLoad=s.ignoreFirstPageLoad||!1}return n(e,t),e.$inject=["$rootScope","$log","$tgConfig","$window","$document","$location"],e.prototype.initialize=function(){return this.accountId?(this.injectAnalytics(),this.win.ga("create",this.accountId,"auto"),this.win.ga("require","ec"),this.win.ga("require","displayfeatures"),this.trackRoutes&&!this.ignoreFirstPageLoad&&this.win.ga("send","pageview",this.getUrl()),this.trackRoutes&&this.rootscope.$on(this.pageEvent,function(t){return function(){return t.trackPage(t.getUrl(),"Taiga")}}(this)),this.initialized=!0,this.setUserId()):void this.log.debug("Analytics: no acount id provided. Disabling.")},e.prototype.setUserId=function(){var t,e;if(this.initialized&&this.win.ga)return this.win.ga("set","userId",null!=(t=this.rootscope)&&null!=(e=t.user)?e.uuid:void 0)},e.prototype.getUrl=function(){return this.location.path()},e.prototype.injectAnalytics=function(){var t;return(t=function(t,e,r,n,i,o,s){t.GoogleAnalyticsObject=i,t[i]=t[i]||function(){(t[i].q=t[i].q||[]).push(arguments)},t[i].l=1*new Date,o=e.createElement(r),s=e.getElementsByTagName(r)[0],o.async=1,o.src=n,s.parentNode.insertBefore(o,s)})(window,document,"script","//www.google-analytics.com/analytics.js","ga")},e.prototype.trackPage=function(t,e){if(this.initialized&&this.win.ga)return e=e||this.doc[0].title,this.win.ga("send","pageview",{page:t,title:e})},e.prototype.trackEvent=function(t,e,r,n){if(this.initialized&&this.win.ga)return this.win.ga("send","event",t,e,r,n)},e.prototype.ecViewPlan=function(t){if(this.initialized&&this.win.ga)return this.win.ga("ec:addProduct",{id:t.plan_id,name:t.name,category:"plans",quantity:1,position:1}),this.win.ga("ec:setAction","detail"),this.trackEvent("ecommerce","view-product-detail",t.name,t.plan_id)},e.prototype.ecClickPlan=function(t){if(this.initialized&&this.win.ga)return this.win.ga("ec:addProduct",{id:t.plan_id,name:t.name,category:"plans",quantity:1,position:1}),this.win.ga("ec:setAction","click"),this.trackEvent("ecommerce","click-product",t.name,t.plan_id)},e.prototype.ecListPlans=function(t,e){var r,n,i,o,s;if(o=t[0],this.initialized&&this.win.ga){for(s=1,r=0,n=o.length;r"+t+""))}),u.on("click.confirm-dialog","a.button-green",i(2e3,function(t){return function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=t.loading().target(n).start(),c.resolve({selected:a.val(),finish:function(e){if(null==e&&(e=!0),r.finish(),e)return t.hide(u)}})}}(this))),u.on("click.confirm-dialog",".button-red",function(t){return function(e){return e.preventDefault(),c.reject(),t.hide(u)}}(this)),this.lightboxService.open(u),c.promise},o.prototype.error=function(t){var e,r;return e=this.q.defer(),r=angular.element(".lightbox-generic-error"),r.find(".title").html(t),r.on("click.confirm-dialog",".button-green",function(t){return function(n){return n.preventDefault(),e.resolve(),t.hide(r)}}(this)),r.on("click.confirm-dialog",".close",function(t){return function(n){return n.preventDefault(),e.resolve(),t.hide(r)}}(this)),this.lightboxService.open(r),e.promise},o.prototype.success=function(t,e,r){var n,i,o,a,c;return n=this.q.defer(),o=angular.element(".lightbox-generic-success"),o.find("img").remove(),o.find("svg").remove(),r&&("img"===r.type?i=$("").addClass("lb-icon").attr("src",r.name):"svg"===r.type&&(i=document.createElement("div"),s.addClass(i,"icon"),s.addClass(i,r.name),s.addClass(i,"lb-icon"),a=document.createElementNS("http://www.w3.org/2000/svg","svg"),c=document.createElementNS("http://www.w3.org/2000/svg","use"),c.setAttributeNS("http://www.w3.org/1999/xlink","href","#"+r.name),i.appendChild(a).appendChild(c)),i&&o.find("section").prepend(i)),t&&o.find(".title").html(t),e&&o.find(".message").html(e),o.on("click.confirm-dialog",".button-green",function(t){return function(e){return e.preventDefault(),n.resolve(),t.hide(o)}}(this)),o.on("click.confirm-dialog",".close",function(t){return function(e){return e.preventDefault(),n.resolve(),t.hide(o)}}(this)),this.lightboxService.open(o),n.promise},o.prototype.loader=function(t,e,r){var n;return null==r&&(r=!1),n=angular.element(".lightbox-generic-loading"),t&&n.find(".title").html(t),e&&n.find(".message").html(e),r&&n.find(".spin").removeClass("hidden"),{start:function(t){return function(){return t.lightboxService.open(n)}}(this),stop:function(t){return function(){return t.lightboxService.close(n)}}(this),update:function(t){return function(t,e,r,i){return e&&n.find(".title").html(e),r&&n.find(".message").html(r),i?(n.find(".spin").addClass("hidden"),n.find(".progress-bar-wrapper").removeClass("hidden"),n.find(".progress-bar-wrapper > .bar").width(i+"%"),n.find(".progress-bar-wrapper > span").html(i+"%").css("left",i-9+"%")):(n.find(".spin").removeClass("hidden"),n.find(".progress-bar-wrapper").addClass("hidden"))}}(this)}},o.prototype.notify=function(t,r,i,o){var s,c,u;if(u=".notification-message-"+t,c=angular.element(u),!c.hasClass("active"))return i?c.find("h4").html(i):c.find("h4").html(this.translate.instant(e[t].title)),r?c.find("p").html(r):c.find("p").html(this.translate.instant(e[t].message)),s=angular.element("body"),s.find(".notification-message .notification-light").removeClass("active").addClass("inactive"),s.find(u).removeClass("inactive").addClass("active"),this.tsem&&n(this.tsem),o||(o="error"===t||"light-error"===t?3500:1500),this.tsem=a(o,function(t){return function(){return s.find(u).removeClass("active").addClass("inactive").one("animationend",function(){return $(this).removeClass("inactive")}),delete t.tsem}}(this)),c.on("click",".icon-close, .close",function(t){return function(t){return s.find(u).removeClass("active").addClass("inactive")}}(this))},o}(s.Service),o=angular.module("taigaCommon"),o.service("$tgConfirm",t)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g=function(t,e){function r(){this.constructor=t}for(var n in e)m.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},m={}.hasOwnProperty;d=this.taiga,u=this.taiga.bindMethods,l=this.taiga.bindOnce,p=this.taiga.debounce,h=d.generateHash,f=angular.module("taigaCommon"),s="text",o="url",i="multiline",n="date",c="url",a=[{key:s,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:i,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:n,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"},{key:c,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL"},{key:o,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT"}],e=function(t){function e(t,e,r,n,i,o){this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.confirm=i,this.q=o,u(this),this.type=null,this.objectId=null,this.projectId=null,this.customAttributes=[],this.customAttributesValues=null}return g(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$tgConfirm","$q"],e.prototype.initialize=function(t,e){return this.project=this.scope.project,this.type=t,this.objectId=e,this.projectId=this.scope.projectId},e.prototype.loadCustomAttributesValues=function(){return this.objectId?this.rs.customAttributesValues[this.type].get(this.objectId).then(function(t){return function(e){return t.customAttributes=t.project[t.type+"_custom_attributes"],t.customAttributesValues=e,e}}(this)):this.customAttributesValues},e.prototype.getAttributeValue=function(t){var e;return e=_.clone(t,!1),e.value=this.customAttributesValues.attributes_values[t.id],e},e.prototype.updateAttributeValue=function(t){var e,r,n;return n=function(t){return function(){return t.rootscope.$broadcast("custom-attributes-values:edit")}}(this),r=function(t){return function(e){return t.confirm.notify("error"),t.q.reject()}}(this),e=_.clone(this.customAttributesValues.attributes_values,!0),e[t.id]=t.value,this.customAttributesValues.attributes_values=e,this.customAttributesValues.id=this.objectId,this.repo.save(this.customAttributesValues).then(n,r)},e}(d.Controller),r=function(t,r){var n,i,o,s;return o=t.get("custom-attributes/custom-attributes-values.html",!0),n=function(t){return h(["custom-attributes-collapsed",t])},i=function(t,e,i,o){var s,a,c;return s=o[0],a=o[1],c=n(i.type),t.collapsed=r.get(c)||!1,l(t,i.ngModel,function(t){return s.initialize(i.type,t.id),s.loadCustomAttributesValues()}),t.toggleCollapse=function(){return t.collapsed=!t.collapsed,r.set(c,t.collapsed)},t.$on("$destroy",function(){return e.off()})},s=function(t,e){return o({requiredEditionPerm:e.requiredEditionPerm})},{require:["tgCustomAttributesValues","ngModel"],controller:e,controllerAs:"ctrl",restrict:"AE",scope:!0,link:i,template:s}},f.directive("tgCustomAttributesValues",["$tgTemplate","$tgStorage","$translate",r]),t=function(t,e,r,i,o,s){var a,c,u;return c=t.get("custom-attributes/custom-attribute-value.html",!0),u=t.get("custom-attributes/custom-attribute-value-edit.html",!0),a=function(t,a,l,h){var f,d,g,m,v,y;return g=i.instant("COMMON.PICKERDATE.FORMAT"),m=function(e,i){var l,p,h,f,m,v;return null==i&&(i=!1),v=e.type===n&&e.value?moment(e.value,"YYYY-MM-DD").format(g):e.value,h=d(),l={id:e.id,name:e.name,description:e.description,value:v,isEditable:h,type:e.type},m=t.$new(),m.attributeHtml=s.getHTML(v),!h||!i&&v?(f=c(l),f=r(f)(m),a.html(f)):(f=u(l),f=r(f)(m),a.html(f),e.type===n?(p=o.get(),_.merge(p,{field:a.find("input[name=value]")[0],onSelect:function(t){return function(t){var e;return e=t}}(this),onOpen:function(t){return function(){if("undefined"!=typeof selectedDate&&null!==selectedDate)return a.picker.setDate(selectedDate)}}(this)}),a.picker=new Pikaday(p)):void 0)},d=function(){var e,r;return e=t.project.my_permissions,r=l.requiredEditionPerm,e.indexOf(r)>-1},t.saveCustomRichText=function(t){return function(t,e){return f.value=t,h.updateAttributeValue(f).then(function(){return e(),m(f,!1)})}}(this),t.cancelCustomRichText=function(t){return function(){return m(f,!1),null}}(this),y=p(2e3,function(e){return function(e){var r,i;if(e.preventDefault(),r=a.find("form").checksley(),r.validate())return i=a.find("input[name=value], textarea[name='value']"),f.value=i.val(),f.type===n&&moment(f.value,g).isValid()&&(f.value=moment(f.value,g).format("YYYY-MM-DD")),t.$apply(function(){return h.updateAttributeValue(f).then(function(){return m(f,!1)})})}}(this)),v=function(){return a.find("input[name='value'], textarea[name='value']").focus().select()},f=t.$eval(l.tgCustomAttributeValue),null!==f.value&&void 0!==f.value||(f.value=""),t.customAttributeValue=f,m(f),a.on("click",".js-value-view-mode span a",function(t){return t.stopPropagation()}),a.on("click",".js-value-view-mode",function(){if(d()&&!e.get().length)return m(f,!0),v()}),a.on("click",".js-edit-description",function(t){return t.preventDefault(),m(f,!0),v()}),a.on("keyup","input[name=value], textarea[name='value']",function(t){return 13===t.keyCode&&"textarea"!==t.currentTarget.type?y(t):27===t.keyCode?m(f,!1):void 0}),a.on("submit","form",y),a.on("click",".js-save-description",y),t.$on("$destroy",function(){return a.off()})},{link:a,require:"^tgCustomAttributesValues",restrict:"AE"}},f.directive("tgCustomAttributeValue",["$tgTemplate","$selectedText","$compile","$translate","tgDatePickerConfigService","tgWysiwygService",t])}.call(this),function(){var t,e,r,n=function(t,e){return function(){return t.apply(e,arguments)}},i=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;r=this.taiga,e=angular.module("taigaCommon"),t=function(t){function e(){this.replaceEmojiNameByHtmlImgs=n(this.replaceEmojiNameByHtmlImgs,this),this.replaceEmojiNameByImgs=n(this.replaceEmojiNameByImgs,this),this.replaceImgsByEmojiName=n(this.replaceImgsByEmojiName,this),this.getEmojiByName=n(this.getEmojiByName,this),this.getEmojiById=n(this.getEmojiById,this),this.searchByName=n(this.searchByName,this),this.emojis=_.map(r.emojis,function(t){return t.image="/"+window._version+"/emojis/"+t.image,t}),this.emojisById=_.keyBy(this.emojis,"id"),this.emojisByName=_.keyBy(this.emojis,"name")}return i(e,t),e.$inject=[],e.prototype.searchByName=function(t){return _.filter(this.emojis,function(e){return e.name.indexOf(t)!==-1})},e.prototype.getEmojiById=function(t){return this.emojisById[t]},e.prototype.getEmojiByName=function(t){return this.emojisByName[t]},e.prototype.replaceImgsByEmojiName=function(t){var e,n,i,o,s,a;for(i=r.getMatches(t,/emojis\/([^"]+).png"/gi),o=0,s=i.length;o]+>","g"),e=this.getEmojiById(n),t=t.replace(a,":"+e.name+":");return t},e.prototype.replaceEmojiNameByImgs=function(t){var e,n,i,o,s,a;for(i=r.getMatches(t,/:([\w +-]*):/g),o=0,s=i.length;o'));return t},e}(r.Service),e.service("$tgEmojis",t)}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){return function(){return t.apply(e,arguments)}};o=this.taiga,n=this.taiga.groupBy,i=angular.module("taigaCommon"),e=function(t,e,r,n,i){var o;return o=function(e,r,o,s){return e.$watch(o.ngModel,function(o){var a;if(o)return a=t.create(r,o,e.project),a.onSelectedPointForRole=function(t,r,n){return o.points=n,a.render(),e.$apply(function(){return s.$setViewValue(o)})},a.render=function(){var t,r,o,s;return t={totalPoints:this.calculateTotalPoints(),roles:this.calculateRoles(),editable:this.isEditable,loading:!1},o="common/estimation/us-estimation-points-per-role.html",s=n.get(o,!0),r=s(t),r=i(r)(e),this.$el.html(r)},a.render()}),e.$on("$destroy",function(){return r.off()})},{link:o,restrict:"EA",require:"ngModel"}},i.directive("tgLbUsEstimation",["$tgEstimationsService","$rootScope","$tgRepo","$tgTemplate","$compile",e]),r=function(t,e,r,n,i,o,s){var a;return a=function(r,a,c,u){var l;return l=function(t){var e,r;return r=o.save(function(e){return function(e){return e.points=t,e}}(this)),e=function(t){return function(){return s.notify("error")}}(this),r.then(null,e)},r.$watchCollection(function(){return u.$modelValue&&u.$modelValue.points},function(){var o,s;if(s=u.$modelValue)return o=t.create(a,s,r.project),o.onSelectedPointForRole=function(t,r,n){return o.loading=t,o.render(),l(n).then(function(){return o.loading=!1,e.$broadcast("object:updated"),o.render()})},o.render=function(){var t,e,s,a;return t={totalPoints:this.calculateTotalPoints(),roles:this.calculateRoles(),editable:this.isEditable,loading:o.loading},s="common/estimation/us-estimation-points-per-role.html",a=n.get(s,!0),e=a(t),e=i(e)(r),this.$el.html(e)},o.render()}),r.$on("$destroy",function(){return a.off()})},{link:a,restrict:"EA",require:"ngModel"}},i.directive("tgUsEstimation",["$tgEstimationsService","$rootScope","$tgRepo","$tgTemplate","$compile","$tgQueueModelTransformation","$tgConfirm",r]),t=function(t,e,r,i,o){var a,c,u;return u=t.get("common/estimation/us-estimation-points.html",!0),a=function(){function t(t,e,r){this.$el=t,this.us=e,this.project=r,this.bindClickEvents=s(this.bindClickEvents,this),this.isEditable=this.project.my_permissions.indexOf("modify_us")!==-1,this.roles=this.project.roles,this.points=this.project.points,this.loading=!1,this.pointsById=n(this.points,function(t){return t.id}),this.onSelectedPointForRole=function(t,e){},this.render=function(){}}return t.prototype.save=function(t,n){var s;return s=i.defer(),o.add(function(t){return function(){var n,i;return i=function(){return s.resolve(),t.render()},n=function(){return r.notify("error"),t.us.revert(),t.render(),s.reject()},e.save(t.us).then(i,n)}}(this)),s.promise},t.prototype.calculateTotalPoints=function(){var t,e;return e=_.map(this.us.points,function(t){return function(e,r){var n;return null!=(n=t.pointsById[e])?n.value:void 0}}(this)),0===e.length?"?":(t=_.filter(e,function(t){return null!=t}),0===t.length?"?":_.reduce(t,function(t,e){return t+e}))},t.prototype.calculateRoles=function(){var t,e;return t=_.filter(this.project.roles,"computable"),e=_.map(t,function(t){return function(e){var r,n;return r=t.us.points[e.id],n=t.pointsById[r],e=_.clone(e,!0),e.points=null!=n&&null!=n.name?n.name:"?",e}}(this))},t.prototype.bindClickEvents=function(){return this.$el.on("click",".total.clickable",function(t){return function(e){var r,n;return e.preventDefault(),e.stopPropagation(),n=angular.element(e.currentTarget),r=n.data("role-id"),t.renderPointsSelector(r,n),n.siblings().removeClass("active"),n.addClass("active")}}(this)),this.$el.on("click",".point",function(t){return function(e){var r,n,i,o;return e.preventDefault(),e.stopPropagation(),o=angular.element(e.currentTarget),i=o.data("role-id"),r=o.data("point-id"),t.$el.find(".popover").popover().close(),n=_.clone(t.us.points,!0),n[i]=r,t.onSelectedPointForRole(i,r,n)}}(this))},t.prototype.renderPointsSelector=function(t,e){var r,n,i,o,s;if(o=_.map(this.points,function(e){return function(r){return r=_.clone(r,!0),r.selected=e.us.points[t]!==r.id,r}}(this)),i=5,r=_.some(o,function(t){return function(t){return t.name.length>i}}(this)),n=u({points:o,roleId:t,horizontal:r}),this.$el.find(".popover").popover().close(),this.$el.find(".pop-points-open").remove(),null!=e?this.$el.find(e).append(n):this.$el.append(n),this.$el.find(".pop-points-open").popover().open(function(){return $(this).removeClass("active").closest("li").removeClass("active")}),this.$el.find(".pop-points-open").show(),s=this.$el.find(".pop-points-open"),s.offset().top+s.height()>document.body.clientHeight)return s.addClass("pop-bottom")},t}(),c=function(t,e,r){var n;return t.unbind("click"),n=new a(t,e,r),n.isEditable&&n.bindClickEvents(),n},{create:c}},i.factory("$tgEstimationsService",["$tgTemplate","$tgRepo","$tgConfirm","$q","$tgQqueue",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f;l=this.taiga,s=angular.module("taigaCommon"),r=function(){return function(t,e){return t===[null,void 0]?e:t}},s.filter("default",r),f=function(t){return function(e){return e?t.instant("COMMON.YES"):t.instant("COMMON.NO")}},s.filter("yesNo",["$translate",f]),h=function(){return l.unslugify},s.filter("unslugify",h),a=function(){return function(t,e){return t?moment(t).format(e):""}},s.filter("momentFormat",a),c=function(){return function(t,e){return t?moment(t).fromNow(e||!1):""}},s.filter("momentFromNow",c),u=function(t){return function(){return t.taiga.sizeFormat}}(this),s.filter("sizeFormat",u),p=function(){var t,e;return e=function(t){return t.toJS()},t=_.memoize(e),function(e){return e instanceof Immutable.List?t(e):e}},s.filter("toMutable",p),t=function(t){return function(e,r){var n;return(null!=r?r.startsWith("#"):void 0)?(n=r.substr(1),_.filter(e,function(t){return function(t){return String(t.ref).startsWith(n)}}(this))):t(e,r)}},s.filter("byRef",["filterFilter",t]),e=function(){return function(t,e){var r,n,i,o,s,a,c,u;for(t=new String(t).replace(/[^0-9a-f]/gi,""),t.length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),e=e||0,a="#",n=0,i=0,r=0,u=255,c=[0,1,2],o=0,s=c.length;o5},a=d(r),a=n(a)(o),s.find(".assigned-to-list").html(a)},c=function(){return e.stop(),t.close(s)},o.$on("assigned-to:add",function(r,n){var i;return h=n,i=n.assigned_to,f=o.usersById[i],p(f),t.open(s).then(function(){return s.find("input").focus(),e.init(s)})}),o.$watch("usersSearch",function(t){if(null!=t)return p(f,t),s.find("input").focus()}),s.on("click",".user-list-single",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),c(),o.$apply(function(){return o.$broadcast("assigned-to:added",e.data("user-id"),h),o.usersSearch=null})}),s.on("click",".remove-assigned-to",function(t){return t.preventDefault(),t.stopPropagation(),c(),o.$apply(function(){return o.usersSearch=null,o.$broadcast("assigned-to:added",null,h)})}),s.on("click",".close",function(t){return t.preventDefault(),c(),o.$apply(function(){return o.usersSearch=null})}),o.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-assigned-to.html",link:o}},h.directive("tgLbAssignedto",["lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",t]),u=function(t,e,r,n,i,o){var s;return s=function(t,s,a){var c,u,l,h,f;return h=null,f=n.get("common/lightbox/lightbox-assigned-to-users.html",!0),u=function(e){var r,n;return null==e&&(e=""),r=function(t,e){var r;return(!h||!_.find(h.watchers,function(t){return t===e.id}))&&(r=e.full_name_display.toUpperCase(),t=t.toUpperCase(),_.includes(r,t))},n=_.clone(t.activeUsers,!0),n=_.filter(n,_.partial(r,e))},l=function(e){var r,n,a;return a=_.slice(e,0,5),a=_.map(a,function(t){return t.avatar=o.getAvatar(t),t}),r={selected:!1,users:a,showMore:e.length>5},n=f(r),n=i(n)(t),s.find(".ticket-watchers").html(n)},c=function(){return r.stop(),e.close(s)},t.$on("watcher:add",function(t,n){var i;return h=n,i=u(),l(i),e.open(s).then(function(){return s.find("input").focus(),r.init(s)})}),t.$watch("usersSearch",function(t){var e;if(null!=t)return e=u(t),l(e),s.find("input").focus()}),s.on("click",".user-list-single",p(200,function(e){var r;return c(),e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return t.usersSearch=null,t.$broadcast("watcher:added",r.data("user-id"))})})), -s.on("click",".close",function(e){return e.preventDefault(),c(),t.$apply(function(){return t.usersSearch=null})}),t.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-users.html",link:s}},h.directive("tgLbWatchers",["$tgRepo","lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",u]),a=function(t,e,r){var n;return n=function(e,r,n){return t.open(r)},{templateUrl:"common/lightbox/lightbox-leave-project-warning.html",link:n,scope:!0}},h.directive("tgLightboxLeaveProjectWarning",["lightboxService",a])}.call(this),function(){var t,e,r,n,i,o;i=this.taiga,n=this.taiga.sizeFormat,o=this.taiga.timeout,r=angular.module("taigaCommon"),e=function(t,e){var r;return r=function(e,r,n){return t.onStart(function(){return $(document.body).addClass("loader-active"),r.addClass("active")}),t.onEnd(function(){return $(document.body).removeClass("loader-active"),r.removeClass("active")})},{link:r}},r.directive("tgLoader",["tgLoader","$rootScope",e]),t=function(t){var e,r,n,i,s,a,c,u;return r={minTime:300},i=!1,u=0,a=0,n=0,s=function(e){var s,c,l;return null==e&&(e=!1),u&&(l=0,e||(c=(new Date).getTime(),s=c-u,s",function(){var r;return r={settings:{target:null,scope:null,classes:[],timeout:0,template:null},target:function(t){return r.settings.target=t,r},scope:function(t){return r.settings.scope=t,r},template:function(t){return r.settings.template=t,r},removeClasses:function(){var t;return t=1<=arguments.length?n.call(arguments,0):[],r.settings.classes=t,r},timeout:function(t){return r.settings.timeout=t,r},start:function(){var t,n;return t=r.settings.target,r.settings.classes.map(function(e){return t.removeClass(e)}),t.hasClass("loading")||r.settings.template||(r.settings.template=t.html()),n=setTimeout(function(){if(!t.hasClass("loading"))return t.addClass("loading"),t.html(e)},r.settings.timeout),r.settings.timeoutId=n,r},finish:function(){var e,n,i;return n=r.settings.target,i=r.settings.timeoutId,i&&(clearTimeout(i),e=r.settings.classes,e.map(function(t){return r.settings.target.addClass(t)}),n.html(r.settings.template),n.removeClass("loading"),r.settings.scope&&t(n.contents())(r.settings.scope)),r}}}},e.$inject=["$compile"],r.factory("$tgLoading",e),t=function(t){var e;return e=function(e,r,n){var i,o;return i=null,o=r.html(),e.$watch(n.tgLoading,function(n){return function(n){return n?i=t().target(r).timeout(100).template(o).scope(e).start():i?i.finish():void 0}}(this))},{priority:99999,link:e}},r.directive("tgLoading",["$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,r=this.taiga.bindOnce,n=this.taiga.debounce,i=angular.module("taigaCommon"),e=function(t,e){var i,o;return o=e.get("common/popover/popover-us-status.html",!0),i=function(e,i,s){var a,c,u;return a=i.controller(),c=function(t){var r,n,o;if(o=i.find(".us-status"),n=i.find(".us-status .us-status-bind"),r=e.usStatusById,r[t.status])return n.text(r[t.status].name),o.css("color",r[t.status].color)},i.on("click",".us-status",function(t){return t.preventDefault(),t.stopPropagation(),i.find(".pop-status").popover().open()}),i.on("click",".status",n(2e3,function(r){var n,o;return r.preventDefault(),r.stopPropagation(),n=angular.element(r.currentTarget),o=e.$eval(s.tgUsStatus),o.status=n.data("status-id"),c(o),i.find(".pop-status").popover().close(),e.$apply(function(){return t.save(o).then(function(){return e.$eval(s.onUpdate)})})})),e.$on("userstories:loaded",function(){return c(e.$eval(s.tgUsStatus))}),e.$on("$destroy",function(){return i.off()}),u=e.$eval(s.tgUsStatus),c(u),r(e,"project",function(t){var r;if(r=o({statuses:t.us_statuses}),i.append(r),e.project.my_permissions.indexOf("modify_us")===-1)return i.unbind("click"),i.find("a").addClass("not-clickable")})},{link:i}},i.directive("tgUsStatus",["$tgRepo","$tgTemplate",e]),t=function(t,e){var r,i,s;return i=e.get("common/popover/popover-related-task-status.html",!0),s=function(t,e,r){var n,i;if(i=t.find(".us-status"),n=t.find(".task-status .task-status-bind"),r[e.status])return n.text(r[e.status].name),i.css("color",r[e.status].color)},r=function(e,r,a){var c,u,l,p;return c=r.controller(),p=e.$eval(a.tgRelatedTaskStatus),l=e.$eval(a.notAutoSave),u=!l,r.on("click",".task-status",function(t){return t.preventDefault(),t.stopPropagation(),r.find(".pop-status").popover().open()}),r.on("click",".status",n(2e3,function(n){var i;if(n.preventDefault(),n.stopPropagation(),i=angular.element(n.currentTarget),p.status=i.data("status-id"),r.find(".pop-status").popover().close(),s(r,p,e.taskStatusById),u)return e.$apply(function(){return t.save(p).then(function(){return e.$eval(a.onUpdate),e.$emit("related-tasks:status-changed")})})})),e.$watch(a.tgRelatedTaskStatus,function(){return p=e.$eval(a.tgRelatedTaskStatus),s(r,p,e.taskStatusById)}),o.bindOnce(e,"project",function(t){if(r.append(i({statuses:t.task_statuses})),s(r,p,e.taskStatusById),t.my_permissions.indexOf("modify_task")===-1)return r.unbind("click"),r.find("a").addClass("not-clickable")}),e.$on("$destroy",function(){return r.off()})},{link:r}},i.directive("tgRelatedTaskStatus",["$tgRepo","$tgTemplate",t]),$.fn.popover=function(){var t,e,r,n,i,o;return t=this,i=function(e){return function(){var e,r,n,i,o,s,a,c,u,l;return t.css({display:"block",visibility:"hidden"}),i=$(window).scrollTop(),e=i+$(window).height(),o=$(window).width(),n=o,r=0,u=t.offset().top,s=u+t.height(),l=t.width(),a=t.offset().left,c=t.offset().left+l,t.css({display:"none",visibility:"visible"}),s<=e&&u>=i&&a>=r&&c<=n}}(this),n=function(e){return function(e){return e&&e.call(t),t.fadeOut(function(){return t.removeClass("active").removeClass("fix")}),t.off("popup:close")}}(this),r=function(t){return function(){return $(".popover.active").each(function(){return $(this).trigger("popup:close")})}}(this),o=function(o){return function(o){return t.hasClass("active")?e():(r(),i()||t.addClass("fix"),t.fadeIn(function(){return t.addClass("active"),$(document.body).off("popover"),$(document.body).one("click.popover",function(){return r()})}),t.on("popup:close",function(t){return n(o)}))}}(this),e=function(e){return function(){return t.trigger("popup:close")}}(this),{open:o,close:e,closeAll:r}}}.call(this),function(){var t,e,r;r=this.taiga,e=angular.module("taigaCommon"),t=function(t,e){var r;return this.config=e,r=this.config.get("ravenConfig",null),r?(t.debug("Using the RavenJS exception handler."),Raven.config(r).install(),function(e,r){return t.error.apply(t,arguments),Raven.captureException(e)}):(t.debug("Using the default logging exception handler."),function(e,r){return t.error.apply(t,arguments)})},e.factory("$exceptionHandler",["$log","$tgConfig",t])}.call(this),function(){var e,r,n,i,o,s,a,c=[].indexOf||function(t){for(var e=0,r=this.length;e\n <% if (tag[1] !== null) { %>\n \n <%= emojify(tag[0]) %>\n \n <% } %>\n<% }) %>\n<% _.each(tags, function(tag) { %>\n <% if (tag[1] === null) { %>\n \n <%= emojify(tag[0]) %>\n \n <% } %>\n<% }) %>'),e=function(e,n,i,o){var s;return s=function(e){var i;return i=r({tags:e,emojify:function(e){return t.replaceEmojiNameByHtmlImgs(_.escape(e))}}),n.html(i)},e.$watch(i.tgColorizeBacklogTags,function(t){if(null!=t)return s(t)}),e.$on("$destroy",function(){return n.off()})},{link:e}},o.directive("tgColorizeBacklogTags",["$tgEmojis",e]),r=function(e,r,n){var o,s,u,l,p;return s=13,o=188,p=r.get("common/tag/lb-tag-line-tags.html",!0),u=null,l=function(e,r,o,l){var h,f,d,g,m,v,y,b;return b=_.has(o,"withoutColors"),g=function(i,o){var s,a,c;return null==o&&(o=[]),s=b?null:o[t],a={tags:_.map(i,function(t){return{name:t,style:s?"border-left: 5px solid "+s:""}})},c=n(p(a))(e),r.find(".tags-container").html(c)},y=function(){return r.find(".save").removeClass("hidden")},d=function(){return r.find(".save").addClass("hidden")},m=function(){return r.find("input").val(""),u.close()},h=function(t){var r;if(t=a(t.toLowerCase()),0!==t.length)return r=_.clone(l.$modelValue,!1),null==r&&(r=[]),c.call(r,t)<0&&r.push(t),e.$apply(function(){return l.$setViewValue(r)}),d()},f=function(t){var r;if(t=a(t.toLowerCase()),0!==t.length)return r=_.clone(l.$modelValue,!1),r=_.pull(r,t),e.$apply(function(){return l.$setViewValue(r)})},v=function(){var t;return t=r.find("input").val(),h(t),m()},r.on("keypress","input",function(t){var e;return e=angular.element(t.currentTarget),t.keyCode===s?(t.preventDefault(),v()):","===String.fromCharCode(t.keyCode)?(t.preventDefault(),v()):e.val().length?y():d()}),r.on("click",".save",function(t){return t.preventDefault(),v()}),r.on("click",".remove-tag",function(t){var e,r;return t.preventDefault(),e=angular.element(t.currentTarget),r=e.siblings(".tag-name").text(),f(r)}),i(e,"project",function(t){var e;return e=r.find("input"),u=new Awesomplete(e[0],{list:_.keys(t.tags_colors)}),e.on("awesomplete-selectcomplete",function(){return h(e.val()),e.val("")})}),e.$watch(o.ngModel,function(t){var r,n;return n=(null!=(r=e.project)?r.tags_colors:void 0)||[],g(t,n)}),e.$on("$destroy",function(){return r.off()})},{link:l,require:"ngModel",templateUrl:"common/tag/lb-tag-line.html"}},o.directive("tgLbTagLine",["$tgResources","$tgTemplate","$compile",r])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaBacklog"),t=function(t,e,n,i,o,s,a){var c;return c=function(n,c,u){var l,p,h,f,d,g,m,v;return f=!1,l=!0,p=null,n.newSprint={},v=null,g=function(){return p&&p.reset(),n.newSprint={project:null,name:null,estimated_start:null,estimated_finish:null}},m=r(2e3,function(r){return function(r){var u,h,d,g,m,y,b,S,j;return r.preventDefault(),j=angular.element(r.currentTarget),y=a.instant("COMMON.PICKERDATE.FORMAT"),S=c.find(".submit-button"),p=c.find("form").checksley(),p.validate()?(f=!1,u=null,g=$(".date-start").val(),d=$(".date-end").val(),l?(m=angular.copy(n.newSprint),m.estimated_start=moment(g,y).format("YYYY-MM-DD"),m.estimated_finish=moment(d,y).format("YYYY-MM-DD"),b=t.create("milestones",m),u="sprintform:create:success"):(m=n.newSprint.realClone(),m.estimated_start=moment(g,y).format("YYYY-MM-DD"),m.estimated_finish=moment(d,y).format("YYYY-MM-DD"),b=t.save(m),u="sprintform:edit:success"),h=s().target(S).start(),b.then(function(t){return h.finish(),l&&(n.sprintsCounter+=1),n.sprints=_.map(n.sprints,function(e){return e.id===t.id?t:e}),"sprintform:create:success"===u&&v?i.$broadcast(u,t,v):i.$broadcast(u,t),o.close(c)}),b.then(null,function(t){return h.finish(),p.setErrors(t),t._error_message?e.notify("light-error",t._error_message):t.__all__?e.notify("light-error",t.__all__[0]):void 0})):(f=!0,void c.find(".last-sprint-name").addClass("disappear"))}}(this)),d=function(){var r,s;return s=a.instant("LIGHTBOX.DELETE_SPRINT.TITLE"),r=n.newSprint.name,e.askOnDelete(s,r).then(function(r){return function(r){var s,a;return a=function(){return r.finish(),n.milestonesCounter-=1,o.close(c),i.$broadcast("sprintform:remove:success",n.newSprint)},s=function(){return r.finish(!1),e.notify("error")},t.remove(n.newSprint).then(a,s)}}(this))},h=function(){var t,e;return t=_.filter(n.sprints,function(t){return!t.closed}),e=_.sortBy(t,function(t){return moment(t.estimated_finish,"YYYY-MM-DD").format("X")}),e[e.length-1]},n.$on("sprintform:create",function(t,e,r){var i,s,u,f,d,m;return v=r,g(),p=c.find("form").checksley(),p.reset(),l=!0,d=a.instant("COMMON.PICKERDATE.FORMAT"),n.newSprint.project=e,n.newSprint.name=null,n.newSprint.slug=null,u=h(),s=moment(),u?s=moment(u.estimated_finish):n.newSprint.estimated_start&&(s=moment(n.newSprint.estimated_start)),n.newSprint.estimated_start=s.format(d),i=moment().add(2,"weeks"),u?i=moment(u.estimated_finish).add(2,"weeks"):n.newSprint.estimated_finish&&(i=moment(n.newSprint.estimated_finish)),n.newSprint.estimated_finish=i.format(d),f=c.find(".last-sprint-name"),null!=(null!=u?u.name:void 0)&&(m=a.instant("LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME",{lastSprint:u.name}),f.html(m)),c.find(".delete-sprint").addClass("hidden"),m=a.instant("LIGHTBOX.ADD_EDIT_SPRINT.TITLE"),c.find(".title").text(m),m=a.instant("COMMON.CREATE"),c.find(".button-green").text(m),o.open(c),c.find(".sprint-name").focus(),c.find(".last-sprint-name").removeClass("disappear")}),n.$on("sprintform:edit",function(t,e){var r,i,s;return g(),l=!1,i=a.instant("COMMON.PICKERDATE.FORMAT"),n.$apply(function(){return n.newSprint=e.realClone(),n.newSprint.estimated_start=moment(n.newSprint.estimated_start).format(i),n.newSprint.estimated_finish=moment(n.newSprint.estimated_finish).format(i)}),c.find(".delete-sprint").removeClass("hidden"),r=a.instant("BACKLOG.EDIT_SPRINT"),c.find(".title").text(r),s=a.instant("COMMON.SAVE"),c.find(".button-green").text(s),o.open(c),c.find(".sprint-name").focus().select(),c.find(".last-sprint-name").addClass("disappear")}),c.on("keyup",".sprint-name",function(t){return c.find(".sprint-name").val().length>0||f?c.find(".last-sprint-name").addClass("disappear"):c.find(".last-sprint-name").removeClass("disappear")}),c.on("submit","form",m),c.on("click",".delete-sprint",function(t){return t.preventDefault(),d()}),n.$on("$destroy",function(){return c.off()}),g()},{link:c}},n.directive("tgLbCreateEditSprint",["$tgRepo","$tgConfirm","$tgResources","$rootScope","lightboxService","$tgLoading","$translate",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v=function(t,e){function r(){this.constructor=t}for(var n in e)y.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},y={}.hasOwnProperty;d=this.taiga,p=this.taiga.mixOf,m=this.taiga.toggleText,f=this.taiga.scopeDefer,c=this.taiga.bindOnce,l=this.taiga.groupBy,g=this.taiga.timeout,a=this.taiga.bindMethods,u=this.taiga.generateHash,h=angular.module("taigaBacklog"),t=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d,g,m,v,y,_,b){var S;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=c,this.appMetaService=u,this.navUrls=l,this.events=p,this.analytics=h,this.translate=f,this.loading=d,this.rs2=g,this.modelTransform=m,this.errorHandlingService=v,this.storage=y,this.filterRemoteStorageService=_,this.projectService=b,a(this),this.backlogOrder={},this.milestonesOrder={},this.page=1,this.disablePagination=!1,this.firstLoadComplete=!1,this.scope.userstories=[],this.applyStoredFilters(this.params.pslug,"backlog-filters")||(this.scope.sectionName=this.translate.instant("BACKLOG.SECTION_NAME"),this.showTags=!1,this.activeFilters=!1,this.scope.showGraphPlaceholder=null,this.displayVelocity=!1,this.initializeEventHandlers(),S=this.loadInitialData(),S.then(function(t){return function(){var e,r;if(t.firstLoadComplete=!0,r=t.translate.instant("BACKLOG.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.translate.instant("BACKLOG.PAGE_DESCRIPTION",{projectName:t.scope.project.name,projectDescription:t.scope.project.description}),t.appMetaService.setAll(r,e),t.rs.userstories.getShowTags(t.scope.projectId))return t.showTags=!0,t.scope.$broadcast("showTags",t.showTags)}}(this)),S.then(null,this.onInitialDataError.bind(this)))}return v(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","tgAppMetaService","$tgNavUrls","$tgEvents","$tgAnalytics","$translate","$tgLoading","tgResources","$tgQueueModelTransformation","tgErrorHandlingService","$tgStorage","tgFilterRemoteStorageService","tgProjectService"],e.prototype.storeCustomFiltersName="backlog-custom-filters",e.prototype.storeFiltersName="backlog-filters",e.prototype.backlogOrder={},e.prototype.milestonesOrder={},e.prototype.filtersReloadContent=function(){return this.loadUserstories(!0)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("usform:bulk:success",function(t){return function(){return t.loadUserstories(!0),t.loadProjectStats(),t.confirm.notify("success"),t.analytics.trackEvent("userstory","create","bulk create userstory on backlog",1)}}(this)),this.scope.$on("sprintform:create:success",function(t){return function(e,r,n){return t.loadSprints().then(function(){return t.scope.$broadcast("sprintform:create:success:callback",n)}),t.loadProjectStats(),t.confirm.notify("success"),t.analytics.trackEvent("sprint","create","create sprint on backlog",1)}}(this)),this.scope.$on("usform:new:success",function(t){return function(){return t.loadUserstories(!0),t.loadProjectStats(),t.rootscope.$broadcast("filters:update"),t.confirm.notify("success"),t.analytics.trackEvent("userstory","create","create userstory on backlog",1)}}(this)),this.scope.$on("sprintform:edit:success",function(t){return function(){return t.loadProjectStats()}}(this)),this.scope.$on("sprintform:remove:success",function(t){return function(e,r){return t.loadSprints(),t.loadProjectStats(),t.loadUserstories(!0),r.closed&&t.loadClosedSprints(),t.rootscope.$broadcast("filters:update")}}(this)),this.scope.$on("usform:edit:success",function(t){return function(e,r){var n;return n=_.findIndex(t.scope.userstories,function(t){return t.id===r.id}),t.scope.userstories[n]=r,t.rootscope.$broadcast("filters:update")}}(this)),this.scope.$on("sprint:us:move",this.moveUs),this.scope.$on("sprint:us:moved",function(t){return function(){return t.loadSprints(),t.loadProjectStats()}}(this)),this.scope.$on("backlog:load-closed-sprints",this.loadClosedSprints),this.scope.$on("backlog:unload-closed-sprints",this.unloadClosedSprints)},e.prototype.initializeSubscription=function(){var t,e;return t="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadAllPaginatedUserstories(),t.loadSprints()}}(this)),e="changes.project."+this.scope.projectId+".milestones",this.events.subscribe(this.scope,e,function(t){return function(e){return t.loadSprints()}}(this))},e.prototype.toggleShowTags=function(){return this.scope.$apply(function(t){return function(){return t.showTags=!t.showTags,t.rs.userstories.storeShowTags(t.scope.projectId,t.showTags)}}(this))},e.prototype.toggleActiveFilters=function(){return this.activeFilters=!this.activeFilters},e.prototype.toggleVelocityForecasting=function(){return this.displayVelocity=!this.displayVelocity,this.displayVelocity?this.scope.visibleUserStories=_.map(this.forecastedStories,function(t){return t.ref}):this.scope.visibleUserStories=_.map(this.scope.userstories,function(t){return t.ref}),f(this.scope,function(t){return function(){return t.scope.$broadcast("userstories:loaded")}}(this))},e.prototype.loadProjectStats=function(){return this.rs.projects.stats(this.scope.projectId).then(function(t){return function(e){var r;return t.scope.stats=e,r=e.total_points?e.total_points:e.defined_points,r?t.scope.stats.completedPercentage=Math.round(100*e.closed_points/r):t.scope.stats.completedPercentage=0,t.scope.showGraphPlaceholder=!(null!=e.total_points&&null!=e.total_milestones),t.calculateForecasting(),e}}(this))},e.prototype.setMilestonesOrder=function(t){var e,r,n,i,o;for(i=[],r=0,n=t.length;r0&&t>s.speed));r++)o.push(void 0);return o},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_backlog_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.closedMilestones=!!t.total_closed_milestones,this.scope.$emit("project:loaded",t),this.scope.points=_.sortBy(t.points,"order"),this.scope.pointsById=l(t.points,function(t){return t.id}),this.scope.usStatusById=l(t.us_statuses,function(t){return t.id}),this.scope.usStatusList=_.sortBy(t.us_statuses,"id"),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.loadBacklog().then(function(t){return function(){var e;return t.generateFilters(e="null")}}(this)).then(function(t){return function(){return t.scope.$emit("backlog:loaded")}}(this))},e.prototype.prepareBulkUpdateData=function(t,e){return null==e&&(e="backlog_order"),_.map(t,function(t){return{us_id:t.id,order:t[e]}})},e.prototype.moveUs=function(t,e,r,n){var i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w,A,O,R,M,U,N,D,L,x,F,B,H;if(E=e[0].milestone,R=e[0].project,E&&(F=this.scope.sprintsById[E]||this.scope.closedSprintsById[E]),n&&($=this.scope.sprintsById[n]||this.scope.closedSprintsById[n]),s=n!==E?n:E,P=null,C="",n!==E)if(null===n){for(l=u=0,h=e.length;u1&&(x=_.map(O,function(t){return{us_id:t.id,order:P[t.id]}}))):B=0,j=[],l=S=0,d=e.length;S1&&n!==E)a=j.concat(x),M=this.rs.userstories.bulkUpdateMilestone(R,n,a);else if(e.length>1)a=j.concat(x),M=this.rs.userstories.bulkUpdateBacklogOrder(R,a);else{for(L={},U=0,y=x.length;U=n&&t<=r})},e}(p(d.Controller,d.PageMixin,d.FiltersMixin,d.UsFiltersMixin)),h.controller("BacklogController",t),e=function(t,e,r,n){var i,o,s,a,c,u,l,p;return i=_.template('
    <%- text %>
    '),s=function(t,e,n,o){var s,a,c,u;return c=function(){var r,n,i,o,a,c,l,p,h,f;if(t.displayVelocity&&u(),null!=t.stats&&null!=t.stats.total_points&&0!==t.stats.total_points&&null==t.displayVelocity){if(u(),p=t.stats,h=p.total_points,r=p.assigned_points,!t.userstories)return;for(c=t.userstories,l=[],i=o=0,a=c.length;oh){n=e.find(".backlog-table-body .us-item-row")[i],s(n);break}l.push(void 0)}return l}},u=function(){return e.find(".doom-line").remove()},s=function(t){var e;return e=r.instant("BACKLOG.DOOMLINE"),$(t).before(i({text:e}))},a=function(){var t;return t=e.find(".backlog-table-body .us-item-row"),_.map(t,function(t){return angular.element(t)})},t.$on("userstories:loaded",c),t.$on("userstories:forecast",u),t.$watch("stats",c)},c=function(t,r,i,o){var s,a,c,u,l,h,f;return a=function(){var e;return e=r.find(".backlog-table-body input:checkbox:checked"),_.map(e,function(e){var r;return e=$(e).closest(".tg-scope"),r=e.scope(),r.us.milestone=t.sprints[0].id,r.us})},h=function(e,i){var s,a,c,u;return u=_(t.userstories),t.userstories=u.without.apply(u,e).value(),a=_.map(e,function(t,e){return t.total_points}),c=_.reduce(a,function(t,e){return t+e}),i.user_stories=_.union(i.user_stories,e),i.total_points+=c,s=_.map(e,function(t){return{us_id:t.id,order:t.sprint_order}}),n.userstories.bulkUpdateMilestone(t.project.id,t.sprints[0].id,s).then(function(t){return function(){return o.loadSprints(),o.loadProjectStats(),o.toggleVelocityForecasting(),o.calculateForecasting()}}(this)),r.find(".move-to-sprint").hide()},u=function(e){return h(e,t.currentSprint)},l=function(e){return h(e,t.sprints[0])},t.$on("sprintform:create:success:callback",function(t,e){return _.partial(u,e)()}),f=!1,c=null,s=function(e){var n,i;return c=e.closest(".us-item-row"),e.closest(".us-item-row").toggleClass("ui-multisortable-multiple"),n=r.find(".move-to-sprint"),i=r.find(".backlog-table-body input:checkbox:checked"),i.length>0&&t.sprints.length>0?n.show():n.hide()},$(window).on("keydown.shift-pressed keyup.shift-pressed",function(t){return f=!!t.shiftKey,!0}),r.on("change",".backlog-table-body input:checkbox",function(t){var e,r,n,i,o;return c&&f&&(r=[],e=$(t.currentTarget).closest(".us-item-row"),n=c.nextAll(),i=c.prevAll(),_.some(n,function(t){return t===e[0]})?r=c.nextUntil(e):_.some(i,function(t){return t===e[0]})&&(r=c.prevUntil(e)),_.map(r,function(t){var e;return e=$(t).find("input:checkbox"),e.prop("checked",!0),s(e)})),o=angular.element(t.currentTarget),o.closest(".us-item-row").toggleClass("is-checked"),s(o)}),r.on("click","#move-to-latest-sprint",function(e){ -return function(e){var r;return r=a(),t.$apply(_.partial(l,r))}}(this)),r.on("click","#move-to-current-sprint",function(e){return function(e){var r;return r=a(),t.$apply(_.partial(u,r))}}(this)),r.on("click","#show-tags",function(t){return t.preventDefault(),o.toggleShowTags(),p(o)}),r.on("click",".forecasting-add-sprint",function(r){var n,i;return i=o.forecastedStories,t.currentSprint?(n=_.map(i,function(e,r){return e.milestone=t.currentSprint.id,e.order=r,e}),t.$apply(_.partial(u,n))):(n=_.map(i,function(t,e){return t.order=e,t}),e.$broadcast("sprintform:create",t.projectId,n))})},p=function(t){var e,n;return e=angular.element("#show-tags"),t.showTags?(e.addClass("active"),n=r.instant("BACKLOG.TAGS.HIDE"),e.text(n)):(e.removeClass("active"),n=r.instant("BACKLOG.TAGS.SHOW"),e.text(n))},u=function(t,e,r){var n;return n=e.find("sidebar.backlog-filter"),n.addClass("active"),r.activeFilters=!0},l=function(t,n,i){var o,s,a,c;return a=n.find("sidebar.backlog-filter"),a.one("transitionend",function(){return g(150,function(){return e.$broadcast("resize"),$(".burndown").css("visibility","visible")})}),c=angular.element("#show-filters-button"),$(".burndown").css("visibility","hidden"),a.toggleClass("active"),c.toggleClass("active"),o=r.instant("BACKLOG.FILTERS.HIDE"),s=r.instant("BACKLOG.FILTERS.SHOW"),m(c,[o,s]),i.toggleActiveFilters()},a=function(t,e,r,n){return t.filtersSearch={},e.on("click","#show-filters-button",function(r){return r.preventDefault(),t.$apply(function(){return l(t,e,n)})})},o=function(t,e,r,n){var i,o;return i=e.controller(),c(t,e,r,i),a(t,e,r,i),s(t,e,r,i),o=i.location.search(),(o.status||o.tags||o.q||o.assigned_to||o.owner)&&u(t,e,i),t.$on("showTags",function(){return p(i)}),t.$on("$destroy",function(){return e.off(),$(window).off(".shift-pressed")})},{link:o}},h.directive("tgBacklog",["$tgRepo","$rootScope","$translate","$tgResources",e]),s=function(t,e,r,n){var i,o;return o=e.get("backlog/us-role-points-popover.html",!0),i=function(e,i,s){return c(e,"project",function(t){var n,s;return s=_.filter(t.roles,"computable"),n=_.size(s),n>1?i.append(r(o({roles:s}))(e)):(i.find(".icon-arrow-down").remove(),i.find(".header-points").addClass("not-clickable"))}),e.$on("uspoints:select",function(t,e,r){return i.find(".popover").popover().close(),i.find(".header-points").html(r+"/Total")}),e.$on("uspoints:clear-selection",function(t,e){var r;return i.find(".popover").popover().close(),r=n.instant("COMMON.FIELDS.POINTS"),i.find(".header-points").text(r)}),i.on("click",function(t){var e;return e=angular.element(t.target),(e.is("span")||e.is("div"))&&t.stopPropagation(),i.find(".popover").popover().open()}),i.on("click",".clear-selection",function(e){return e.preventDefault(),e.stopPropagation(),t.$broadcast("uspoints:clear-selection")}),i.on("click",".role",function(e){var r,n;return e.preventDefault(),e.stopPropagation(),n=angular.element(e.currentTarget),r=n.scope(),t.$broadcast("uspoints:select",n.data("role-id"),n.text())}),e.$on("$destroy",function(){return i.off()})},{link:i}},h.directive("tgUsRolePointsSelector",["$rootScope","$tgTemplate","$compile","$translate",s]),o=function(t,e,r){var n,i;return i=r.get("common/estimation/us-points-roles-popover.html",!0),n=function(e,n,o){var s,a,c,u,l,p,h;return s=n.controller(),h=null,p=null,u=null,c=null,e.$on("uspoints:select",function(t,r,n){var i;return i=e.$eval(o.tgBacklogUsPoints),p=r,c.render()}),e.$on("uspoints:clear-selection",function(t){var r;return r=e.$eval(o.tgBacklogUsPoints),p=null,c.render()}),e.$watch(o.tgBacklogUsPoints,function(i){var o;if(i)return c=t.create(n,i,e.project),o=c.calculateRoles(),0===o.length?(n.find(".icon-arrow-bottom").remove(),n.find("a.us-points").addClass("not-clickable")):1===o.length&&(p=_.keys(i.points)[0]),c.isEditable&&a(),c.onSelectedPointForRole=function(t,e,r){return i.points=r,c.render(),this.save(t,e).then(function(){return s.loadProjectStats()})},c.render=function(){var t,e,n,i,s,a,c,u,l;return l=this.calculateTotalPoints(),null==p||1===o.length?(c=l,u=l):(i=this.us.points[p],s=this.pointsById[i],c=s.name+" / "+l+"",u=s.name+" / "+l),t={totalPoints:l,roles:this.calculateRoles(),editable:this.isEditable,text:c,title:u},n="common/estimation/us-estimation-total.html",a=r.get(n,!0),e=a(t),this.$el.html(e)},c.render()}),l=function(){var t,e;return e=c.calculateRoles(),t=i({roles:e}),n.append(t),n.find(".pop-role").popover().open(function(){return $(this).remove()})},a=function(){return n.on("click","a.us-points",function(t){var r;return t.preventDefault(),t.stopPropagation(),r=e.$eval(o.tgBacklogUsPoints),h=p,null!=p?c.renderPointsSelector(p):l()}),n.on("click",".role",function(t){var r,i,s;return t.preventDefault(),t.stopPropagation(),i=angular.element(t.currentTarget),s=e.$eval(o.tgBacklogUsPoints),h=i.data("role-id"),r=n.find(".pop-role"),r.find("a").removeClass("active"),r.find("a[data-role-id='"+h+"']").addClass("active"),c.renderPointsSelector(h)})},e.$on("$destroy",function(){return n.off()})},{link:n}},h.directive("tgBacklogUsPoints",["$tgEstimationsService","$tgRepo","$tgTemplate",o]),i=function(t){var e,r,n;return e=function(){return $(".js-burndown-graph").removeClass("shown"),$(".js-toggle-burndown-visibility-button").removeClass("active"),$(".js-burndown-graph").removeClass("open")},n=function(t){return $(".js-toggle-burndown-visibility-button").addClass("active"),t?$(".js-burndown-graph").addClass("shown"):$(".js-burndown-graph").addClass("open")},r=function(r,i,o){var s,a,c;return s=!0,a=u(["is-burndown-grpahs-collapsed"]),r.isBurndownGraphCollapsed=t.get(a)||!1,c=function(){return r.isBurndownGraphCollapsed?e(s):n(s),s=!1},r.$watch("showGraphPlaceholder",function(){if(null!=r.showGraphPlaceholder)return r.isBurndownGraphCollapsed=r.isBurndownGraphCollapsed||r.showGraphPlaceholder,c()}),i.on("click",".js-toggle-burndown-visibility-button",function(){return r.isBurndownGraphCollapsed=!r.isBurndownGraphCollapsed,t.set(a,r.isBurndownGraphCollapsed),c()}),r.$on("$destroy",function(){return i.off()})},{link:r}},h.directive("tgToggleBurndownVisibility",["$tgStorage",i]),r=function(t){var e,r;return r=function(e,r){var n,i,o,s,a,c,u,l,p,h,f;return h=e.width(),e.height(h/6),a=function(){l=[];for(var t=0,e=r.milestones.length-1;0<=e?t<=e:t>=e;0<=e?t++:t--)l.push(t);return l}.apply(this),o=[],f=_.map(r.milestones,function(t){return 0}),o.push({data:_.zip(a,f),lines:{fillColor:"rgba(0,0,0,0)"},points:{show:!1}}),c=_.map(r.milestones,function(t){return t.optimal}),o.push({data:_.zip(a,c),lines:{fillColor:"rgba(120,120,120,0.2)"}}),s=_.filter(_.map(r.milestones,function(t){return t.evolution}),function(t){return null!=t}),o.push({data:_.zip(a,s),lines:{fillColor:"rgba(102,153,51,0.3)"}}),n=_.map(r.milestones,function(t){return-t["team-increment"]-t["client-increment"]}),o.push({data:_.zip(a,n),lines:{fillColor:"rgba(255,51,51,0.3)"}}),p=_.map(r.milestones,function(t){return-t["team-increment"]}),o.push({data:_.zip(a,p),lines:{fillColor:"rgba(153,51,51,0.3)"}}),i=["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)"],u={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{ticks:r.milestones.length,axisLabel:t.instant("BACKLOG.CHART.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5,tickFormatter:function(t,e){return""}},yaxis:{axisLabel:t.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:i,tooltip:!0,tooltipOpts:{content:function(e,n,i,o){var s;return 1===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.OPTIMAL",s)):2===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.REAL",s)):3===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.INCREMENT_CLIENT",s)):(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.INCREMENT_TEAM",s))}}},e.empty(),e.plot(o,u).data("plot")},e=function(t,e,n){var i;return i=angular.element(e),t.$watch("stats",function(e){if(null!=t.stats)return r(i,t.stats),t.$on("resize",function(){return r(i,t.stats)})}),t.$on("$destroy",function(){return e.off()})},{link:e}},h.directive("tgBurndownBacklogGraph",["$translate",r]),n=function(t,e){var r,n,i,o;return o=t.get("backlog/progress-bar.html",!0),i=function(t,r,n,i){var s;return s=o({projectPointsPercentaje:n,closedPointsPercentaje:i}),s=e(s)(t),r.html(s)},r=function(t){var e;return e=_.max([0,t]),e=_.min([100,e]),Math.round(e)},n=function(t,e,n){var o;return o=angular.element(e),t.$watch(n.tgBacklogProgressBar,function(n){var o,s,a,c,u;if(null!=n)return u=n.total_points?n.total_points:n.defined_points,a=n.defined_points,o=n.closed_points,a>u?(c=100*u/a,s=100*o/a):(c=100,s=100*o/u),c=r(c-3),s=r(s-3),i(t,e,c,s)}),t.$on("$destroy",function(){return e.off()})},{link:n}},h.directive("tgBacklogProgressBar",["$tgTemplate","$compile",n])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,n=angular.module("taigaBacklog"),r=function(t){return $(t).scope().$destroy(),$(t).off(),$(t).remove()},t=function(){var t;return t=function(t,n,i){return e(t,"project",function(e){var i,o,s;if(e.my_permissions.indexOf("modify_us")>-1)return o=!1,i=dragula([n[0],$(".js-empty-backlog")[0]],{copySortSource:!1,copy:!1,isContainer:function(t){return t.classList.contains("sprint-table")},moves:function(t){return!!$(t).hasClass("row")}}),i.on("drag",function(t,e){var r,n;return n=$(t).parent(),o=n.hasClass("backlog-table-body"),$(document.body).addClass("drag-active"),r=$(t).find("input[type='checkbox']").is(":checked"),window.dragMultiple.start(t,e)}),i.on("cloned",function(t){return $(t).addClass("multiple-drag-mirror")}),i.on("dragend",function(e){var n,i,s,a,c,u,l,p;return c=$(e).parent(),$(".doom-line").remove(),c=$(e).parent(),a=c.hasClass("backlog-table-body")||c.hasClass("js-empty-backlog"),u=o||a?o===a:$(e).scope().sprint.id===c.scope().sprint.id,n=window.dragMultiple.stop(),$(document.body).removeClass("drag-active"),l=null,i=n.length?n[0]:e,a?s=$(i).index(".backlog-table-body .row"):(s=$(i).index(),l=c.scope().sprint.id),u?p=n.length?_.map(n,function(t){return t=$(t).scope().us}):[$(e).scope().us]:(p=n.length?_.map(n,function(t){return t=$(t).scope().us}):[$(e).scope().us],n.length?_.each(n,function(t){return r(t)}):r(e)),t.$emit("sprint:us:move",p,s,l)}),s=autoScroll([window],{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&i.dragging}}),t.$on("$destroy",function(){return n.off(),i.destroy()})})},{link:t}},n.directive("tgBacklogSortable",t)}.call(this),function(){var t,e,r,n,i;i=this.taiga,n=angular.module("taigaBacklog"),t=function(t,e){var r,n,i,o;return i=50,n={duration:500,easing:"linear"},o=function(t){return function(t){var e,r;return r=t.find(".sprint-table"),e=t.find(".compact-sprint"),e.toggleClass("active"),r.toggleClass("open")}}(this),r=function(t,r,i){return t.$watch(i.tgBacklogSprint,function(e){return e=t.$eval(i.tgBacklogSprint),e.closed?r.addClass("sprint-closed"):o(r)}),r.on("click",".sprint-name > .compact-sprint",function(t){return t.preventDefault(),o(r),r.find(".sprint-table").slideToggle(n)}),r.on("click",".edit-sprint",function(r){var n;return r.preventDefault(),n=t.$eval(i.tgBacklogSprint),e.$broadcast("sprintform:edit",n)}),t.$on("$destroy",function(){return r.off()})},{link:r}},n.directive("tgBacklogSprint",["$tgRepo","$rootScope",t]),e=function(t,e,r,n){var i,o;return o=e.get("backlog/sprint-header.html"),i=function(e,i,s,a){var c,u,l,p;return l=n.instant("BACKLOG.SPRINTS.DATE"),c=function(){return e.project.my_permissions.indexOf("modify_milestone")!==-1},u=function(){return e.project.my_permissions.indexOf("view_milestones")!==-1},p=function(n){var s,a,p,h,f,d,g;return d=t.resolve("project-taskboard",{project:e.project.slug,sprint:n.slug}),f=moment(n.estimated_start).format(l),h=moment(n.estimated_finish).format(l),p=f+"-"+h,a={name:n.name,taskboardUrl:d,estimatedDateRange:p,closedPoints:n.closed_points||0,totalPoints:n.total_points||0,isVisible:u(),isEditable:c()},g=e.$new(),_.assign(g,a),s=r(o)(g),i.html(s)},e.$watch("sprint",function(t){return p(t)}),e.$on("$destroy",function(){return i.off()})},{link:i,restrict:"EA"}},n.directive("tgBacklogSprintHeader",["$tgNavUrls","$tgTemplate","$compile","$translate",e]),r=function(t,e,r){var n,i;return n=!0,i=function(i,o,s){var a,c;return c=$("
    "),o.after(c),a=null,o.on("click",function(r){return r.preventDefault(),n=!n,a=e().target(c).start(),n?t.$broadcast("backlog:unload-closed-sprints"):t.$broadcast("backlog:load-closed-sprints")}),i.$on("$destroy",function(){return o.off()}),i.$on("closed-sprints:reloaded",function(t){return function(t,e){var n,i;return a.finish(),n=e.length>0?"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS":"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS",i=r.instant(n),o.find(".text").text(i)}}(this))},{link:i}},n.directive("tgBacklogToggleClosedSprintsVisualization",["$rootScope","$tgLoading","$translate",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c;s=this.taiga,n=this.taiga.mixOf,c=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,a=this.taiga.timeout,i=angular.module("taigaTaskboard"),t=function(t){var e,r;return r=function(e,r){var n,i,o,s;return s=e.width(),e.height(240),i=_.map(r,function(t){return moment(new Date(t.day).getTime())}),n=[],n.unshift({data:_.zip(i,_.map(r,function(t){return t.optimal_points})),lines:{fillColor:"rgba(120,120,120,0.2)"}}),n.unshift({data:_.zip(i,_.map(r,function(t){return t.open_points})),lines:{fillColor:"rgba(102,153,51,0.3)"}}),o={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{tickSize:[1,"day"],min:i[0],max:_.last(i),mode:"time",daysNames:i,axisLabel:t.instant("TASKBOARD.CHARTS.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},yaxis:{min:0,axisLabel:t.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(e,r,n,i){var o,s;return o=moment(r).format(t.instant("TASKBOARD.CHARTS.DATE")),s=Math.round(n),1===i.seriesIndex?t.instant("TASKBOARD.CHARTS.OPTIMAL",{formattedDate:o,roundedValue:s}):t.instant("TASKBOARD.CHARTS.REAL",{formattedDate:o,roundedValue:s})}}},e.empty(),e.plot(n,o).data("plot")},e=function(t,e,n){var i;return i=angular.element(e),t.$on("resize",function(){if(t.stats)return r(i,t.stats.days)}),t.$on("taskboard:graph:toggle-visibility",function(){return e.parent().toggleClass("open"),a(100,function(){if(t.stats)return r(i,t.stats.days)})}),t.$watch("stats",function(e){if(null!=t.stats)return r(i,t.stats.days)}),t.$on("$destroy",function(){return e.off()})},{link:e}},i.directive("tgSprintGraph",["$translate",t])}.call(this),function(){var t,e,r,n,i,o,s,a=[].indexOf||function(t){for(var e=0,r=this.length;e1&&r<=1&&(this.zoomLoading=!0,this.loadTasks().then(function(t){return function(){return t.zoomLoading=!1,t.taskboardTasksService.resetFolds()}}(this))),"0"===this.zoomLevel?this.rootscope.$broadcast("sprint:zoom0"):void 0)},e.prototype.changeQ=function(t){return this.replaceFilter("q",t),this.loadTasks(),this.generateFilters()},e.prototype.removeFilter=function(t){return this.unselectFilter(t.dataType,t.id),this.loadTasks(),this.generateFilters()},e.prototype.addFilter=function(t){return this.selectFilter(t.category.dataType,t.filter.id),this.loadTasks(),this.generateFilters()},e.prototype.selectCustomFilter=function(t){return this.replaceAllFilters(t.filter),this.loadTasks(),this.generateFilters()},e.prototype.removeCustomFilter=function(t){return this.filterRemoteStorageService.getFilters(this.scope.projectId,"tasks-custom-filters").then(function(e){return function(r){return delete r[t.id],e.filterRemoteStorageService.storeFilters(e.scope.projectId,r,"tasks-custom-filters").then(e.generateFilters)}}(this))},e.prototype.isFilterDataTypeSelected=function(t){var e,r,n,i;for(i=this.selectedFilters,r=0,n=i.length;r0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),a=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),s=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),e.selectedFilters=[],t.status&&(c=e.formatSelectedFilters("status",u,t.status),e.selectedFilters=e.selectedFilters.concat(c)),t.tags&&(c=e.formatSelectedFilters("tags",l,t.tags),e.selectedFilters=e.selectedFilters.concat(c)),t.assigned_to&&(c=e.formatSelectedFilters("assigned_to",n,t.assigned_to),e.selectedFilters=e.selectedFilters.concat(c)),t.owner&&(c=e.formatSelectedFilters("owner",s,t.owner),e.selectedFilters=e.selectedFilters.concat(c)),t.role&&(c=e.formatSelectedFilters("role",a,t.role),e.selectedFilters=e.selectedFilters.concat(c)),e.filterQ=t.q,e.filters=[{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:u},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:l,hideEmpty:!0,totalTaggedElements:p.length},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:a},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:s}],e.customFilters=[],_.forOwn(i,function(t,r){return e.customFilters.push({id:r,name:r,filter:t})})}}(this))},e.prototype._setMeta=function(){var t,e,r;return e=this.translate.instant("BACKLOG.SPRINTS.DATE"),r=this.translate.instant("TASKBOARD.PAGE_TITLE",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name}),t=this.translate.instant("TASKBOARD.PAGE_DESCRIPTION",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name,startDate:moment(this.scope.sprint.estimated_start).format(e),endDate:moment(this.scope.sprint.estimated_finish).format(e),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(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("taskform:bulk:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.add(r)}),t.analytics.trackEvent("task","create","bulk create task on taskboard",1)}}(this)),this.scope.$on("taskform:new:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.add(r)}),t.analytics.trackEvent("task","create","create task on taskboard",1)}}(this)),this.scope.$on("taskform:edit:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.replaceModel(r)})}}(this)),this.scope.$on("taskboard:task:move",this.taskMove),this.scope.$on("assigned-to:added",this.onAssignedToChanged)},e.prototype.onAssignedToChanged=function(t,e,r){return r.assigned_to=e,this.taskboardTasksService.replaceModel(r),this.repo.save(r).then(function(t){return function(){if(t.generateFilters(),t.isFilterDataTypeSelected("assigned_to")||t.isFilterDataTypeSelected("role"))return t.loadTasks()}}(this))},e.prototype.initializeSubscription=function(){var t,e;return t="changes.project."+this.scope.projectId+".tasks",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadTaskboard()}}(this)),e="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,e,function(t){return function(e){return t.refreshTagsColors(),t.loadSprintStats(),t.loadSprint()}}(this))},e.prototype.loadProject=function(){return this.rs.projects.get(this.scope.projectId).then(function(t){return function(e){return e.is_backlog_activated||t.errorHandlingService.permissionDenied(),t.scope.project=e,t.scope.pointsList=_.sortBy(e.points,"order"),t.scope.pointsById=o(e.points,function(t){return t.id}),t.scope.roleById=o(e.roles,function(t){return t.id}),t.scope.taskStatusList=_.sortBy(e.task_statuses,"order"),t.scope.usStatusList=_.sortBy(e.us_statuses,"order"),t.scope.usStatusById=o(e.us_statuses,function(t){return t.id}),t.scope.$emit("project:loaded",e),t.fillUsersAndRoles(e.members,e.roles),e}}(this))},e.prototype.loadSprintStats=function(){return this.rs.sprints.stats(this.scope.projectId,this.scope.sprintId).then(function(t){return function(e){var r,n,i,o;return o=_.reduce(_.values(e.total_points),function(t,e){return t+e},0),r=_.reduce(_.values(e.completed_points),function(t,e){return t+e},0),n=o-r,i=e.total_tasks-e.completed_tasks,t.scope.stats=e,t.scope.stats.totalPointsSum=o,t.scope.stats.completedPointsSum=r,t.scope.stats.remainingPointsSum=n,t.scope.stats.remainingTasks=i,e.totalPointsSum?t.scope.stats.completedPercentage=Math.round(100*e.completedPointsSum/e.totalPointsSum):t.scope.stats.completedPercentage=0,t.scope.stats.openTasks=e.total_tasks-e.completed_tasks,e}}(this))},e.prototype.refreshTagsColors=function(){return this.rs.projects.tagsColors(this.scope.projectId).then(function(t){return function(e){return t.scope.project.tags_colors=e._attrs}}(this))},e.prototype.loadSprint=function(){return this.rs.sprints.get(this.scope.projectId,this.scope.sprintId).then(function(t){return function(e){return t.scope.sprint=e,t.scope.userstories=_.sortBy(e.user_stories,"sprint_order"),t.taskboardTasksService.setUserstories(t.scope.userstories),e}}(this))},e.prototype.loadTasks=function(){var t;return t={},this.zoomLevel>1&&(t.include_attachments=1),t=_.merge(t,this.location.search()),this.rs.tasks.list(this.scope.projectId,this.scope.sprintId,null,t).then(function(t){return function(e){return t.taskboardTasksService.init(t.scope.project,t.scope.usersById),t.taskboardTasksService.set(e)}}(this))},e.prototype.loadTaskboard=function(){return this.q.all([this.refreshTagsColors(),this.loadSprintStats(),this.loadSprint().then(function(t){return function(){return t.loadTasks()}}(this))])},e.prototype.loadInitialData=function(){var t,e;return t={pslug:this.params.pslug,sslug:this.params.sslug},e=this.repo.resolve(t).then(function(t){return function(e){return t.scope.projectId=e.project,t.scope.sprintId=e.milestone,t.initializeSubscription(),e}}(this)),e.then(function(t){return function(){return t.loadProject()}}(this)).then(function(t){return function(){return t.generateFilters(),t.loadTaskboard().then(function(){return t.setRolePoints()})}}(this))},e.prototype.showPlaceHolder=function(t,e){return!(this.taskboardTasksService.tasksRaw.length||this.scope.taskStatusList[0].id!==t||this.scope.userstories.length&&this.scope.userstories[0].id!==e)},e.prototype.editTask=function(t){var e;return e=this.taskboardTasksService.getTask(t),e=e.set("loading",!0),this.taskboardTasksService.replace(e),this.rs.tasks.getByRef(e.getIn(["model","project"]),e.getIn(["model","ref"])).then(function(t){return function(r){return t.rs2.attachments.list("task",e.get("id"),e.getIn(["model","project"])).then(function(n){return t.rootscope.$broadcast("taskform:edit",r,n.toJS()),e=e.set("loading",!1),t.taskboardTasksService.replace(e)})}}(this))},e.prototype.taskMove=function(t,e,r,n,i,o){var s,a,c,u;return e=this.taskboardTasksService.getTaskModel(e.get("id")),s=this.taskboardTasksService.move(e.id,n,i,o),c={status__is_archived:!1,include_attachments:!0},a={headers:{"set-orders":JSON.stringify(s.set_orders)}},u=this.repo.save(e,!0,c,a,!0).then(function(t){return function(e){var r;if(r=e[1],r&&r["taiga-info-order-updated"]&&(o=JSON.parse(r["taiga-info-order-updated"]),t.taskboardTasksService.assignOrders(o)),t.loadSprintStats(),t.generateFilters(),t.isFilterDataTypeSelected("status"))return t.loadTasks()}}(this))},e.prototype.addNewTask=function(t,e){ -switch(t){case"standard":return this.rootscope.$broadcast("taskform:new",this.scope.sprintId,null!=e?e.id:void 0);case"bulk":return this.rootscope.$broadcast("taskform:bulk",this.scope.sprintId,null!=e?e.id:void 0)}},e.prototype.toggleFold=function(t){return this.taskboardTasksService.toggleFold(t)},e.prototype.changeTaskAssignedTo=function(t){var e;return e=this.taskboardTasksService.getTaskModel(t),this.rootscope.$broadcast("assigned-to:add",e)},e.prototype.setRolePoints=function(){var t,e,r,n;return t=_.filter(this.scope.project.roles,"computable"),r=function(e){return function(e){return e=parseInt(e,10),_.find(t,function(t){return t.id===e})}}(this),e=function(t){return function(e){var r;return r=parseInt(e,10),_.find(t.scope.project.points,function(t){return t.id===e})}}(this),n=_.reduce(this.scope.userstories,function(t){return function(t,n,i){return _.forOwn(n.points,function(n,i){var o,s;return s=r(i),o=e(n),t[s.id]||(t[s.id]=s,t[s.id].points=0),t[s.id].points+=o.value}),t}}(this),{}),this.scope.pointsByRole=Object.keys(n).map(function(t){return n[t]})},e}(s(u.Controller,u.PageMixin,u.FiltersMixin)),a.controller("TaskboardController",t),e=function(t){var e;return e=function(e,r,n){var i,o;return i=r.controller(),r.on("click",".toggle-analytics-visibility",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),r.toggleClass("active"),t.$broadcast("taskboard:graph:toggle-visibility")}),o=r.find(".taskboard-table-body"),o.on("scroll",function(t){var e,n;return n=angular.element(t.currentTarget),e=r.find(".taskboard-table-header .taskboard-table-inner"),e.css("left",-1*n.scrollLeft())}),e.$on("$destroy",function(){return r.off()})},{link:e}},a.directive("tgTaskboard",["$rootScope",e]),r=function(t){var e,r,n;return e=40,n=300,r=function(r,i,o){var s,a,c,u,l;return r.$on("sprint:zoom0",function(t){return function(){return c()}}(this)),r.$on("sprint:task:moved",function(t){return function(){return c()}}(this)),r.$watch("usTasks",function(){if(r.project)return r.statusesFolded=t.tasks.getStatusColumnModes(r.project.id),r.usFolded=t.tasks.getUsRowModes(r.project.id,r.sprintId),c()}),r.foldStatus=function(e){return r.statusesFolded[e.id]=!r.statusesFolded[e.id],t.tasks.storeStatusColumnModes(r.projectId,r.statusesFolded),c()},r.foldUs=function(e){return e?r.usFolded[e.id]=!r.usFolded[e.id]:r.usFolded[null]=!r.usFolded[null],t.tasks.storeUsRowModes(r.projectId,r.sprintId,r.usFolded),c()},s=function(t){return function(t,n){var i,o,s;return i=t?r.usTasks.getIn([t.toString(),n.toString()]).size:r.usTasks.getIn(["null",n.toString()]).size,r.statusesFolded[n]?(i&&r.usFolded[t]?(o=Math.round(Math.sqrt(i)),s=e*o):s=e,s):0}}(this),l=function(t){return function(t,e){var o;return o=i.find(".squish-status-"+t),e?o.css("max-width",e):"0"===r.ctrl.zoomLevel?o.css("max-width",148):o.css("max-width",n)}}(this),u=function(t){return function(){var t,e,r;return t=[],e=i.find(".task-colum-name"),t=_.map(e,function(t){return $(t).outerWidth(!0)}),r=_.reduce(t,function(t,e){return t+e}),i.find(".taskboard-table-inner").css("width",r)}}(this),a=function(t){return function(t){var e;return e=s(null,t),_.forEach(r.userstories,function(r){var n;if(n=s(r.id,t),n>e)return e=n}),l(t,e)}}(this),c=function(t){return function(){_.forEach(r.taskStatusList,function(t){return a(t.id)}),u()}}(this)},{link:r}},a.directive("tgTaskboardSquishColumn",["$tgResources",r])}.call(this),function(){var t,e,r,n,i,o,s,a;s=this.taiga,n=this.taiga.mixOf,a=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,i=angular.module("taigaBacklog"),t=function(t,e,r,n){var i;return i=function(t,e,i){var o;return o=t.$watch("usTasks",function(i){var s,a,c,u,l,p,h,f,d;if(i&&i.size&&(o(),t.project.my_permissions.indexOf("modify_task")>-1))return h=null,p=null,l=null,d=e,u=function(){var t;return t=n.instant("BACKLOG.SORTABLE_FILTER_ERROR"),$tgConfirm.notify("error",t)},a=function(t){return t.scope().$destroy(),t.off(),t.remove()},s=_.map(e.find(".task-column"),function(t){return t}),c=dragula(s,{copySortSource:!1,copy:!1,accepts:function(t,e){return!$(e).hasClass("taskboard-userstory-box")},moves:function(t){return $(t).is("tg-card")}}),c.on("drag",function(t){if(h=$(t).parent().scope(),e.hasClass("active-filters"))return u(),setTimeout(function(){return c.cancel(!0)},0),!1}),c.on("dragend",function(e){var n,i,o,s,c,u,f;return f=$(e).parent(),l=$(e),i=l.scope().task,n=l.index(),p=f.scope(),u=h.us?h.us.id:null,c=h.st.id,s=p.us?p.us.id:null,o=p.st.id,o===c&&s===u||a(l),t.$apply(function(){return r.$broadcast("taskboard:task:move",i,i.getIn(["model","status"]),s,o,n)})}),f=autoScroll([$(".taskboard-table-body")[0]],{margin:100,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&c.dragging}}),t.$on("$destroy",function(){return e.off(),c.destroy()})})},{link:i}},i.directive("tgTaskboardSortable",["$tgRepo","$tgResources","$rootScope","$translate",t])}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga.groupBy,t=function(t){function e(){this.reset()}return r(e,t),e.$inject=[],e.prototype.reset=function(){return this.tasksRaw=[],this.foldStatusChanged={},this.usTasks=Immutable.Map()},e.prototype.init=function(t,e){return this.project=t,this.usersById=e},e.prototype.resetFolds=function(){return this.foldStatusChanged={},this.refresh()},e.prototype.toggleFold=function(t){return this.foldStatusChanged[t]=!this.foldStatusChanged[t],this.refresh()},e.prototype.add=function(t){return this.tasksRaw=this.tasksRaw.concat(t),this.refresh()},e.prototype.set=function(t){return this.tasksRaw=t,this.refreshRawOrder(),this.refresh()},e.prototype.setUserstories=function(t){return this.userstories=t},e.prototype.refreshRawOrder=function(){var t,e,r,n,i;for(this.order={},r=this.tasksRaw,n=[],t=0,e=r.length;t1)for(s=0,l=f.length;s1)for(o=0,p=m.length;o1&&(b=_.map(m,function(t){return function(e){return{us_id:e.id,order:t.order[e.id]}}}(this)))}}else S=0;for(l=u=0,f=t.length;u1&&r<=1?(this.zoomLoading=!0,this.loadUserstories().then(function(t){return function(){return t.zoomLoading=!1,t.kanbanUserstoriesService.resetFolds()}}(this))):void 0)},e.prototype.filtersReloadContent=function(){return this.loadUserstories().then(function(t){return function(){var e,r,n,i,o;if(n=_.difference(t.kanbanUserstoriesService.archivedStatus,t.kanbanUserstoriesService.statusHide),n.length){for(i=[],e=0,r=n.length;e1&&(t.include_attachments=1,t.include_tasks=1),t=_.merge(t,this.location.search()),e=this.rs.userstories.listAll(this.scope.projectId,t).then(function(t){return function(e){return t.kanbanUserstoriesService.init(t.scope.project,t.scope.usersById),t.kanbanUserstoriesService.set(e),p(t.scope,function(){return t.scope.$broadcast("userstories:loaded",e)}),e}}(this)),e.then(function(t){return function(){return t.scope.$broadcast("redraw:wip")}}(this)),e},e.prototype.loadUserStoriesForStatus=function(t,e){var r,n;if(r=this.location.search().status,!r||(r=r.split(",").map(function(t){return parseInt(t,10)}),r.indexOf(e)!==-1))return n={status:e,include_attachments:!0,include_tasks:!0},n=_.merge(n,this.location.search()),this.rs.userstories.listAll(this.scope.projectId,n).then(function(t){return function(r){return t.scope.$broadcast("kanban:shown-userstories-for-status",e,r),r}}(this))},e.prototype.hideUserStoriesForStatus=function(t,e){return this.scope.$broadcast("kanban:hidden-userstories-for-status",e)},e.prototype.loadKanban=function(){return this.q.all([this.refreshTagsColors(),this.loadUserstories()])},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_kanban_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.projectId=t.id,this.scope.points=_.sortBy(t.points,"order"),this.scope.pointsById=c(t.points,function(t){return t.id}),this.scope.usStatusById=c(t.us_statuses,function(t){return t.id}),this.scope.usStatusList=_.sortBy(t.us_statuses,"order"),this.scope.$emit("project:loaded",t),t},e.prototype.initializeSubscription=function(){var t;return t="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadUserstories()}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.loadKanban(),this.generateFilters()},e.prototype.prepareBulkUpdateData=function(t,e){return null==e&&(e="kanban_order"),_.map(t,function(t){return{us_id:t.id,order:t[e]}})},e.prototype.moveUs=function(t,e,r,n){var i,o;return this.cleanSelectedUss(),e=_.map(e,function(t){return function(e){return t.kanbanUserstoriesService.getUsModel(e.id)}}(this)),i=this.kanbanUserstoriesService.move(e,r,n),o=this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId,i.bulkOrders),o.then(function(t){return function(){var r,n,s;return r={headers:{"set-orders":JSON.stringify(i.setOrders)}},n={include_attachments:!0,include_tasks:!0},s=_.map(e,function(e){return t.repo.save(e,!0,n,r,!0)}),o=t.q.all(s),o.then(function(e){var r,n;return r=e[1],r&&r["taiga-info-order-updated"]&&(n=JSON.parse(r["taiga-info-order-updated"]),t.kanbanUserstoriesService.assignOrders(n)),t.scope.$broadcast("redraw:wip"),t.generateFilters(),t.isFilterDataTypeSelected("status")&&t.filtersReloadContent(),o})}}(this))},e}(u(h.Controller,h.PageMixin,h.FiltersMixin,h.UsFiltersMixin)),l.controller("KanbanController",r),n=function(t,e){var r;return r=function(t,e,r){var n;return n=e.find(".kanban-table-body"),n.on("scroll",function(t){var r,n;return n=angular.element(t.currentTarget),r=e.find(".kanban-table-header .kanban-table-inner"),r.css("left",-1*n.scrollLeft())}),t.$on("$destroy",function(){return e.off()})},{link:r}},l.directive("tgKanban",["$tgRepo","$rootScope",n]),t=function(t,e,r){var n,i,o;return o=e.instant("KANBAN.ACTION_SHOW_ARCHIVED"),n=e.instant("KANBAN.ACTION_HIDE_ARCHIVED"),i=function(e,i,s){var a,c;return c=e.$eval(s.tgKanbanArchivedStatusHeader),a=!0,r.addArchivedStatus(c.id),r.hideStatus(c.id),e["class"]="icon-watch",e.title=o,i.on("click",function(i){return a=!a,e.$apply(function(){return a?(e["class"]="icon-watch",e.title=o,t.$broadcast("kanban:hide-userstories-for-status",c.id),r.hideStatus(c.id)):(e["class"]="icon-unwatch",e.title=n,t.$broadcast("kanban:show-userstories-for-status",c.id),r.showStatus(c.id))})}),e.$on("$destroy",function(){return i.off()})},{link:i}},l.directive("tgKanbanArchivedStatusHeader",["$rootScope","$translate","tgKanbanUserstories",t]),e=function(t,e){var r,n;return n=[],r=function(r,n,i){var o,s,a;return o=t.instant("KANBAN.HIDDEN_USER_STORIES"),s=r.$eval(i.tgKanbanArchivedStatusIntro),n.text(o),a=function(t){return t?n.text(""):n.text(o)},r.$on("kanban:us:move",function(t,r,n,i,o){var s;return s=!!e.getStatus(i).length,a(s)}),r.$on("kanban:shown-userstories-for-status",function(t,r,n){var i;if(r===s.id)return e.deleteStatus(r),e.add(n),i=!!e.getStatus(r).length,a(i)}),r.$on("kanban:hidden-userstories-for-status",function(t,e){if(e===s.id)return a(!1)}),r.$on("$destroy",function(){return n.off()})},{link:r}},l.directive("tgKanbanArchivedStatusIntro",["$translate","tgKanbanUserstories",e]),i=function(t,e){var r;return r=function(r,n,i){var o,s;return r.foldStatus=function(e){r.folds[e.id]=!r.folds[e.id],t.kanban.storeStatusColumnModes(r.projectId,r.folds),s()},s=function(){var t,e;return t=_.map(r.usStatusList,function(t){return r.folds[t.id]?40:310}),e=_.reduce(t,function(t,e){return t+e}),n.find(".kanban-table-inner").css("width",e)},o=r.$watch("usByStatus",function(n){if(n.size)return r.folds=t.kanban.getStatusColumnModes(e.project.get("id")),s(),o()})},{link:r}},l.directive("tgKanbanSquishColumn",["$tgResources","tgProjectService",i]),o=function(t){var e;return e=function(e,r,n){var i,o;return o=e.$eval(n.tgKanbanWipLimit),i=function(e){return function(){return r.find(".kanban-wip-limit").remove(),t(function(){var t;if(t=r.find("tg-card")[o.wip_limit])return angular.element(t).before("
    ")})}}(this),o&&!o.is_archived&&(e.$on("redraw:wip",i),e.$on("kanban:us:move",i),e.$on("usform:new:success",i),e.$on("usform:bulk:success",i)),e.$on("$destroy",function(){return r.off()})},{link:e}},l.directive("tgKanbanWipLimit",["$timeout",o])}.call(this),function(){var t,e,r,n,i,o,s,a,c;s=this.taiga,n=this.taiga.mixOf,c=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,a=this.taiga.timeout,i=angular.module("taigaKanban"),t=function(t,e,r){var n;return n=function(t,e,n){var i;return i=t.$watch("usByStatus",function(n){var o,s,a,c,u,l,p;if(n&&n.size&&(i(),t.project.my_permissions.indexOf("modify_us")>-1))return u=null,c=null,p=e,s=function(t){return t.scope().$destroy(),t.off(),t.remove()},o=_.map(e.find(".task-column"),function(t){return t}),a=dragula(o,{copySortSource:!1,copy:!1,moves:function(t){return $(t).is("tg-card")}}),a.on("drag",function(t){return window.dragMultiple.start(t,o)}),a.on("cloned",function(t,e){return $(t).addClass("multiple-drag-mirror")}),a.on("dragend",function(e){var n,i,o,a,l,p,h,f;return h=$(e).parent(),u=h.scope(),p=u.s.id,n=window.dragMultiple.stop(),n.length||(n=[e]),o=n[0],a=$(o).index(),l=u.s.id,f=_.map(n,function(t){return $(t).scope().us}),i=_.map(f,function(t){return{id:t.get("id"),oldStatusId:t.getIn(["model","status"])}}),t.$apply(function(){return _.each(f,function(t){return function(t,e){var r,i;if(r=t.getIn(["model","status"]),i=l===r,!i)return c=$(n[e]),s(c)}}(this)),r.$broadcast("kanban:us:move",i,l,a)})}),l=autoScroll(o,{margin:100,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&a.dragging}}),t.$on("$destroy",function(){return e.off(),a.destroy()})})},{link:n}},i.directive("tgKanbanSortable",["$tgRepo","$tgResources","$rootScope",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){function r(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},h={}.hasOwnProperty;u=this.taiga,a=this.taiga.mixOf,l=this.taiga.toString,s=this.taiga.joinStr,o=this.taiga.groupBy,i=this.taiga.bindOnce,n=this.taiga.bindMethods,c=angular.module("taigaEpics"),t=function(t){function e(t,e,r,i,o,s,a,c,u,l,p,h,f,d,g,m,v){var y;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=i,this.rs=o,this.rs2=s,this.params=a,this.q=c,this.location=u,this.log=l,this.appMetaService=p,this.analytics=h,this.navUrls=f,this.translate=d,this.modelTransform=g,this.errorHandlingService=m,this.projectService=v,n(this),this.scope.epicRef=this.params.epicref,this.scope.sectionName=this.translate.instant("EPIC.SECTION_NAME"),this.initializeEventHandlers(),y=this.loadInitialData(),y.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),y.then(null,this.onInitialDataError.bind(this))}return p(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r;return r=this.translate.instant("EPIC.PAGE_TITLE",{epicRef:"#"+this.scope.epic.ref,epicSubject:this.scope.epic.subject,projectName:this.scope.project.name}),t=this.translate.instant("EPIC.PAGE_DESCRIPTION",{epicStatus:(null!=(e=this.scope.statusById[this.scope.epic.status])?e.name:void 0)||"--",epicDescription:angular.element(this.scope.epic.description_html||"").text()}),this.appMetaService.setAll(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on epic",1)}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadEpic()}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-epics",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.immutableProject=this.projectService.project,this.scope.$emit("project:loaded",t),this.scope.statusList=t.epic_statuses,this.scope.statusById=o(t.epic_statuses,function(t){return t.id}),t},e.prototype.loadEpic=function(){return this.rs.epics.getByRef(this.scope.projectId,this.params.epicref).then(function(t){return function(e){var r,n,i;if(t.scope.epic=e,t.scope.immutableEpic=Immutable.fromJS(e._attrs),t.scope.epicId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"epic"),null!=(null!=(n=t.scope.epic.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.epic.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-epics-detail",r)),null!=(null!=(i=t.scope.epic.neighbors.next)?i.ref:void 0))return r={project:t.scope.project.slug,ref:t.scope.epic.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-epics-detail",r)}}(this))},e.prototype.loadUserstories=function(){return this.rs2.userstories.listInEpic(this.scope.epicId).then(function(t){return function(e){return t.scope.userstories=e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadEpic().then(function(t){return function(){return t.loadUserstories()}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.upvote(this.scope.epicId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.downvote(this.scope.epicId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.watch(this.scope.epicId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.unwatch(this.scope.epicId).then(e,t)},e.prototype.onSelectColor=function(t){var e,r,n;return r=function(t){return function(){return t.rootscope.$broadcast("object:updated"),t.confirm.notify("success")}}(this),e=function(t){return function(){return t.confirm.notify("error")}}(this),n=this.modelTransform.save(function(e){return e.color=t,e}),n.then(r,e)},e}(a(u.Controller,u.PageMixin)),c.controller("EpicDetailController",t),r=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){ -var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},c.directive("tgEpicStatusDisplay",["$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s,a){var c,u;return u=a.get("common/components/status-button.html",!0),c=function(e,s,a,c){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_epic")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=o(u({status:n,statuses:e.statusList,editable:l()}))(e),s.html(r)}}(this),h=function(e){var o,a,c,u;return o=n().target(s).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),o.finish()},a=function(){return r.notify("error"),o.finish()},u.then(c,a)},s.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return s.find(".pop-status").popover().open()}),s.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),$.fn.popover().closeAll(),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=c.$modelValue)?t.status:void 0},function(){var t;if(t=c.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:c,restrict:"EA",require:"ngModel"}},c.directive("tgEpicStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$translate","$tgTemplate",e])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g=function(t,e){function r(){this.constructor=t}for(var n in e)m.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},m={}.hasOwnProperty;f=this.taiga,p=this.taiga.mixOf,d=this.taiga.toString,l=this.taiga.joinStr,u=this.taiga.groupBy,c=this.taiga.bindOnce,a=this.taiga.bindMethods,h=angular.module("taigaIssues"),t=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d,g,m){var v;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=c,this.log=u,this.appMetaService=l,this.analytics=p,this.navUrls=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.projectService=m,a(this),this.scope.issueRef=this.params.issueref,this.scope.sectionName=this.translate.instant("ISSUES.SECTION_NAME"),this.initializeEventHandlers(),v=this.loadInitialData(),v.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),v.then(null,this.onInitialDataError.bind(this))}return g(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r,n,i,o;return o=this.translate.instant("ISSUE.PAGE_TITLE",{issueRef:"#"+this.scope.issue.ref,issueSubject:this.scope.issue.subject,projectName:this.scope.project.name}),t=this.translate.instant("ISSUE.PAGE_DESCRIPTION",{issueStatus:(null!=(e=this.scope.statusById[this.scope.issue.status])?e.name:void 0)||"--",issueType:(null!=(r=this.scope.typeById[this.scope.issue.type])?r.name:void 0)||"--",issueSeverity:(null!=(n=this.scope.severityById[this.scope.issue.severity])?n.name:void 0)||"--",issuePriority:(null!=(i=this.scope.priorityById[this.scope.issue.priority])?i.name:void 0)||"--",issueDescription:angular.element(this.scope.issue.description_html||"").text()}),this.appMetaService.setAll(o,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on issue",1)}}(this)),this.scope.$on("promote-issue-to-us:success",function(t){return function(){return t.analytics.trackEvent("issue","promoteToUserstory","promote issue to userstory",1),t.rootscope.$broadcast("object:updated"),t.loadIssue()}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadIssue()}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.project.is_issues_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-issues",t):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.issue_statuses,this.scope.statusById=u(t.issue_statuses,function(t){return t.id}),this.scope.typeById=u(t.issue_types,function(t){return t.id}),this.scope.typeList=_.sortBy(t.issue_types,"order"),this.scope.severityList=t.severities,this.scope.severityById=u(t.severities,function(t){return t.id}),this.scope.priorityList=t.priorities,this.scope.priorityById=u(t.priorities,function(t){return t.id}),t},e.prototype.loadIssue=function(){return this.rs.issues.getByRef(this.scope.projectId,this.params.issueref).then(function(t){return function(e){var r,n,i;if(t.scope.issue=e,t.scope.issueId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"issue"),null!=(null!=(n=t.scope.issue.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.issue.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-issues-detail",r)),null!=(null!=(i=t.scope.issue.neighbors.next)?i.ref:void 0))return r={project:t.scope.project.slug,ref:t.scope.issue.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-issues-detail",r)}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadIssue()},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.upvote(this.scope.issueId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.downvote(this.scope.issueId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.watch(this.scope.issueId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.unwatch(this.scope.issueId).then(e,t)},e}(p(f.Controller,f.PageMixin)),h.controller("IssueDetailController",t),i=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},h.directive("tgIssueStatusDisplay",["$tgTemplate","$compile",i]),n=function(t,e,r,n,i,o,s){var a,c;return c=o.get("common/components/status-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=c({status:n,statuses:e.statusList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-status").popover().open()}),o.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.status:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",n]),o=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-type-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.typeById[t.type],r=c({type:n,typees:e.typeList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.type=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".type-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-type").popover().open()}),o.on("click",".type",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),r=e.data("type-id"),h(r)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.type:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueTypeButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",o]),r=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-severity-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.severityById[t.severity],r=c({severity:n,severityes:e.severityList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.severity=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".severity-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-severity").popover().open()}),o.on("click",".severity",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("severity-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.severity:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueSeverityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-priority-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.priorityById[t.priority],r=c({priority:n,priorityes:e.priorityList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.priority=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".priority-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-priority").popover().open()}),o.on("click",".priority",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("priority-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.priority:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssuePriorityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",e]),s=function(t,e,r,n){var i;return i=function(i,o,s,a){var c;return c=function(n){return function(n,i){var o,s,a;return o={generated_from_issue:n.id,project:n.project,subject:n.subject,description:n.description,tags:n.tags,is_blocked:n.is_blocked,blocked_note:n.blocked_note},a=function(){return i.finish(),r.notify("success"),t.$broadcast("promote-issue-to-us:success")},s=function(){return i.finish(),r.notify("error")},e.create("userstories",o).then(a,s)}}(this),o.on("click","a",function(t){var e,i,o,s;return t.preventDefault(),e=a.$modelValue,s=n.instant("ISSUES.CONFIRM_PROMOTE.TITLE"),i=n.instant("ISSUES.CONFIRM_PROMOTE.MESSAGE"),o=e.subject,r.ask(s,o,i).then(function(t){return function(t){return c(e,t)}}(this))}),i.$on("$destroy",function(){return o.off()})},{restrict:"AE",require:"ngModel",templateUrl:"issue/promote-issue-to-us-button.html",link:i}},h.directive("tgPromoteIssueToUsButton",["$rootScope","$tgRepo","$tgConfirm","$translate",s])}.call(this),function(){var t,e,r,n,i,o,s,a=[].indexOf||function(t){for(var e=0,r=this.length;e0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),s=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),c=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),e.selectedFilters=[],t.status&&(u=e.formatSelectedFilters("status",p,t.status),e.selectedFilters=e.selectedFilters.concat(u)),t.tags&&(u=e.formatSelectedFilters("tags",h,t.tags),e.selectedFilters=e.selectedFilters.concat(u)),t.assigned_to&&(u=e.formatSelectedFilters("assigned_to",n,t.assigned_to),e.selectedFilters=e.selectedFilters.concat(u)),t.owner&&(u=e.formatSelectedFilters("owner",s,t.owner),e.selectedFilters=e.selectedFilters.concat(u)),t.type&&(u=e.formatSelectedFilters("type",d,t.type),e.selectedFilters=e.selectedFilters.concat(u)),t.severity&&(u=e.formatSelectedFilters("severity",l,t.severity),e.selectedFilters=e.selectedFilters.concat(u)),t.priority&&(u=e.formatSelectedFilters("priority",a,t.priority),e.selectedFilters=e.selectedFilters.concat(u)),t.role&&(u=e.formatSelectedFilters("role",c,t.role),e.selectedFilters=e.selectedFilters.concat(u)),e.filterQ=t.q,e.filters=[{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TYPE"),dataType:"type",content:d},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.SEVERITY"),dataType:"severity",content:l},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.PRIORITIES"),dataType:"priority",content:a},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:p},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:h,hideEmpty:!0,totalTaggedElements:f.length},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:c},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:s}],e.customFilters=[],_.forOwn(i,function(t,r){return e.customFilters.push({id:r,name:r,filter:t})})}}(this))},e.prototype.initializeSubscription=function(){var t;return t="changes.project."+this.scope.projectId+".issues",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadIssues()}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_issues_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.issueStatusById=a(t.issue_statuses,function(t){return t.id}),this.scope.issueStatusList=_.sortBy(t.issue_statuses,"order"),this.scope.severityById=a(t.severities,function(t){return t.id}),this.scope.severityList=_.sortBy(t.severities,"order"),this.scope.priorityById=a(t.priorities,function(t){return t.id}),this.scope.priorityList=_.sortBy(t.priorities,"order"),this.scope.issueTypes=_.sortBy(t.issue_types,"order"),this.scope.issueTypeById=a(t.issue_types,function(t){return t.id}),t},e.prototype.loadIssuesRequests=0,e.prototype.loadIssues=function(){var t,e;return t=this.location.search(),e=this.rs.issues.list(this.scope.projectId,t),this.loadIssuesRequests+=1,e.index=this.loadIssuesRequests,e.then(function(t){return function(r){return e.index===t.loadIssuesRequests&&(t.scope.issues=r.models,t.scope.page=r.current,t.scope.count=r.count,t.scope.paginatedBy=r.paginatedBy),r}}(this)),e},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.generateFilters(),this.loadIssues()},e.prototype.addNewIssue=function(){return this.rootscope.$broadcast("issueform:new",this.scope.project)},e.prototype.addIssuesInBulk=function(){return this.rootscope.$broadcast("issueform:bulk",this.scope.projectId)},e.prototype.upVoteIssue=function(t){var e,r;return this.voting=t,r=function(t){return function(){return t.loadIssues(),t.voting=null}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.voting=null}}(this),this.rs.issues.upvote(t).then(r,e)},e.prototype.downVoteIssue=function(t){var e,r;return this.voting=t,r=function(t){return function(){return t.loadIssues(),t.voting=null}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.voting=null}}(this),this.rs.issues.downvote(t).then(r,e)},e.prototype.getOrderBy=function(){return _.isString(this.location.search().order_by)?this.location.search().order_by:"created_date"},e}(u(h.Controller,h.PageMixin,h.FiltersMixin)),l.controller("IssuesController",r),n=function(t,e,r,n){var i,o,s,a;return a=r.get("issue/issue-paginator.html",!0),s=function(t,e,r,i){var o,s,c,u,l,p,h;return s=2,l=4,c=2,u=2,o=e.find(".issues-paginator"),p=function(){var e;return e=t.count/t.paginatedBy,e=parseInt(e,10)1,d.showNext=!(t.page===f),e=t.page,i=h=1,m=f;1<=m?h<=m:h>=m;i=1<=m?++h:--h)i===e+s&&f>e+s+u?g.push({classes:"dots",type:"dots"}):i===e-l&&e>c+l?g.push({classes:"dots",type:"dots"}):i>e+s&&i<=f-u||ic||(i===e?g.push({classes:"active",num:i,type:"page-active"}):g.push({classes:"page",num:i,type:"page"}));return r=a(d),r=n(r)(t),o.html(r)},t.$watch("issues",function(t){if(t)return h()}),e.on("click",".issues-paginator a.next",function(e){return e.preventDefault(),t.$apply(function(){return i.selectFilter("page",t.page+1),i.loadIssues()})}),e.on("click",".issues-paginator a.previous",function(e){return e.preventDefault(),t.$apply(function(){return i.selectFilter("page",t.page-1),i.loadIssues()})}),e.on("click",".issues-paginator li.page > a",function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=n.data("pagenum"),t.$apply(function(){return i.selectFilter("page",r),i.loadIssues()})})},o=function(t,r,i,o){var s,a,c,u;return a=o.getOrderBy(),a&&(c=p(a,"-")?"icon-arrow-up":"icon-arrow-down",s=r.find(".row.title > div[data-fieldname='"+d(a,"-")+"']"),u=$("").attr("svg-icon",c),s.append(u),n(s.contents())(t)),r.on("click",".row.title > div",function(i){var s,l,h;return h=angular.element(i.currentTarget),a=o.getOrderBy(),l=h.data("fieldname"),"total_voters"===l&&"-total_voters"!==a&&(a="total_voters"),s=a===l?"-"+l:l,t.$apply(function(){return o.replaceFilter("order_by",s),o.storeFilters(o.params.pslug,e.search(),o.filtersHashSuffix),o.loadIssues().then(function(){return r.find(".row.title > div > tg-svg").remove(),c=p(s,"-")?"icon-arrow-up":"icon-arrow-down",u=$("").attr("svg-icon",c),h.append(u),n(h.contents())(t)})})})},i=function(t,e,r){var n;return n=e.controller(),o(t,e,r,n),s(t,e,r,n),t.$on("$destroy",function(){return e.off()})},{link:i}},l.directive("tgIssues",["$log","$tgLocation","$tgTemplate","$compile",n]),e=function(t,e,r){var n,i,o;return i=e.get("issue/issue-status-inline-edition-selection.html",!0),o=function(t,e,r){var n,i,o;if(i=t.find(".issue-status"),n=t.find(".issue-status .issue-status-bind"),o=r[e.status])return n.text(o.name),n.prop("title",o.name),i.css("color",o.color)},n=function(e,r,n){var s,a;return s=r.controller(),a=e.$eval(n.tgIssueStatusInlineEdition),r.on("click",".issue-status",function(t){return t.preventDefault(),t.stopPropagation(),r.find(".pop-status").popover().open()}),r.on("click",".status",function(n){var i;return n.preventDefault(),n.stopPropagation(),i=angular.element(n.currentTarget),a.status=i.data("status-id"),r.find(".pop-status").popover().close(),o(r,a,e.issueStatusById),e.$apply(function(){return t.save(a).then(function(){if(s.generateFilters(),s.isFilterDataTypeSelected("status"))return s.loadIssues()})})}),h.bindOnce(e,"project",function(t){if(r.append(i({statuses:t.issue_statuses})),o(r,a,e.issueStatusById),t.my_permissions.indexOf("modify_issue")===-1)return r.unbind("click"),r.find("a").addClass("not-clickable")}),e.$watch(n.tgIssueStatusInlineEdition,function(t){return function(t){return o(r,t,e.issueStatusById)}}(this)),e.$on("$destroy",function(){return r.off()})},{link:n}},l.directive("tgIssueStatusInlineEdition",["$tgRepo","$tgTemplate","$rootScope",e]),t=function(t,e,r,n){var i,o;return o=_.template('<%- name %>\n
    <%- name %>
    '),i=function(i,s,a){var c,u,l;return l=function(t){var e,a,c;return a={name:r.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png"},c=i.usersById[t.assigned_to],e=n.getAvatar(c),a.imgurl=e.url,a.bg=null,c&&(a.name=c.full_name_display,a.bg=e.bg),s.find(".avatar").html(o(a)),s.find(".issue-assignedto").attr("title",a.name)},c=s.controller(),u=i.$eval(a.tgIssueAssignedToInlineEdition),l(u),s.on("click",".issue-assignedto",function(t){return e.$broadcast("assigned-to:add",u)}),h.bindOnce(i,"project",function(t){if(t.my_permissions.indexOf("modify_issue")===-1)return s.unbind("click"),s.find("a").addClass("not-clickable")}),i.$on("assigned-to:added",function(e,r,n){if(n.id===u.id)return n.assigned_to=r,t.save(u).then(function(){if(l(n),c.generateFilters(),c.isFilterDataTypeSelected("assigned_to")||c.isFilterDataTypeSelected("role"))return c.loadIssues()})}),i.$watch(a.tgIssueAssignedToInlineEdition,function(t){return l(t)}),i.$on("$destroy",function(){return s.off()})},{link:i}},l.directive("tgIssueAssignedToInlineEdition",["$tgRepo","$rootScope","$translate","tgAvatarService",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){function r(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},h={}.hasOwnProperty;l=this.taiga,c=this.taiga.mixOf,a=this.taiga.groupBy,s=this.taiga.bindOnce,o=this.taiga.bindMethods,u=angular.module("taigaUserStories"),i=function(t){function e(t,e,r,n,i,s,a,c,u,l,p,h,f,d,g,m,v,y){var _;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=s,this.q=a,this.location=c,this.log=u,this.appMetaService=l,this.navUrls=p,this.analytics=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.configService=m,this.projectService=v,this.wysiwigService=y,o(this),this.scope.usRef=this.params.usref,this.scope.sectionName=this.translate.instant("US.SECTION_NAME"),this.scope.tribeEnabled=this.configService.config.tribeHost,this.initializeEventHandlers(),_=this.loadInitialData(),_.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),_.then(null,this.onInitialDataError.bind(this))}return p(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","$tgQueueModelTransformation","tgErrorHandlingService","$tgConfig","tgProjectService","tgWysiwygService"], +var r;return r=t.model.make_model("users",e.data),t.setToken(r.auth_token),t.setUser(r),t.rootscope.$broadcast("auth:register",r),r}}(this))},e.prototype.getInvitation=function(t){return this.rs.invitations.get(t)},e.prototype.acceptInvitiationWithNewUser=function(t){return this.register(t,"private",!1)},e.prototype.forgotPassword=function(t){var e;return e=this.urls.resolve("users-password-recovery"),t=_.clone(t,!1),this.removeToken(),this.http.post(e,t)},e.prototype.changePasswordFromRecovery=function(t){var e;return e=this.urls.resolve("users-change-password-from-recovery"),t=_.clone(t,!1),this.removeToken(),this.http.post(e,t)},e.prototype.changeEmail=function(t){var e;return e=this.urls.resolve("users-change-email"),t=_.clone(t,!1),this.http.post(e,t)},e.prototype.cancelAccount=function(t){var e;return e=this.urls.resolve("users-cancel-account"),t=_.clone(t,!1),this.http.post(e,t)},e}(h.Service),p.service("$tgAuth",t),c=function(t,e,r,n){var i,o;return i=n.get("auth/login-text.html",!0),o=function(){var n,o,s;return(o=t.get("publicRegisterEnabled"))?(s=e.resolve("register"),r.force_next&&(n=encodeURIComponent(r.force_next),s+="?next="+n),i({url:s})):""},{restrict:"AE",scope:{},template:o}},p.directive("tgPublicRegisterMessage",["$tgConfig","$tgNavUrls","$routeParams","$tgTemplate",c]),s=function(t,e,r,n,i,o,s,a,c,u){var p;return p=function(p,h,f){var d,g,m,v;return d=new checksley.Form(h.find("form.login-form")),i.next&&i.next!==o.resolve("login")?p.nextUrl=decodeURIComponent(i.next):p.nextUrl=o.resolve("home"),i.force_next&&(p.nextUrl=decodeURIComponent(i.force_next)),m=function(t){return s.setupConnection(),u.trackEvent("auth","login","user login",1),0===p.nextUrl.indexOf("http")?c.location.href=p.nextUrl:r.url(p.nextUrl)},g=function(t){return e.notify("light-error",a.instant("LOGIN_FORM.ERROR_AUTH_INCORRECT"))},p.onKeyUp=function(t){var e,r;if(e=angular.element(t.currentTarget),r=e.val(),p.iscapsLockActivated=!1,r!==r.toLowerCase())return p.iscapsLockActivated=!0},v=l(2e3,function(e){return function(e){var r,i,o;if(e.preventDefault(),d.validate())return r={username:h.find("form.login-form input[name=username]").val(),password:h.find("form.login-form input[name=password]").val()},i=n.get("loginFormType","normal"),o=t.login(r,i),o.then(m,g)}}(this)),h.on("submit","form",v),window.prerenderReady=!0,p.$on("$destroy",function(){return h.off()})},{link:p}},p.directive("tgLogin",["$tgAuth","$tgConfirm","$tgLocation","$tgConfig","$routeParams","$tgNavUrls","$tgEvents","$translate","$window","$tgAnalytics",s]),u=function(t,e,r,n,i,o,s,a,c){var u;return u=function(u,p,h){var f,d,g,m;return i.get("publicRegisterEnabled")||(r.path(n.resolve("not-found")),r.replace()),u.data={},f=p.find("form").checksley({onlyOneErrorElement:!0}),o.next&&o.next!==n.resolve("login")?u.nextUrl=decodeURIComponent(o.next):u.nextUrl=n.resolve("home"),g=function(t){return s.trackEvent("auth","register","user registration",1),0===u.nextUrl.indexOf("http")?c.location.href=u.nextUrl:r.url(u.nextUrl)},d=function(t){var r;return t.data._error_message&&(r=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),e.notify("light-error",r)),f.setErrors(t.data)},m=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),f.validate())return r=t.register(u.data),r.then(g,d)}}(this)),p.on("submit","form",m),u.$on("$destroy",function(){return p.off()}),window.prerenderReady=!0},{link:u}},p.directive("tgRegister",["$tgAuth","$tgConfirm","$tgLocation","$tgNavUrls","$tgConfig","$routeParams","$tgAnalytics","$translate","$window",u]),i=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,p,h;return o.data={},c=s.find("form").checksley(),p=function(t){var o,s;return r.path(n.resolve("login")),s=i.instant("FORGOT_PASSWORD_FORM.SUCCESS_TITLE"),o=i.instant("FORGOT_PASSWORD_FORM.SUCCESS_TEXT"),e.success(s,o)},u=function(t){var r;return r=i.instant("FORGOT_PASSWORD_FORM.ERROR"),e.notify("light-error",r)},h=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),c.validate())return r=t.forgotPassword(o.data),r.then(p,u)}}(this)),s.on("submit","form",h),o.$on("$destroy",function(){return s.off()}),window.prerenderReady=!0},{link:o}},p.directive("tgForgotPassword",["$tgAuth","$tgConfirm","$tgLocation","$tgNavUrls","$translate",i]),n=function(t,e,r,n,i,o){var s;return s=function(s,a,c){var u,p,h,f,d;return s.data={},null!=n.token?(s.tokenInParams=!0,s.data.token=n.token):(r.path(i.resolve("login")),d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.ERROR"),e.notify("light-error",d)),u=a.find("form").checksley(),h=function(t){return r.path(i.resolve("login")),d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS"),e.success(d)},p=function(t){return d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.ERROR"),e.notify("light-error",d)},f=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),u.validate())return r=t.changePasswordFromRecovery(s.data),r.then(h,p)}}(this)),a.on("submit","form",f),s.$on("$destroy",function(){return a.off()})},{link:s}},p.directive("tgChangePasswordFromRecovery",["$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls","$translate",n]),o=function(t,e,r,n,i,o,s,a,c){var u;return u=function(u,p,h){var f,d,g,m,v,y,b,S,j,k;return k=i.token,y=t.getInvitation(k),y.then(function(t){return u.invitation=t,u.publicRegisterEnabled=c.get("publicRegisterEnabled")}),y.then(null,function(t){var n;return r.path(o.resolve("login")),n=a.instant("INVITATION_LOGIN_FORM.NOT_FOUND"),e.notify("light-error",n)}),u.dataLogin={token:k},f=p.find("form.login-form").checksley({onlyOneErrorElement:!0}),m=function(t){var n;return s.trackEvent("auth","invitationAccept","invitation accept with existing user",1),r.path(o.resolve("project",{project:u.invitation.project_slug})),n=a.instant("INVITATION_LOGIN_FORM.SUCCESS",{project_name:u.invitation.project_name}),e.notify("success",n)},d=function(t){return e.notify("light-error",t.data._error_message)},S=l(2e3,function(e){return function(e){var r,i;if(e.preventDefault(),f.validate())return i=n.get("loginFormType","normal"),r=u.dataLogin,y=t.login({username:r.username,password:r.password,invitation_token:r.token},i),y.then(m,d)}}(this)),p.on("submit","form.login-form",S),p.on("click",".button-login",S),u.dataRegister={token:k},b=p.find("form.register-form").checksley({onlyOneErrorElement:!0}),v=function(t){return s.trackEvent("auth","invitationAccept","invitation accept with new user",1),r.path(o.resolve("project",{project:u.invitation.project_slug})),e.notify("success","You've successfully joined this project","Welcome to "+_.escape(u.invitation.project_name))},g=function(t){var r;return t.data._error_message&&(r=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),e.notify("light-error",r)),b.setErrors(t.data)},j=l(2e3,function(e){return function(e){if(e.preventDefault(),b.validate())return y=t.acceptInvitiationWithNewUser(u.dataRegister),y.then(v,g)}}(this)),p.on("submit","form.register-form",j),p.on("click",".button-register",j),u.$on("$destroy",function(){return p.off()})},{link:u}},p.directive("tgInvitation",["$tgAuth","$tgConfirm","$tgLocation","$tgConfig","$routeParams","$tgNavUrls","$tgAnalytics","$translate","$tgConfig",o]),r=function(t,e,r,n,i,o,s,a){var c;return c=function(e,c,u){var l,p,h,f;return e.data={},e.data.email_token=o.email_token,l=c.find("form").checksley(),h=function(e){var o;return r.isAuthenticated()?t.queryOne("users",r.getUser().id).then(function(t){return function(t){return r.setUser(t),i.path(s.resolve("home")),i.replace()}}(this)):(i.path(s.resolve("login")),i.replace()),o=a.instant("CHANGE_EMAIL_FORM.SUCCESS"),n.success(o)},p=function(t){var e;return e=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),n.notify("light-error",e)},f=function(){var t;if(l.validate())return t=r.changeEmail(e.data),t.then(h,p)},c.on("submit",function(t){return t.preventDefault(),f()}),c.on("click","a.button-change-email",function(t){return t.preventDefault(),f()}),e.$on("$destroy",function(){return c.off()})},{link:c}},p.directive("tgChangeEmail",["$tgRepo","$tgModel","$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls","$translate",r]),e=function(t,e,r,n,i,o,s){var a;return a=function(t,e,a){var c,u,p,h;return t.data={},t.data.cancel_token=o.cancel_token,c=e.find("form").checksley(),p=function(t){var e;return r.logout(),i.path(s.resolve("home")),e=$translate.instant("CANCEL_ACCOUNT.SUCCESS"),n.success(e)},u=function(t){var e;return e=$translate.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),n.notify("error",e)},h=l(2e3,function(e){return function(e){var n;if(e.preventDefault(),c.validate())return n=r.cancelAccount(t.data),n.then(p,u)}}(this)),e.on("submit","form",h),t.$on("$destroy",function(){return e.off()})},{link:a}},p.directive("tgCancelAccount",["$tgRepo","$tgModel","$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls",e])}.call(this),function(){var t;t=angular.module("taigaBacklog",[])}.call(this),function(){var t,e,r,n,i,o,s;o=this.taiga,r=this.taiga.groupBy,e=this.taiga.bindOnce,i=angular.module("taigaBase",[]),t=function(t,e){var r;return r=function(r,n,i){return e.onresize=function(){return t.$broadcast("resize")}},{link:r}},i.directive("tgMain",["$rootScope","$window",t]),s={home:"/",projects:"/projects",error:"/error","not-found":"/not-found","permission-denied":"/permission-denied",discover:"/discover","discover-search":"/discover/search",login:"/login","forgot-password":"/forgot-password","change-password":"/change-password/:token","change-email":"/change-email/:token","cancel-account":"/cancel-account/:token",register:"/register",invitation:"/invitation/:token","create-project":"/project/new","create-project-scrum":"/project/new/scrum","create-project-kanban":"/project/new/kanban","create-project-duplicate":"/project/new/duplicate","create-project-import":"/project/new/import","create-project-import-platform":"/project/new/import/:platform",profile:"/profile","user-profile":"/profile/:username","blocked-project":"/blocked-project/:project",project:"/project/:project","project-detail-ref":"/project/:project/t/:ref","project-backlog":"/project/:project/backlog","project-taskboard":"/project/:project/taskboard/:sprint","project-kanban":"/project/:project/kanban","project-issues":"/project/:project/issues","project-epics":"/project/:project/epics","project-search":"/project/:project/search","project-epics-detail":"/project/:project/epic/:ref","project-userstories-detail":"/project/:project/us/:ref","project-tasks-detail":"/project/:project/task/:ref","project-issues-detail":"/project/:project/issue/:ref","project-wiki":"/project/:project/wiki","project-wiki-list":"/project/:project/wiki-list","project-wiki-page":"/project/:project/wiki/:slug","project-team":"/project/:project/team","project-admin-home":"/project/:project/admin/project-profile/details","project-admin-project-profile-details":"/project/:project/admin/project-profile/details","project-admin-project-profile-default-values":"/project/:project/admin/project-profile/default-values","project-admin-project-profile-modules":"/project/:project/admin/project-profile/modules","project-admin-project-profile-export":"/project/:project/admin/project-profile/export","project-admin-project-profile-reports":"/project/:project/admin/project-profile/reports","project-admin-project-values-status":"/project/:project/admin/project-values/status","project-admin-project-values-points":"/project/:project/admin/project-values/points","project-admin-project-values-priorities":"/project/:project/admin/project-values/priorities","project-admin-project-values-severities":"/project/:project/admin/project-values/severities","project-admin-project-values-types":"/project/:project/admin/project-values/types","project-admin-project-values-custom-fields":"/project/:project/admin/project-values/custom-fields","project-admin-project-values-tags":"/project/:project/admin/project-values/tags","project-admin-memberships":"/project/:project/admin/memberships","project-admin-roles":"/project/:project/admin/roles","project-admin-third-parties-webhooks":"/project/:project/admin/third-parties/webhooks","project-admin-third-parties-github":"/project/:project/admin/third-parties/github","project-admin-third-parties-gitlab":"/project/:project/admin/third-parties/gitlab","project-admin-third-parties-bitbucket":"/project/:project/admin/third-parties/bitbucket","project-admin-third-parties-gogs":"/project/:project/admin/third-parties/gogs","project-admin-contrib":"/project/:project/admin/contrib/:plugin","user-settings-user-profile":"/user-settings/user-profile","user-settings-user-change-password":"/user-settings/user-change-password","user-settings-user-avatar":"/user-settings/user-avatar","user-settings-mail-notifications":"/user-settings/mail-notifications","user-settings-contrib":"/user-settings/contrib/:plugin"},n=function(t,e){return t.debug("Initialize navigation urls"),e.update(s)},i.run(["$log","$tgNavUrls",n])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v=[].slice,y=function(t,e){function r(){this.constructor=t}for(var n in e)b.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},b={}.hasOwnProperty;m=this.taiga,g=angular.module("taigaCommon",[]),s=function(t){return{get:function(){return{i18n:{previousMonth:t.instant("COMMON.PICKERDATE.PREV_MONTH"),nextMonth:t.instant("COMMON.PICKERDATE.NEXT_MONTH"),months:[t.instant("COMMON.PICKERDATE.MONTHS.JAN"),t.instant("COMMON.PICKERDATE.MONTHS.FEB"),t.instant("COMMON.PICKERDATE.MONTHS.MAR"),t.instant("COMMON.PICKERDATE.MONTHS.APR"),t.instant("COMMON.PICKERDATE.MONTHS.MAY"),t.instant("COMMON.PICKERDATE.MONTHS.JUN"),t.instant("COMMON.PICKERDATE.MONTHS.JUL"),t.instant("COMMON.PICKERDATE.MONTHS.AUG"),t.instant("COMMON.PICKERDATE.MONTHS.SEP"),t.instant("COMMON.PICKERDATE.MONTHS.OCT"),t.instant("COMMON.PICKERDATE.MONTHS.NOV"),t.instant("COMMON.PICKERDATE.MONTHS.DEC")],weekdays:[t.instant("COMMON.PICKERDATE.WEEK_DAYS.SUN"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.MON"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.TUE"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.WED"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.THU"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.FRI"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.SAT")],weekdaysShort:[t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT")]},isRTL:"true"===t.instant("COMMON.PICKERDATE.IS_RTL"),firstDay:parseInt(t.instant("COMMON.PICKERDATE.FIRST_DAY_OF_WEEK"),10),format:t.instant("COMMON.PICKERDATE.FORMAT")}}}},g.factory("tgDatePickerConfigService",["$translate",s]),p=function(t,e){var r;return r=function(){return t.getSelection?t.getSelection().toString():e.selection?e.selection.createRange().text:""},{get:r}},g.factory("$selectedText",["$window","$document",p]),n=function(t){var e,r;return r=function(t,e,r){if(e&&r&&e.get("my_permissions").indexOf(r)>-1)return t.removeClass("hidden")},e=function(e,n,i){var o,s,a;return n.addClass("hidden"),o=i.tgCheckPermission,a=e.$watch(function(){return t.project},function(){if(t.project)return r(n,t.project,o),a()}),s=i.$observe("tgCheckPermission",function(e){if(e)return r(n,t.project,e),s()}),e.$on("$destroy",function(){return n.off()})},{link:e}},n.$inject=["tgProjectService"],g.directive("tgCheckPermission",n),i=function(){var t,e;return e="tgClassPermission",t=function(t,r,n){var i,o,s;return i=function(t,e,n){var i;return i="!"===n[0],i&&(n=n.slice(1)),i&&t.my_permissions.indexOf(n)===-1?r.addClass(e):i||t.my_permissions.indexOf(n)===-1?r.removeClass(e):r.addClass(e)},o=function(r){var o,a,c,u;if(r){s(),a=t.$eval(n[e]),u=[];for(o in a)c=a[o],u.push(i(r,o,c));return u}},s=t.$watch("project",o)},{link:t}},g.directive("tgClassPermission",i),t=function(){var t,e,r,n;return e=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,r=function(t){return function(t){var i;if(i=n.shift(),i(),n.length)return e(r)}}(this),n=[],t=function(){var t,i,o,s;for(s=[],i=0,o=arguments.length;i-1?t.resolve("project-backlog",r):e.is_kanban_activated&&e.my_permissions.indexOf("view_us")>-1?t.resolve("project-kanban",r):e.is_wiki_activated&&e.my_permissions.indexOf("view_wiki_pages")>-1?t.resolve("project-wiki",r):e.is_issues_activated&&e.my_permissions.indexOf("view_issues")>-1?t.resolve("project-issues",r):t.resolve("project",r)},{get:e}},g.factory("$projectUrl",["$tgNavUrls",c]),u=function(t){var e,r,n;return e=t.defer(),e.resolve(),r=e.promise,n={bindAdd:function(t){return function(e){return function(){var n;return n=1<=arguments.length?v.call(arguments,0):[],r=r.then(function(){return e.apply(t,n)})}}}(this),add:function(t){return function(t){return r=r?r.then(t):t(),n}}(this)}},g.factory("$tgQqueue",["$q",u]),l=function(t){function e(t,e,r,n){this.qqueue=t,this.repo=e,this.q=r,this.model=n}return y(e,t),e.$inject=["$tgQqueue","$tgRepo","$q","$tgModel"],e.prototype.setObject=function(t,e){this.scope=t,this.prop=e},e.prototype.clone=function(){var t,e;return t=_.cloneDeep(this.scope[this.prop]._attrs),e=this.model.make_model(this.scope[this.prop]._name,t)},e.prototype.getObj=function(){return this.scope[this.prop]},e.prototype.save=function(t){var e;return e=this.q.defer(),this.qqueue.add(function(r){return function(){var n,i,o,s,a;return s=r.getObj(),i=s.comment,s.comment="",n=r.clone(),o=_.omit(s._modifiedAttrs,["version"]),n=_.assign(n,o),t(n),i.length&&(n.comment=i),a=function(){return r.scope[r.prop]=n,e.resolve.apply(null,arguments)},r.repo.save(n).then(a,e.reject)}}(this)),e.promise},e}(m.Service),g.service("$tgQueueModelTransformation",l),f=function(t){return{get:function(e){return function(e,r){var n;return null==r&&(r=!1),n=t.get(e),r&&(n=_.template(n)),n}}(this)}},g.factory("$tgTemplate",["$templateCache",f]),r=function(){var t;return t="",{template:t}},g.directive("tgCapslock",[r]),a=function(){var t,e;return e='\n \n',t=function(t,e,r){},{scope:{onClose:"&"},link:t,template:e}},g.directive("tgLightboxClose",[a]),h=function(){var t;return t='\n \n {{svgTitle}}\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\n \n',{scope:{svgIcon:"@",svgTitle:"@",svgTitleTranslate:"@",svgTitleTranslateValues:"="},template:t}},g.directive("tgSvg",[h]),e=function(t,e,r){return{restrict:"A",link:function(r,n,i){var o;return i.ngShow?(o=e(i.ngShow),r.$watch(o,function(e){if(e===!0)return t(function(){return n[0].focus()})})):t(function(){return n[0].focus()})}}},g.directive("tgAutofocus",["$timeout","$parse","animationFrame",e]),g.directive("tgPreloadImage",function(){var t,e,r;return e="loading...",r="
    \n \n
    ",t=function(t,e){var r;return r=new Image,r.onload=e,r.src=t,r},{template:r,transclude:!0,replace:!0,link:function(r,n,i){var o,s,a;return o=n.find("img:last"),a=null,s=function(){if(n.find(".loading-spinner").remove(),o.show(),a)return clearTimeout(a),a=null},i.$observe("preloadSrc",function(r){return a&&clearTimeout(a),n.find(".loading-spinner").remove(),a=setTimeout(function(){return n.prepend(e)},200),o.hide(),t(r,s)})}}}),o=function(){var t;return t=function(t,e,r){return e.on("click",function(t){if(t.ctrlKey||t.metaKey)return t.preventDefault()})},{link:t}},g.directive("tgCtrlClickDisable",o)}.call(this),function(){var t,e,r,n,i,o,s,a,c;a=this.taiga,o=this.taiga.mixOf,c=this.taiga.toString,i=this.taiga.joinStr,n=this.taiga.groupBy,r=this.taiga.bindOnce,e=this.taiga.bindMethods,s=angular.module("taigaCommon"),t=function(){function t(t,e,r,n,i){this.params=t,this.repo=e,this.projectService=r,this.navurls=n,this.location=i,this.repo.resolve({pslug:this.params.pslug,ref:this.params.ref}).then(function(t){return function(e){var r;return e.issue?r=t.navurls.resolve("project-issues-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.task?r=t.navurls.resolve("project-tasks-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.us?r=t.navurls.resolve("project-userstories-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.epic?r=t.navurls.resolve("project-epics-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.wikipage&&(r=t.navurls.resolve("project-wiki-page",{project:t.projectService.project.get("slug"),slug:t.params.ref})),t.location.path(r)}}(this))}return t.$inject=["$routeParams","$tgRepo","tgProjectService","$tgNavUrls","$location"],t}(),s.controller("DetailController",t)}.call(this),function(){var t;t=angular.module("taigaEpics",[])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){return function(){return t.apply(e,arguments)}};o=this.taiga,i=this.taiga.startswith,r=this.taiga.bindMethods,n=angular.module("taigaEvents",[]),e=function(){function t(t,e,n,i,o,a){this.win=t,this.log=e,this.config=n,this.auth=i,this.liveAnnouncementService=o,this.rootScope=a,this.processMessage=s(this.processMessage,this),r(this)}return t.prototype.initialize=function(t){if(this.sessionId=t,this.subscriptions={},this.connected=!1,this.error=!1,this.pendingMessages=[],this.missedHeartbeats=0,this.heartbeatInterval=null,void 0===this.win.WebSocket)return this.log.info("WebSockets not supported on your browser")},t.prototype.setupConnection=function(){var t,e,r,n;if(this.stopExistingConnection(),n=this.config.get("eventsUrl"))return i(n,"ws:")||i(n,"wss:")||(t=this.win.location,r="https:"===t.protocol?"wss:":"ws:",e=_.trimStart(n,"/"),n=r+"//"+t.host+"/"+e),this.error=!1,this.ws=new this.win.WebSocket(n),this.ws.addEventListener("open",this.onOpen),this.ws.addEventListener("message",this.onMessage),this.ws.addEventListener("error",this.onError),this.ws.addEventListener("close",this.onClose)},t.prototype.stopExistingConnection=function(){if(void 0!==this.ws)return this.ws.removeEventListener("open",this.onOpen),this.ws.removeEventListener("close",this.onClose),this.ws.removeEventListener("error",this.onError),this.ws.removeEventListener("message",this.onMessage),this.stopHeartBeatMessages(),this.ws.close(),delete this.ws},t.prototype.notifications=function(){return this.subscribe(null,"notifications",function(t){return function(e){return t.liveAnnouncementService.show(e.title,e.desc),t.rootScope.$digest()}}(this))},t.prototype.startHeartBeatMessages=function(){var t,e,r;if(!this.heartbeatInterval)return e=this.config.get("eventsMaxMissedHeartbeats",5),t=this.config.get("eventsHeartbeatIntervalTime",6e4),r=this.config.get("eventsReconnectTryInterval",1e4),this.missedHeartbeats=0,this.heartbeatInterval=setInterval(function(t){return function(){var r;try{if(t.missedHeartbeats>=e)throw new Error("Too many missed heartbeats PINGs.");return t.missedHeartbeats++,t.sendMessage({cmd:"ping"}),t.log.debug("HeartBeat send PING")}catch(n){return r=n,t.log.error("HeartBeat error: "+r.message),t.setupConnection()}}}(this),t),this.log.debug("HeartBeat enabled")},t.prototype.stopHeartBeatMessages=function(){if(this.heartbeatInterval)return clearInterval(this.heartbeatInterval),this.heartbeatInterval=null,this.log.debug("HeartBeat disabled")},t.prototype.processHeartBeatPongMessage=function(t){return this.missedHeartbeats=0,this.log.debug("HeartBeat recived PONG")},t.prototype.serialize=function(t){return _.isObject(t)?JSON.stringify(t):t},t.prototype.sendMessage=function(t){var e,r,n,i,o;if(this.pendingMessages.push(t),this.connected){for(n=_.map(this.pendingMessages,this.serialize),this.pendingMessages=[],o=[],e=0,r=n.length;e\n
    <%- name %>
    '),i=function(i,c,u){var l,p,h,f,d;return d=function(t){var e,o,a;return o={name:r.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},a=i.usersById[t.assigned_to],e=n.getAvatar(a),o.imgurl=e.url,o.bg=e.bg,a&&(o.name=a.full_name_display),c.find(".avatar").html(s(o)),c.find(".task-assignedto").attr("title",o.name)},l=c.controller(),f=i.$eval(u.tgRelatedTaskAssignedToInlineEdition),h=i.$eval(u.notAutoSave),p=!h,i.$watch(u.tgRelatedTaskAssignedToInlineEdition,function(){return f=i.$eval(u.tgRelatedTaskAssignedToInlineEdition),d(f)}),d(f),c.on("click",".task-assignedto",function(t){return e.$broadcast("assigned-to:add",f)}),a.bindOnce(i,"project",function(t){if(t.my_permissions.indexOf("modify_task")===-1)return c.unbind("click"),c.find("a").addClass("not-clickable")}),i.$on("assigned-to:added",o(2e3,function(e){return function(e,r,n){if(n.id===f.id)return n.assigned_to=r,p&&t.save(n).then(function(){return i.$emit("related-tasks:assigned-to-changed")}),d(n)}}(this))),i.$on("$destroy",function(){return c.off()})},{link:i}},s.directive("tgRelatedTaskAssignedToInlineEdition",["$tgRepo","$rootScope","$translate","tgAvatarService",t])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;i=this.taiga,t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return s(e,t),e}(i.Service),o={auth:"/auth","auth-register":"/auth/register",invitations:"/invitations",users:"/users",by_username:"/users/by_username","users-password-recovery":"/users/password_recovery","users-change-password-from-recovery":"/users/change_password_from_recovery","users-change-password":"/users/change_password","users-change-email":"/users/change_email","users-cancel-account":"/users/cancel","user-stats":"/users/%s/stats","user-liked":"/users/%s/liked","user-voted":"/users/%s/voted","user-watched":"/users/%s/watched","user-contacts":"/users/%s/contacts","user-me":"/users/me",permissions:"/permissions","notify-policies":"/notify-policies","user-storage":"/user-storage",memberships:"/memberships","bulk-create-memberships":"/memberships/bulk_create",roles:"/roles",permissions:"/permissions",resolver:"/resolver",projects:"/projects","project-templates":"/project-templates","project-modules":"/projects/%s/modules","bulk-update-projects-order":"/projects/bulk_update_order","project-like":"/projects/%s/like","project-unlike":"/projects/%s/unlike","project-watch":"/projects/%s/watch","project-unwatch":"/projects/%s/unwatch","project-contact":"contact","project-transfer-validate-token":"/projects/%s/transfer_validate_token","project-transfer-accept":"/projects/%s/transfer_accept","project-transfer-reject":"/projects/%s/transfer_reject","project-transfer-request":"/projects/%s/transfer_request","project-transfer-start":"/projects/%s/transfer_start","epic-statuses":"/epic-statuses","userstory-statuses":"/userstory-statuses",points:"/points","task-statuses":"/task-statuses","issue-statuses":"/issue-statuses","issue-types":"/issue-types",priorities:"/priorities",severities:"/severities",milestones:"/milestones",epics:"/epics","epic-upvote":"/epics/%s/upvote","epic-downvote":"/epics/%s/downvote","epic-watch":"/epics/%s/watch","epic-unwatch":"/epics/%s/unwatch","epic-related-userstories":"/epics/%s/related_userstories","epic-related-userstories-bulk-create":"/epics/%s/related_userstories/bulk_create",userstories:"/userstories","bulk-create-us":"/userstories/bulk_create","bulk-update-us-backlog-order":"/userstories/bulk_update_backlog_order","bulk-update-us-milestone":"/userstories/bulk_update_milestone","bulk-update-us-miles-order":"/userstories/bulk_update_sprint_order","bulk-update-us-kanban-order":"/userstories/bulk_update_kanban_order","bulk-update-us-milestone":"/userstories/bulk_update_milestone","userstories-filters":"/userstories/filters_data","userstory-upvote":"/userstories/%s/upvote","userstory-downvote":"/userstories/%s/downvote","userstory-watch":"/userstories/%s/watch","userstory-unwatch":"/userstories/%s/unwatch",tasks:"/tasks","bulk-create-tasks":"/tasks/bulk_create","bulk-update-task-taskboard-order":"/tasks/bulk_update_taskboard_order","task-upvote":"/tasks/%s/upvote","task-downvote":"/tasks/%s/downvote","task-watch":"/tasks/%s/watch","task-unwatch":"/tasks/%s/unwatch","task-filters":"/tasks/filters_data",issues:"/issues","bulk-create-issues":"/issues/bulk_create","issues-filters":"/issues/filters_data","issue-upvote":"/issues/%s/upvote","issue-downvote":"/issues/%s/downvote","issue-watch":"/issues/%s/watch","issue-unwatch":"/issues/%s/unwatch",wiki:"/wiki","wiki-restore":"/wiki/%s/restore","wiki-links":"/wiki-links","history/epic":"/history/epic","history/us":"/history/userstory","history/issue":"/history/issue","history/task":"/history/task","history/wiki":"/history/wiki/%s","attachments/epic":"/epics/attachments","attachments/us":"/userstories/attachments","attachments/issue":"/issues/attachments","attachments/task":"/tasks/attachments","attachments/wiki_page":"/wiki/attachments","custom-attributes/epic":"/epic-custom-attributes","custom-attributes/userstory":"/userstory-custom-attributes","custom-attributes/task":"/task-custom-attributes","custom-attributes/issue":"/issue-custom-attributes","custom-attributes-values/epic":"/epics/custom-attributes-values","custom-attributes-values/userstory":"/userstories/custom-attributes-values","custom-attributes-values/task":"/tasks/custom-attributes-values","custom-attributes-values/issue":"/issues/custom-attributes-values",webhooks:"/webhooks","webhooks-test":"/webhooks/%s/test",webhooklogs:"/webhooklogs","webhooklogs-resend":"/webhooklogs/%s/resend","epics-csv":"/epics/csv?uuid=%s","userstories-csv":"/userstories/csv?uuid=%s","tasks-csv":"/tasks/csv?uuid=%s","issues-csv":"/issues/csv?uuid=%s","timeline-profile":"/timeline/profile","timeline-user":"/timeline/user","timeline-project":"/timeline/project",search:"/search",exporter:"/exporter",importer:"/importer/load_dump",feedback:"/feedback",locales:"/locales",applications:"/applications","application-tokens":"/application-tokens","stats-discover":"/stats/discover","importers-trello-auth-url":"/importers/trello/auth_url","importers-trello-authorize":"/importers/trello/authorize","importers-trello-list-projects":"/importers/trello/list_projects","importers-trello-list-users":"/importers/trello/list_users","importers-trello-import-project":"/importers/trello/import_project","importers-jira-auth-url":"/importers/jira/auth_url","importers-jira-authorize":"/importers/jira/authorize","importers-jira-list-projects":"/importers/jira/list_projects","importers-jira-list-users":"/importers/jira/list_users","importers-jira-import-project":"/importers/jira/import_project","importers-github-auth-url":"/importers/github/auth_url","importers-github-authorize":"/importers/github/authorize","importers-github-list-projects":"/importers/github/list_projects","importers-github-list-users":"/importers/github/list_users","importers-github-import-project":"/importers/github/import_project","importers-asana-auth-url":"/importers/asana/auth_url","importers-asana-authorize":"/importers/asana/authorize","importers-asana-list-projects":"/importers/asana/list_projects","importers-asana-list-users":"/importers/asana/list_users","importers-asana-import-project":"/importers/asana/import_project"},r=function(t,e){return t.debug("Initialize api urls"),e.update(o)},e=function(t,e){var r,n,i,o,s;for(t.debug("Initialize resources"),o=_.toArray(arguments).slice(2),s=[],r=0,n=o.length;rn){n=a.length,s.name=i,s.value=a;break}return 0===n?s:s},d=function(t){var e,r,n;r=[];for(e in t)n=t[e],m.find("li."+e).show(),r.push(m.find("li."+e+" .num").html(n.length));return r},f=function(t){return m.find("a.active").removeClass("active"),m.find("li."+t.name+" a").addClass("active"),u=!1,c=t.name},v={epics:r.get("search-epics"),issues:r.get("search-issues"),tasks:r.get("search-tasks"),userstories:r.get("search-userstories"),wikipages:r.get("search-wikipages")},g=function(r){var i,o,s,a,c;return o=n.find(".search-result-table").children(),s=o.scope(),s&&(s.$destroy(),o.remove()),a=t.$new(),a[r.name]=r.value,c=angular.element.parseHTML(l(v[r.name])),i=e(c)(a),n.find(".search-result-table").html(i)},t.$watch("searchResults",function(t){var e;if(h=t)return e=p(t),d(t),g(e),f(e)}),t.$watch("searchTerm",function(t){return void 0!==t&&i.search("text",t),o.trackPage(i.url(),"Search")}),n.on("click",".search-filter li > a",function(e){var r,n,i,o;return e.preventDefault(),o=angular.element(e.currentTarget),i=o.parent().data("name"),n=h?h[i]:[],r={name:i,value:n},t.$apply(function(){return g(r),f(r)})})},s=function(t,e,r){var i,o;return i=e.controller(),a(t,e,r,i),o=n.text,t.$watch("projectId",function(e){if(null!=e)return t.searchTerm=o})},{link:s}},c.directive("tgSearch",["$log","$compile","$templateCache","$routeParams","$tgLocation","$tgAnalytics",r])}.call(this),function(){var t;t=angular.module("taigaTaskboard",[])}.call(this),function(){var t;t=angular.module("taigaTasks",[])}.call(this),function(){var t;t=angular.module("taigaTeam",[])}.call(this),function(){var t;t=angular.module("taigaUserSettings",[])}.call(this),function(){var t;t=angular.module("taigaUserStories",[])}.call(this),function(){var t;t=angular.module("taigaWiki",[])}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=angular.module("taigaCommon"),t=function(t){function e(t,e,r,n,i,o){var s;this.rootscope=t,this.log=e,this.config=r,this.win=n,this.doc=i,this.location=o,this.initialized=!1,s=this.config.get("analytics",{}),this.accountId=s.accountId,this.pageEvent=s.pageEvent||"$routeChangeSuccess",this.trackRoutes=s.trackRoutes||!0,this.ignoreFirstPageLoad=s.ignoreFirstPageLoad||!1}return n(e,t),e.$inject=["$rootScope","$log","$tgConfig","$window","$document","$location"],e.prototype.initialize=function(){return this.accountId?(this.injectAnalytics(),this.win.ga("create",this.accountId,"auto"),this.win.ga("require","ec"),this.win.ga("require","displayfeatures"),this.trackRoutes&&!this.ignoreFirstPageLoad&&this.win.ga("send","pageview",this.getUrl()),this.trackRoutes&&this.rootscope.$on(this.pageEvent,function(t){return function(){return t.trackPage(t.getUrl(),"Taiga")}}(this)),this.initialized=!0,this.setUserId()):void this.log.debug("Analytics: no acount id provided. Disabling.")},e.prototype.setUserId=function(){var t,e;if(this.initialized&&this.win.ga)return this.win.ga("set","userId",null!=(t=this.rootscope)&&null!=(e=t.user)?e.uuid:void 0)},e.prototype.getUrl=function(){return this.location.path()},e.prototype.injectAnalytics=function(){var t;return(t=function(t,e,r,n,i,o,s){t.GoogleAnalyticsObject=i,t[i]=t[i]||function(){(t[i].q=t[i].q||[]).push(arguments)},t[i].l=1*new Date,o=e.createElement(r),s=e.getElementsByTagName(r)[0],o.async=1,o.src=n,s.parentNode.insertBefore(o,s)})(window,document,"script","//www.google-analytics.com/analytics.js","ga")},e.prototype.trackPage=function(t,e){if(this.initialized&&this.win.ga)return e=e||this.doc[0].title,this.win.ga("send","pageview",{page:t,title:e})},e.prototype.trackEvent=function(t,e,r,n){if(this.initialized&&this.win.ga)return this.win.ga("send","event",t,e,r,n)},e.prototype.ecViewPlan=function(t){if(this.initialized&&this.win.ga)return this.win.ga("ec:addProduct",{id:t.plan_id,name:t.name,category:"plans",quantity:1,position:1}),this.win.ga("ec:setAction","detail"),this.trackEvent("ecommerce","view-product-detail",t.name,t.plan_id)},e.prototype.ecClickPlan=function(t){if(this.initialized&&this.win.ga)return this.win.ga("ec:addProduct",{id:t.plan_id,name:t.name,category:"plans",quantity:1,position:1}),this.win.ga("ec:setAction","click"),this.trackEvent("ecommerce","click-product",t.name,t.plan_id)},e.prototype.ecListPlans=function(t,e){var r,n,i,o,s;if(o=t[0],this.initialized&&this.win.ga){for(s=1,r=0,n=o.length;r"+t+""))}),u.on("click.confirm-dialog","a.button-green",i(2e3,function(t){return function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=t.loading().target(n).start(),c.resolve({selected:a.val(),finish:function(e){if(null==e&&(e=!0),r.finish(),e)return t.hide(u)}})}}(this))),u.on("click.confirm-dialog",".button-red",function(t){return function(e){return e.preventDefault(),c.reject(),t.hide(u)}}(this)),this.lightboxService.open(u),c.promise},o.prototype.error=function(t){var e,r;return e=this.q.defer(),r=angular.element(".lightbox-generic-error"),r.find(".title").html(t),r.on("click.confirm-dialog",".button-green",function(t){return function(n){return n.preventDefault(),e.resolve(),t.hide(r)}}(this)),r.on("click.confirm-dialog",".close",function(t){return function(n){return n.preventDefault(),e.resolve(),t.hide(r)}}(this)),this.lightboxService.open(r),e.promise},o.prototype.success=function(t,e,r){var n,i,o,a,c;return n=this.q.defer(),o=angular.element(".lightbox-generic-success"),o.find("img").remove(),o.find("svg").remove(),r&&("img"===r.type?i=$("").addClass("lb-icon").attr("src",r.name):"svg"===r.type&&(i=document.createElement("div"),s.addClass(i,"icon"),s.addClass(i,r.name),s.addClass(i,"lb-icon"),a=document.createElementNS("http://www.w3.org/2000/svg","svg"),c=document.createElementNS("http://www.w3.org/2000/svg","use"),c.setAttributeNS("http://www.w3.org/1999/xlink","href","#"+r.name),i.appendChild(a).appendChild(c)),i&&o.find("section").prepend(i)),t&&o.find(".title").html(t),e&&o.find(".message").html(e),o.on("click.confirm-dialog",".button-green",function(t){return function(e){return e.preventDefault(),n.resolve(),t.hide(o)}}(this)),o.on("click.confirm-dialog",".close",function(t){return function(e){return e.preventDefault(),n.resolve(),t.hide(o)}}(this)),this.lightboxService.open(o),n.promise},o.prototype.loader=function(t,e,r){var n;return null==r&&(r=!1),n=angular.element(".lightbox-generic-loading"),t&&n.find(".title").html(t),e&&n.find(".message").html(e),r&&n.find(".spin").removeClass("hidden"),{start:function(t){return function(){return t.lightboxService.open(n)}}(this),stop:function(t){return function(){return t.lightboxService.close(n)}}(this),update:function(t){return function(t,e,r,i){return e&&n.find(".title").html(e),r&&n.find(".message").html(r),i?(n.find(".spin").addClass("hidden"),n.find(".progress-bar-wrapper").removeClass("hidden"),n.find(".progress-bar-wrapper > .bar").width(i+"%"),n.find(".progress-bar-wrapper > span").html(i+"%").css("left",i-9+"%")):(n.find(".spin").removeClass("hidden"),n.find(".progress-bar-wrapper").addClass("hidden"))}}(this)}},o.prototype.notify=function(t,r,i,o){var s,c,u;if(u=".notification-message-"+t,c=angular.element(u),!c.hasClass("active"))return i?c.find("h4").html(i):c.find("h4").html(this.translate.instant(e[t].title)),r?c.find("p").html(r):c.find("p").html(this.translate.instant(e[t].message)),s=angular.element("body"),s.find(".notification-message .notification-light").removeClass("active").addClass("inactive"),s.find(u).removeClass("inactive").addClass("active"),this.tsem&&n(this.tsem),o||(o="error"===t||"light-error"===t?3500:1500),this.tsem=a(o,function(t){return function(){return s.find(u).removeClass("active").addClass("inactive").one("animationend",function(){return $(this).removeClass("inactive")}),delete t.tsem}}(this)),c.on("click",".icon-close, .close",function(t){return function(t){return s.find(u).removeClass("active").addClass("inactive")}}(this))},o}(s.Service),o=angular.module("taigaCommon"),o.service("$tgConfirm",t)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g=function(t,e){function r(){this.constructor=t}for(var n in e)m.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},m={}.hasOwnProperty;d=this.taiga,u=this.taiga.bindMethods,l=this.taiga.bindOnce,p=this.taiga.debounce,h=d.generateHash,f=angular.module("taigaCommon"),s="text",o="url",i="multiline",n="date",c="url",a=[{key:s,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:i,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:n,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"},{key:c,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL"},{key:o,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT"}],e=function(t){function e(t,e,r,n,i,o){this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.confirm=i,this.q=o,u(this),this.type=null,this.objectId=null,this.projectId=null,this.customAttributes=[],this.customAttributesValues=null}return g(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$tgConfirm","$q"],e.prototype.initialize=function(t,e){return this.project=this.scope.project,this.type=t,this.objectId=e,this.projectId=this.scope.projectId},e.prototype.loadCustomAttributesValues=function(){return this.objectId?this.rs.customAttributesValues[this.type].get(this.objectId).then(function(t){return function(e){return t.customAttributes=t.project[t.type+"_custom_attributes"],t.customAttributesValues=e,e}}(this)):this.customAttributesValues},e.prototype.getAttributeValue=function(t){var e;return e=_.clone(t,!1),e.value=this.customAttributesValues.attributes_values[t.id],e},e.prototype.updateAttributeValue=function(t){var e,r,n;return n=function(t){return function(){return t.rootscope.$broadcast("custom-attributes-values:edit")}}(this),r=function(t){return function(e){return t.confirm.notify("error"),t.q.reject()}}(this),e=_.clone(this.customAttributesValues.attributes_values,!0),e[t.id]=t.value,this.customAttributesValues.attributes_values=e,this.customAttributesValues.id=this.objectId,this.repo.save(this.customAttributesValues).then(n,r)},e}(d.Controller),r=function(t,r){var n,i,o,s;return o=t.get("custom-attributes/custom-attributes-values.html",!0),n=function(t){return h(["custom-attributes-collapsed",t])},i=function(t,e,i,o){var s,a,c;return s=o[0],a=o[1],c=n(i.type),t.collapsed=r.get(c)||!1,l(t,i.ngModel,function(t){return s.initialize(i.type,t.id),s.loadCustomAttributesValues()}),t.toggleCollapse=function(){return t.collapsed=!t.collapsed,r.set(c,t.collapsed)},t.$on("$destroy",function(){return e.off()})},s=function(t,e){return o({requiredEditionPerm:e.requiredEditionPerm})},{require:["tgCustomAttributesValues","ngModel"],controller:e,controllerAs:"ctrl",restrict:"AE",scope:!0,link:i,template:s}},f.directive("tgCustomAttributesValues",["$tgTemplate","$tgStorage","$translate",r]),t=function(t,e,r,i,o,s){var a,c,u;return c=t.get("custom-attributes/custom-attribute-value.html",!0),u=t.get("custom-attributes/custom-attribute-value-edit.html",!0),a=function(t,a,l,h){var f,d,g,m,v,y;return g=i.instant("COMMON.PICKERDATE.FORMAT"),m=function(e,i){var l,p,h,f,m,v;return null==i&&(i=!1),v=e.type===n&&e.value?moment(e.value,"YYYY-MM-DD").format(g):e.value,h=d(),l={id:e.id,name:e.name,description:e.description,value:v,isEditable:h,type:e.type},m=t.$new(),m.attributeHtml=s.getHTML(v),!h||!i&&v?(f=c(l),f=r(f)(m),a.html(f)):(f=u(l),f=r(f)(m),a.html(f),e.type===n?(p=o.get(),_.merge(p,{field:a.find("input[name=value]")[0],onSelect:function(t){return function(t){var e;return e=t}}(this),onOpen:function(t){return function(){if("undefined"!=typeof selectedDate&&null!==selectedDate)return a.picker.setDate(selectedDate)}}(this)}),a.picker=new Pikaday(p)):void 0)},d=function(){var e,r;return e=t.project.my_permissions,r=l.requiredEditionPerm,e.indexOf(r)>-1},t.saveCustomRichText=function(t){return function(t,e){return f.value=t,h.updateAttributeValue(f).then(function(){return e(),m(f,!1)})}}(this),t.cancelCustomRichText=function(t){return function(){return m(f,!1),null}}(this),y=p(2e3,function(e){return function(e){var r,i;if(e.preventDefault(),r=a.find("form").checksley(),r.validate())return i=a.find("input[name=value], textarea[name='value']"),f.value=i.val(),f.type===n&&moment(f.value,g).isValid()&&(f.value=moment(f.value,g).format("YYYY-MM-DD")),t.$apply(function(){return h.updateAttributeValue(f).then(function(){return m(f,!1)})})}}(this)),v=function(){return a.find("input[name='value'], textarea[name='value']").focus().select()},f=t.$eval(l.tgCustomAttributeValue),null!==f.value&&void 0!==f.value||(f.value=""),t.customAttributeValue=f,m(f),a.on("click",".js-value-view-mode span a",function(t){return t.stopPropagation()}),a.on("click",".js-value-view-mode",function(){if(d()&&!e.get().length)return m(f,!0),v()}),a.on("click",".js-edit-description",function(t){return t.preventDefault(),m(f,!0),v()}),a.on("keyup","input[name=value], textarea[name='value']",function(t){return 13===t.keyCode&&"textarea"!==t.currentTarget.type?y(t):27===t.keyCode?m(f,!1):void 0}),a.on("submit","form",y),a.on("click",".js-save-description",y),t.$on("$destroy",function(){return a.off()})},{link:a,require:"^tgCustomAttributesValues",restrict:"AE"}},f.directive("tgCustomAttributeValue",["$tgTemplate","$selectedText","$compile","$translate","tgDatePickerConfigService","tgWysiwygService",t])}.call(this),function(){var t,e,r,n=function(t,e){return function(){return t.apply(e,arguments)}},i=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;r=this.taiga,e=angular.module("taigaCommon"),t=function(t){function e(){this.replaceEmojiNameByHtmlImgs=n(this.replaceEmojiNameByHtmlImgs,this),this.replaceEmojiNameByImgs=n(this.replaceEmojiNameByImgs,this),this.replaceImgsByEmojiName=n(this.replaceImgsByEmojiName,this),this.getEmojiByName=n(this.getEmojiByName,this),this.getEmojiById=n(this.getEmojiById,this),this.searchByName=n(this.searchByName,this),this.emojis=_.map(r.emojis,function(t){return t.image="/"+window._version+"/emojis/"+t.image,t}),this.emojisById=_.keyBy(this.emojis,"id"),this.emojisByName=_.keyBy(this.emojis,"name")}return i(e,t),e.$inject=[],e.prototype.searchByName=function(t){return _.filter(this.emojis,function(e){return e.name.indexOf(t)!==-1})},e.prototype.getEmojiById=function(t){return this.emojisById[t]},e.prototype.getEmojiByName=function(t){return this.emojisByName[t]},e.prototype.replaceImgsByEmojiName=function(t){var e,n,i,o,s,a;for(i=r.getMatches(t,/emojis\/([^"]+).png"/gi),o=0,s=i.length;o]+>","g"),e=this.getEmojiById(n),t=t.replace(a,":"+e.name+":");return t},e.prototype.replaceEmojiNameByImgs=function(t){var e,n,i,o,s,a;for(i=r.getMatches(t,/:([\w +-]*):/g),o=0,s=i.length;o'));return t},e}(r.Service),e.service("$tgEmojis",t)}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){return function(){return t.apply(e,arguments)}};o=this.taiga,n=this.taiga.groupBy,i=angular.module("taigaCommon"),e=function(t,e,r,n,i){var o;return o=function(e,r,o,s){return e.$watch(o.ngModel,function(o){var a;if(o)return a=t.create(r,o,e.project),a.onSelectedPointForRole=function(t,r,n){return o.points=n,a.render(),e.$apply(function(){return s.$setViewValue(o)})},a.render=function(){var t,r,o,s;return t={totalPoints:this.calculateTotalPoints(),roles:this.calculateRoles(),editable:this.isEditable,loading:!1},o="common/estimation/us-estimation-points-per-role.html",s=n.get(o,!0),r=s(t),r=i(r)(e),this.$el.html(r)},a.render()}),e.$on("$destroy",function(){return r.off()})},{link:o,restrict:"EA",require:"ngModel"}},i.directive("tgLbUsEstimation",["$tgEstimationsService","$rootScope","$tgRepo","$tgTemplate","$compile",e]),r=function(t,e,r,n,i,o,s){var a;return a=function(r,a,c,u){var l;return l=function(t){var e,r;return r=o.save(function(e){return function(e){return e.points=t,e}}(this)),e=function(t){return function(){return s.notify("error")}}(this),r.then(null,e)},r.$watchCollection(function(){return u.$modelValue&&u.$modelValue.points},function(){var o,s;if(s=u.$modelValue)return o=t.create(a,s,r.project),o.onSelectedPointForRole=function(t,r,n){return o.loading=t,o.render(),l(n).then(function(){return o.loading=!1,e.$broadcast("object:updated"),o.render()})},o.render=function(){var t,e,s,a;return t={totalPoints:this.calculateTotalPoints(),roles:this.calculateRoles(),editable:this.isEditable,loading:o.loading},s="common/estimation/us-estimation-points-per-role.html",a=n.get(s,!0),e=a(t),e=i(e)(r),this.$el.html(e)},o.render()}),r.$on("$destroy",function(){return a.off()})},{link:a,restrict:"EA",require:"ngModel"}},i.directive("tgUsEstimation",["$tgEstimationsService","$rootScope","$tgRepo","$tgTemplate","$compile","$tgQueueModelTransformation","$tgConfirm",r]),t=function(t,e,r,i,o){var a,c,u;return u=t.get("common/estimation/us-estimation-points.html",!0),a=function(){function t(t,e,r){this.$el=t,this.us=e,this.project=r,this.bindClickEvents=s(this.bindClickEvents,this),this.isEditable=this.project.my_permissions.indexOf("modify_us")!==-1,this.roles=this.project.roles,this.points=this.project.points,this.loading=!1,this.pointsById=n(this.points,function(t){return t.id}),this.onSelectedPointForRole=function(t,e){},this.render=function(){}}return t.prototype.save=function(t,n){var s;return s=i.defer(),o.add(function(t){return function(){var n,i;return i=function(){return s.resolve(),t.render()},n=function(){return r.notify("error"),t.us.revert(),t.render(),s.reject()},e.save(t.us).then(i,n)}}(this)),s.promise},t.prototype.calculateTotalPoints=function(){var t,e;return e=_.map(this.us.points,function(t){return function(e,r){var n;return null!=(n=t.pointsById[e])?n.value:void 0}}(this)),0===e.length?"?":(t=_.filter(e,function(t){return null!=t}),0===t.length?"?":_.reduce(t,function(t,e){return t+e}))},t.prototype.calculateRoles=function(){var t,e;return t=_.filter(this.project.roles,"computable"),e=_.map(t,function(t){return function(e){var r,n;return r=t.us.points[e.id],n=t.pointsById[r],e=_.clone(e,!0),e.points=null!=n&&null!=n.name?n.name:"?",e}}(this))},t.prototype.bindClickEvents=function(){return this.$el.on("click",".total.clickable",function(t){return function(e){var r,n;return e.preventDefault(),e.stopPropagation(),n=angular.element(e.currentTarget),r=n.data("role-id"),t.renderPointsSelector(r,n),n.siblings().removeClass("active"),n.addClass("active")}}(this)),this.$el.on("click",".point",function(t){return function(e){var r,n,i,o;return e.preventDefault(),e.stopPropagation(),o=angular.element(e.currentTarget),i=o.data("role-id"),r=o.data("point-id"),t.$el.find(".popover").popover().close(),n=_.clone(t.us.points,!0),n[i]=r,t.onSelectedPointForRole(i,r,n)}}(this))},t.prototype.renderPointsSelector=function(t,e){var r,n,i,o,s;if(o=_.map(this.points,function(e){return function(r){return r=_.clone(r,!0),r.selected=e.us.points[t]!==r.id,r}}(this)),i=5,r=_.some(o,function(t){return function(t){return t.name.length>i}}(this)),n=u({points:o,roleId:t,horizontal:r}),this.$el.find(".popover").popover().close(),this.$el.find(".pop-points-open").remove(),null!=e?this.$el.find(e).append(n):this.$el.append(n),this.$el.find(".pop-points-open").popover().open(function(){return $(this).removeClass("active").closest("li").removeClass("active")}),this.$el.find(".pop-points-open").show(),s=this.$el.find(".pop-points-open"),s.offset().top+s.height()>document.body.clientHeight)return s.addClass("pop-bottom")},t}(),c=function(t,e,r){var n;return t.unbind("click"),n=new a(t,e,r),n.isEditable&&n.bindClickEvents(),n},{create:c}},i.factory("$tgEstimationsService",["$tgTemplate","$tgRepo","$tgConfirm","$q","$tgQqueue",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f;l=this.taiga,s=angular.module("taigaCommon"),r=function(){return function(t,e){return t===[null,void 0]?e:t}},s.filter("default",r),f=function(t){return function(e){return e?t.instant("COMMON.YES"):t.instant("COMMON.NO")}},s.filter("yesNo",["$translate",f]),h=function(){return l.unslugify},s.filter("unslugify",h),a=function(){return function(t,e){return t?moment(t).format(e):""}},s.filter("momentFormat",a),c=function(){return function(t,e){return t?moment(t).fromNow(e||!1):""}},s.filter("momentFromNow",c),u=function(t){return function(){return t.taiga.sizeFormat}}(this),s.filter("sizeFormat",u),p=function(){var t,e;return e=function(t){return t.toJS()},t=_.memoize(e),function(e){return e instanceof Immutable.List?t(e):e}},s.filter("toMutable",p),t=function(t){return function(e,r){var n;return(null!=r?r.startsWith("#"):void 0)?(n=r.substr(1),_.filter(e,function(t){return function(t){return String(t.ref).startsWith(n)}}(this))):t(e,r)}},s.filter("byRef",["filterFilter",t]),e=function(){return function(t,e){var r,n,i,o,s,a,c,u;for(t=new String(t).replace(/[^0-9a-f]/gi,""),t.length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),e=e||0,a="#",n=0,i=0,r=0,u=255,c=[0,1,2],o=0,s=c.length;o5},a=d(r),a=n(a)(o),s.find(".assigned-to-list").html(a)},c=function(){return e.stop(),t.close(s)},o.$on("assigned-to:add",function(r,n){var i;return h=n,i=n.assigned_to,f=o.usersById[i],p(f),t.open(s).then(function(){return s.find("input").focus(),e.init(s)})}),o.$watch("usersSearch",function(t){if(null!=t)return p(f,t),s.find("input").focus()}),s.on("click",".user-list-single",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),c(),o.$apply(function(){return o.$broadcast("assigned-to:added",e.data("user-id"),h),o.usersSearch=null})}),s.on("click",".remove-assigned-to",function(t){return t.preventDefault(),t.stopPropagation(),c(),o.$apply(function(){return o.usersSearch=null,o.$broadcast("assigned-to:added",null,h)})}),s.on("click",".close",function(t){return t.preventDefault(),c(),o.$apply(function(){return o.usersSearch=null})}),o.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-assigned-to.html",link:o}},h.directive("tgLbAssignedto",["lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",t]),u=function(t,e,r,n,i,o){var s;return s=function(t,s,a){var c,u,l,h,f;return h=null,f=n.get("common/lightbox/lightbox-assigned-to-users.html",!0),u=function(e){var r,n;return null==e&&(e=""),r=function(t,e){var r;return(!h||!_.find(h.watchers,function(t){return t===e.id}))&&(r=e.full_name_display.toUpperCase(),t=t.toUpperCase(),_.includes(r,t))},n=_.clone(t.activeUsers,!0),n=_.filter(n,_.partial(r,e))},l=function(e){var r,n,a;return a=_.slice(e,0,5),a=_.map(a,function(t){return t.avatar=o.getAvatar(t),t}),r={selected:!1,users:a,showMore:e.length>5},n=f(r),n=i(n)(t),s.find(".ticket-watchers").html(n)},c=function(){return r.stop(),e.close(s)},t.$on("watcher:add",function(t,n){var i;return h=n,i=u(),l(i),e.open(s).then(function(){return s.find("input").focus(),r.init(s)})}),t.$watch("usersSearch",function(t){var e;if(null!=t)return e=u(t),l(e),s.find("input").focus()}),s.on("click",".user-list-single",p(200,function(e){ +var r;return c(),e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return t.usersSearch=null,t.$broadcast("watcher:added",r.data("user-id"))})})),s.on("click",".close",function(e){return e.preventDefault(),c(),t.$apply(function(){return t.usersSearch=null})}),t.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-users.html",link:s}},h.directive("tgLbWatchers",["$tgRepo","lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",u]),a=function(t,e,r){var n;return n=function(e,r,n){return t.open(r)},{templateUrl:"common/lightbox/lightbox-leave-project-warning.html",link:n,scope:!0}},h.directive("tgLightboxLeaveProjectWarning",["lightboxService",a])}.call(this),function(){var t,e,r,n,i,o;i=this.taiga,n=this.taiga.sizeFormat,o=this.taiga.timeout,r=angular.module("taigaCommon"),e=function(t,e){var r;return r=function(e,r,n){return t.onStart(function(){return $(document.body).addClass("loader-active"),r.addClass("active")}),t.onEnd(function(){return $(document.body).removeClass("loader-active"),r.removeClass("active")})},{link:r}},r.directive("tgLoader",["tgLoader","$rootScope",e]),t=function(t){var e,r,n,i,s,a,c,u;return r={minTime:300},i=!1,u=0,a=0,n=0,s=function(e){var s,c,l;return null==e&&(e=!1),u&&(l=0,e||(c=(new Date).getTime(),s=c-u,s",function(){var r;return r={settings:{target:null,scope:null,classes:[],timeout:0,template:null},target:function(t){return r.settings.target=t,r},scope:function(t){return r.settings.scope=t,r},template:function(t){return r.settings.template=t,r},removeClasses:function(){var t;return t=1<=arguments.length?n.call(arguments,0):[],r.settings.classes=t,r},timeout:function(t){return r.settings.timeout=t,r},start:function(){var t,n;return t=r.settings.target,r.settings.classes.map(function(e){return t.removeClass(e)}),t.hasClass("loading")||r.settings.template||(r.settings.template=t.html()),n=setTimeout(function(){if(!t.hasClass("loading"))return t.addClass("loading"),t.html(e)},r.settings.timeout),r.settings.timeoutId=n,r},finish:function(){var e,n,i;return n=r.settings.target,i=r.settings.timeoutId,i&&(clearTimeout(i),e=r.settings.classes,e.map(function(t){return r.settings.target.addClass(t)}),n.html(r.settings.template),n.removeClass("loading"),r.settings.scope&&t(n.contents())(r.settings.scope)),r}}}},e.$inject=["$compile"],r.factory("$tgLoading",e),t=function(t){var e;return e=function(e,r,n){var i,o;return i=null,o=r.html(),e.$watch(n.tgLoading,function(n){return function(n){return n?i=t().target(r).timeout(100).template(o).scope(e).start():i?i.finish():void 0}}(this))},{priority:99999,link:e}},r.directive("tgLoading",["$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,r=this.taiga.bindOnce,n=this.taiga.debounce,i=angular.module("taigaCommon"),e=function(t,e){var i,o;return o=e.get("common/popover/popover-us-status.html",!0),i=function(e,i,s){var a,c,u;return a=i.controller(),c=function(t){var r,n,o;if(o=i.find(".us-status"),n=i.find(".us-status .us-status-bind"),r=e.usStatusById,r[t.status])return n.text(r[t.status].name),o.css("color",r[t.status].color)},i.on("click",".us-status",function(t){return t.preventDefault(),t.stopPropagation(),i.find(".pop-status").popover().open()}),i.on("click",".status",n(2e3,function(r){var n,o;return r.preventDefault(),r.stopPropagation(),n=angular.element(r.currentTarget),o=e.$eval(s.tgUsStatus),o.status=n.data("status-id"),c(o),i.find(".pop-status").popover().close(),e.$apply(function(){return t.save(o).then(function(){return e.$eval(s.onUpdate)})})})),e.$on("userstories:loaded",function(){return c(e.$eval(s.tgUsStatus))}),e.$on("$destroy",function(){return i.off()}),u=e.$eval(s.tgUsStatus),c(u),r(e,"project",function(t){var r;if(r=o({statuses:t.us_statuses}),i.append(r),e.project.my_permissions.indexOf("modify_us")===-1)return i.unbind("click"),i.find("a").addClass("not-clickable")})},{link:i}},i.directive("tgUsStatus",["$tgRepo","$tgTemplate",e]),t=function(t,e){var r,i,s;return i=e.get("common/popover/popover-related-task-status.html",!0),s=function(t,e,r){var n,i;if(i=t.find(".us-status"),n=t.find(".task-status .task-status-bind"),r[e.status])return n.text(r[e.status].name),i.css("color",r[e.status].color)},r=function(e,r,a){var c,u,l,p;return c=r.controller(),p=e.$eval(a.tgRelatedTaskStatus),l=e.$eval(a.notAutoSave),u=!l,r.on("click",".task-status",function(t){return t.preventDefault(),t.stopPropagation(),r.find(".pop-status").popover().open()}),r.on("click",".status",n(2e3,function(n){var i;if(n.preventDefault(),n.stopPropagation(),i=angular.element(n.currentTarget),p.status=i.data("status-id"),r.find(".pop-status").popover().close(),s(r,p,e.taskStatusById),u)return e.$apply(function(){return t.save(p).then(function(){return e.$eval(a.onUpdate),e.$emit("related-tasks:status-changed")})})})),e.$watch(a.tgRelatedTaskStatus,function(){return p=e.$eval(a.tgRelatedTaskStatus),s(r,p,e.taskStatusById)}),o.bindOnce(e,"project",function(t){if(r.append(i({statuses:t.task_statuses})),s(r,p,e.taskStatusById),t.my_permissions.indexOf("modify_task")===-1)return r.unbind("click"),r.find("a").addClass("not-clickable")}),e.$on("$destroy",function(){return r.off()})},{link:r}},i.directive("tgRelatedTaskStatus",["$tgRepo","$tgTemplate",t]),$.fn.popover=function(){var t,e,r,n,i,o;return t=this,i=function(e){return function(){var e,r,n,i,o,s,a,c,u,l;return t.css({display:"block",visibility:"hidden"}),i=$(window).scrollTop(),e=i+$(window).height(),o=$(window).width(),n=o,r=0,u=t.offset().top,s=u+t.height(),l=t.width(),a=t.offset().left,c=t.offset().left+l,t.css({display:"none",visibility:"visible"}),s<=e&&u>=i&&a>=r&&c<=n}}(this),n=function(e){return function(e){return e&&e.call(t),t.fadeOut(function(){return t.removeClass("active").removeClass("fix")}),t.off("popup:close")}}(this),r=function(t){return function(){return $(".popover.active").each(function(){return $(this).trigger("popup:close")})}}(this),o=function(o){return function(o){return t.hasClass("active")?e():(r(),i()||t.addClass("fix"),t.fadeIn(function(){return t.addClass("active"),$(document.body).off("popover"),$(document.body).one("click.popover",function(){return r()})}),t.on("popup:close",function(t){return n(o)}))}}(this),e=function(e){return function(){return t.trigger("popup:close")}}(this),{open:o,close:e,closeAll:r}}}.call(this),function(){var t,e,r;r=this.taiga,e=angular.module("taigaCommon"),t=function(t,e){var r;return this.config=e,r=this.config.get("ravenConfig",null),r?(t.debug("Using the RavenJS exception handler."),Raven.config(r).install(),function(e,r){return t.error.apply(t,arguments),Raven.captureException(e)}):(t.debug("Using the default logging exception handler."),function(e,r){return t.error.apply(t,arguments)})},e.factory("$exceptionHandler",["$log","$tgConfig",t])}.call(this),function(){var e,r,n,i,o,s,a,c=[].indexOf||function(t){for(var e=0,r=this.length;e\n <% if (tag[1] !== null) { %>\n \n <%= emojify(tag[0]) %>\n \n <% } %>\n<% }) %>\n<% _.each(tags, function(tag) { %>\n <% if (tag[1] === null) { %>\n \n <%= emojify(tag[0]) %>\n \n <% } %>\n<% }) %>'),e=function(e,n,i,o){var s;return s=function(e){var i;return i=r({tags:e,emojify:function(e){return t.replaceEmojiNameByHtmlImgs(_.escape(e))}}),n.html(i)},e.$watch(i.tgColorizeBacklogTags,function(t){if(null!=t)return s(t)}),e.$on("$destroy",function(){return n.off()})},{link:e}},o.directive("tgColorizeBacklogTags",["$tgEmojis",e]),r=function(e,r,n){var o,s,u,l,p;return s=13,o=188,p=r.get("common/tag/lb-tag-line-tags.html",!0),u=null,l=function(e,r,o,l){var h,f,d,g,m,v,y,b;return b=_.has(o,"withoutColors"),g=function(i,o){var s,a,c;return null==o&&(o=[]),s=b?null:o[t],a={tags:_.map(i,function(t){return{name:t,style:s?"border-left: 5px solid "+s:""}})},c=n(p(a))(e),r.find(".tags-container").html(c)},y=function(){return r.find(".save").removeClass("hidden")},d=function(){return r.find(".save").addClass("hidden")},m=function(){return r.find("input").val(""),u.close()},h=function(t){var r;if(t=a(t.toLowerCase()),0!==t.length)return r=_.clone(l.$modelValue,!1),null==r&&(r=[]),c.call(r,t)<0&&r.push(t),e.$apply(function(){return l.$setViewValue(r)}),d()},f=function(t){var r;if(t=a(t.toLowerCase()),0!==t.length)return r=_.clone(l.$modelValue,!1),r=_.pull(r,t),e.$apply(function(){return l.$setViewValue(r)})},v=function(){var t;return t=r.find("input").val(),h(t),m()},r.on("keypress","input",function(t){var e;return e=angular.element(t.currentTarget),t.keyCode===s?(t.preventDefault(),v()):","===String.fromCharCode(t.keyCode)?(t.preventDefault(),v()):e.val().length?y():d()}),r.on("click",".save",function(t){return t.preventDefault(),v()}),r.on("click",".remove-tag",function(t){var e,r;return t.preventDefault(),e=angular.element(t.currentTarget),r=e.siblings(".tag-name").text(),f(r)}),i(e,"project",function(t){var e;return e=r.find("input"),u=new Awesomplete(e[0],{list:_.keys(t.tags_colors)}),e.on("awesomplete-selectcomplete",function(){return h(e.val()),e.val("")})}),e.$watch(o.ngModel,function(t){var r,n;return n=(null!=(r=e.project)?r.tags_colors:void 0)||[],g(t,n)}),e.$on("$destroy",function(){return r.off()})},{link:l,require:"ngModel",templateUrl:"common/tag/lb-tag-line.html"}},o.directive("tgLbTagLine",["$tgResources","$tgTemplate","$compile",r])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaBacklog"),t=function(t,e,n,i,o,s,a){var c;return c=function(n,c,u){var l,p,h,f,d,g,m,v;return f=!1,l=!0,p=null,n.newSprint={},v=null,g=function(){return p&&p.reset(),n.newSprint={project:null,name:null,estimated_start:null,estimated_finish:null}},m=r(2e3,function(r){return function(r){var u,h,d,g,m,y,b,S,j;return r.preventDefault(),j=angular.element(r.currentTarget),y=a.instant("COMMON.PICKERDATE.FORMAT"),S=c.find(".submit-button"),p=c.find("form").checksley(),p.validate()?(f=!1,u=null,g=$(".date-start").val(),d=$(".date-end").val(),l?(m=angular.copy(n.newSprint),m.estimated_start=moment(g,y).format("YYYY-MM-DD"),m.estimated_finish=moment(d,y).format("YYYY-MM-DD"),b=t.create("milestones",m),u="sprintform:create:success"):(m=n.newSprint.realClone(),m.estimated_start=moment(g,y).format("YYYY-MM-DD"),m.estimated_finish=moment(d,y).format("YYYY-MM-DD"),b=t.save(m),u="sprintform:edit:success"),h=s().target(S).start(),b.then(function(t){return h.finish(),l&&(n.sprintsCounter+=1),n.sprints=_.map(n.sprints,function(e){return e.id===t.id?t:e}),"sprintform:create:success"===u&&v?i.$broadcast(u,t,v):i.$broadcast(u,t),o.close(c)}),b.then(null,function(t){return h.finish(),p.setErrors(t),t._error_message?e.notify("light-error",t._error_message):t.__all__?e.notify("light-error",t.__all__[0]):void 0})):(f=!0,void c.find(".last-sprint-name").addClass("disappear"))}}(this)),d=function(){var r,s;return s=a.instant("LIGHTBOX.DELETE_SPRINT.TITLE"),r=n.newSprint.name,e.askOnDelete(s,r).then(function(r){return function(r){var s,a;return a=function(){return r.finish(),n.milestonesCounter-=1,o.close(c),i.$broadcast("sprintform:remove:success",n.newSprint)},s=function(){return r.finish(!1),e.notify("error")},t.remove(n.newSprint).then(a,s)}}(this))},h=function(){var t,e;return t=_.filter(n.sprints,function(t){return!t.closed}),e=_.sortBy(t,function(t){return moment(t.estimated_finish,"YYYY-MM-DD").format("X")}),e[e.length-1]},n.$on("sprintform:create",function(t,e,r){var i,s,u,f,d,m;return v=r,g(),p=c.find("form").checksley(),p.reset(),l=!0,d=a.instant("COMMON.PICKERDATE.FORMAT"),n.newSprint.project=e,n.newSprint.name=null,n.newSprint.slug=null,u=h(),s=moment(),u?s=moment(u.estimated_finish):n.newSprint.estimated_start&&(s=moment(n.newSprint.estimated_start)),n.newSprint.estimated_start=s.format(d),i=moment().add(2,"weeks"),u?i=moment(u.estimated_finish).add(2,"weeks"):n.newSprint.estimated_finish&&(i=moment(n.newSprint.estimated_finish)),n.newSprint.estimated_finish=i.format(d),f=c.find(".last-sprint-name"),null!=(null!=u?u.name:void 0)&&(m=a.instant("LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME",{lastSprint:u.name}),f.html(m)),c.find(".delete-sprint").addClass("hidden"),m=a.instant("LIGHTBOX.ADD_EDIT_SPRINT.TITLE"),c.find(".title").text(m),m=a.instant("COMMON.CREATE"),c.find(".button-green").text(m),o.open(c),c.find(".sprint-name").focus(),c.find(".last-sprint-name").removeClass("disappear")}),n.$on("sprintform:edit",function(t,e){var r,i,s;return g(),l=!1,i=a.instant("COMMON.PICKERDATE.FORMAT"),n.$apply(function(){return n.newSprint=e.realClone(),n.newSprint.estimated_start=moment(n.newSprint.estimated_start).format(i),n.newSprint.estimated_finish=moment(n.newSprint.estimated_finish).format(i)}),c.find(".delete-sprint").removeClass("hidden"),r=a.instant("BACKLOG.EDIT_SPRINT"),c.find(".title").text(r),s=a.instant("COMMON.SAVE"),c.find(".button-green").text(s),o.open(c),c.find(".sprint-name").focus().select(),c.find(".last-sprint-name").addClass("disappear")}),c.on("keyup",".sprint-name",function(t){return c.find(".sprint-name").val().length>0||f?c.find(".last-sprint-name").addClass("disappear"):c.find(".last-sprint-name").removeClass("disappear")}),c.on("submit","form",m),c.on("click",".delete-sprint",function(t){return t.preventDefault(),d()}),n.$on("$destroy",function(){return c.off()}),g()},{link:c}},n.directive("tgLbCreateEditSprint",["$tgRepo","$tgConfirm","$tgResources","$rootScope","lightboxService","$tgLoading","$translate",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v=function(t,e){function r(){this.constructor=t}for(var n in e)y.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},y={}.hasOwnProperty;d=this.taiga,p=this.taiga.mixOf,m=this.taiga.toggleText,f=this.taiga.scopeDefer,c=this.taiga.bindOnce,l=this.taiga.groupBy,g=this.taiga.timeout,a=this.taiga.bindMethods,u=this.taiga.generateHash,h=angular.module("taigaBacklog"),t=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d,g,m,v,y,_,b){var S;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=c,this.appMetaService=u,this.navUrls=l,this.events=p,this.analytics=h,this.translate=f,this.loading=d,this.rs2=g,this.modelTransform=m,this.errorHandlingService=v,this.storage=y,this.filterRemoteStorageService=_,this.projectService=b,a(this),this.backlogOrder={},this.milestonesOrder={},this.page=1,this.disablePagination=!1,this.firstLoadComplete=!1,this.scope.userstories=[],this.applyStoredFilters(this.params.pslug,"backlog-filters")||(this.scope.sectionName=this.translate.instant("BACKLOG.SECTION_NAME"),this.showTags=!1,this.activeFilters=!1,this.scope.showGraphPlaceholder=null,this.displayVelocity=!1,this.initializeEventHandlers(),S=this.loadInitialData(),S.then(function(t){return function(){var e,r;if(t.firstLoadComplete=!0,r=t.translate.instant("BACKLOG.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.translate.instant("BACKLOG.PAGE_DESCRIPTION",{projectName:t.scope.project.name,projectDescription:t.scope.project.description}),t.appMetaService.setAll(r,e),t.rs.userstories.getShowTags(t.scope.projectId))return t.showTags=!0,t.scope.$broadcast("showTags",t.showTags)}}(this)),S.then(null,this.onInitialDataError.bind(this)))}return v(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","tgAppMetaService","$tgNavUrls","$tgEvents","$tgAnalytics","$translate","$tgLoading","tgResources","$tgQueueModelTransformation","tgErrorHandlingService","$tgStorage","tgFilterRemoteStorageService","tgProjectService"],e.prototype.storeCustomFiltersName="backlog-custom-filters",e.prototype.storeFiltersName="backlog-filters",e.prototype.backlogOrder={},e.prototype.milestonesOrder={},e.prototype.filtersReloadContent=function(){return this.loadUserstories(!0)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("usform:bulk:success",function(t){return function(){return t.loadUserstories(!0),t.loadProjectStats(),t.confirm.notify("success"),t.analytics.trackEvent("userstory","create","bulk create userstory on backlog",1)}}(this)),this.scope.$on("sprintform:create:success",function(t){return function(e,r,n){return t.loadSprints().then(function(){return t.scope.$broadcast("sprintform:create:success:callback",n)}),t.loadProjectStats(),t.confirm.notify("success"),t.analytics.trackEvent("sprint","create","create sprint on backlog",1)}}(this)),this.scope.$on("usform:new:success",function(t){return function(){return t.loadUserstories(!0),t.loadProjectStats(),t.rootscope.$broadcast("filters:update"),t.confirm.notify("success"),t.analytics.trackEvent("userstory","create","create userstory on backlog",1)}}(this)),this.scope.$on("sprintform:edit:success",function(t){return function(){return t.loadProjectStats()}}(this)),this.scope.$on("sprintform:remove:success",function(t){return function(e,r){return t.loadSprints(),t.loadProjectStats(),t.loadUserstories(!0),r.closed&&t.loadClosedSprints(),t.rootscope.$broadcast("filters:update")}}(this)),this.scope.$on("usform:edit:success",function(t){return function(e,r){var n;return n=_.findIndex(t.scope.userstories,function(t){return t.id===r.id}),t.scope.userstories[n]=r,t.rootscope.$broadcast("filters:update")}}(this)),this.scope.$on("sprint:us:move",this.moveUs),this.scope.$on("sprint:us:moved",function(t){return function(){return t.loadSprints(),t.loadProjectStats()}}(this)),this.scope.$on("backlog:load-closed-sprints",this.loadClosedSprints),this.scope.$on("backlog:unload-closed-sprints",this.unloadClosedSprints)},e.prototype.initializeSubscription=function(){var t,e;return t="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadAllPaginatedUserstories(),t.loadSprints()}}(this)),e="changes.project."+this.scope.projectId+".milestones",this.events.subscribe(this.scope,e,function(t){return function(e){return t.loadSprints()}}(this))},e.prototype.toggleShowTags=function(){return this.scope.$apply(function(t){return function(){return t.showTags=!t.showTags,t.rs.userstories.storeShowTags(t.scope.projectId,t.showTags)}}(this))},e.prototype.toggleActiveFilters=function(){return this.activeFilters=!this.activeFilters},e.prototype.toggleVelocityForecasting=function(){return this.displayVelocity=!this.displayVelocity,this.displayVelocity?this.scope.visibleUserStories=_.map(this.forecastedStories,function(t){return t.ref}):this.scope.visibleUserStories=_.map(this.scope.userstories,function(t){return t.ref}),f(this.scope,function(t){return function(){return t.scope.$broadcast("userstories:loaded")}}(this))},e.prototype.loadProjectStats=function(){return this.rs.projects.stats(this.scope.projectId).then(function(t){return function(e){var r;return t.scope.stats=e,r=e.total_points?e.total_points:e.defined_points,r?t.scope.stats.completedPercentage=Math.round(100*e.closed_points/r):t.scope.stats.completedPercentage=0,t.scope.showGraphPlaceholder=!(null!=e.total_points&&null!=e.total_milestones),t.calculateForecasting(),e}}(this))},e.prototype.setMilestonesOrder=function(t){var e,r,n,i,o;for(i=[],r=0,n=t.length;r0&&t>s.speed));r++)o.push(void 0);return o},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_backlog_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.closedMilestones=!!t.total_closed_milestones,this.scope.$emit("project:loaded",t),this.scope.points=_.sortBy(t.points,"order"),this.scope.pointsById=l(t.points,function(t){return t.id}),this.scope.usStatusById=l(t.us_statuses,function(t){return t.id}),this.scope.usStatusList=_.sortBy(t.us_statuses,"id"),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.loadBacklog().then(function(t){return function(){var e;return t.generateFilters(e="null")}}(this)).then(function(t){return function(){return t.scope.$emit("backlog:loaded")}}(this))},e.prototype.prepareBulkUpdateData=function(t,e){return null==e&&(e="backlog_order"),_.map(t,function(t){return{us_id:t.id,order:t[e]}})},e.prototype.moveUs=function(t,e,r,n){var i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w,A,O,R,M,U,N,D,L,x,F,B,H;if(E=e[0].milestone,R=e[0].project,E&&(F=this.scope.sprintsById[E]||this.scope.closedSprintsById[E]),n&&($=this.scope.sprintsById[n]||this.scope.closedSprintsById[n]),s=n!==E?n:E,P=null,C="",n!==E)if(null===n){for(l=u=0,h=e.length;u1&&(x=_.map(O,function(t){return{us_id:t.id,order:P[t.id]}}))):B=0,j=[],l=S=0,d=e.length;S1&&n!==E)a=j.concat(x),M=this.rs.userstories.bulkUpdateMilestone(R,n,a);else if(e.length>1)a=j.concat(x),M=this.rs.userstories.bulkUpdateBacklogOrder(R,a);else{for(L={},U=0,y=x.length;U=n&&t<=r})},e}(p(d.Controller,d.PageMixin,d.FiltersMixin,d.UsFiltersMixin)),h.controller("BacklogController",t),e=function(t,e,r,n){var i,o,s,a,c,u,l,p;return i=_.template('
    <%- text %>
    '),s=function(t,e,n,o){var s,a,c,u;return c=function(){var r,n,i,o,a,c,l,p,h,f;if(t.displayVelocity&&u(),null!=t.stats&&null!=t.stats.total_points&&0!==t.stats.total_points&&null==t.displayVelocity){if(u(),p=t.stats,h=p.total_points,r=p.assigned_points,!t.userstories)return;for(c=t.userstories,l=[],i=o=0,a=c.length;oh){n=e.find(".backlog-table-body .us-item-row")[i],s(n);break}l.push(void 0)}return l}},u=function(){return e.find(".doom-line").remove()},s=function(t){var e;return e=r.instant("BACKLOG.DOOMLINE"),$(t).before(i({text:e}))},a=function(){var t;return t=e.find(".backlog-table-body .us-item-row"),_.map(t,function(t){return angular.element(t)})},t.$on("userstories:loaded",c),t.$on("userstories:forecast",u),t.$watch("stats",c)},c=function(t,r,i,o){var s,a,c,u,l,h,f;return a=function(){var e;return e=r.find(".backlog-table-body input:checkbox:checked"),_.map(e,function(e){var r;return e=$(e).closest(".tg-scope"),r=e.scope(),r.us.milestone=t.sprints[0].id,r.us})},h=function(e,i){var s,a,c,u;return u=_(t.userstories),t.userstories=u.without.apply(u,e).value(),a=_.map(e,function(t,e){return t.total_points}),c=_.reduce(a,function(t,e){return t+e}),i.user_stories=_.union(i.user_stories,e),i.total_points+=c,s=_.map(e,function(t){return{us_id:t.id,order:t.sprint_order}}),n.userstories.bulkUpdateMilestone(t.project.id,t.sprints[0].id,s).then(function(t){return function(){return o.loadSprints(),o.loadProjectStats(),o.toggleVelocityForecasting(),o.calculateForecasting()}}(this)),r.find(".move-to-sprint").hide()},u=function(e){return h(e,t.currentSprint)},l=function(e){return h(e,t.sprints[0])},t.$on("sprintform:create:success:callback",function(t,e){return _.partial(u,e)()}),f=!1,c=null,s=function(e){var n,i;return c=e.closest(".us-item-row"),e.closest(".us-item-row").toggleClass("ui-multisortable-multiple"),n=r.find(".move-to-sprint"),i=r.find(".backlog-table-body input:checkbox:checked"),i.length>0&&t.sprints.length>0?n.show():n.hide()},$(window).on("keydown.shift-pressed keyup.shift-pressed",function(t){return f=!!t.shiftKey,!0}),r.on("change",".backlog-table-body input:checkbox",function(t){var e,r,n,i,o;return c&&f&&(r=[],e=$(t.currentTarget).closest(".us-item-row"),n=c.nextAll(),i=c.prevAll(),_.some(n,function(t){return t===e[0]})?r=c.nextUntil(e):_.some(i,function(t){return t===e[0]})&&(r=c.prevUntil(e)),_.map(r,function(t){var e;return e=$(t).find("input:checkbox"), +e.prop("checked",!0),s(e)})),o=angular.element(t.currentTarget),o.closest(".us-item-row").toggleClass("is-checked"),s(o)}),r.on("click","#move-to-latest-sprint",function(e){return function(e){var r;return r=a(),t.$apply(_.partial(l,r))}}(this)),r.on("click","#move-to-current-sprint",function(e){return function(e){var r;return r=a(),t.$apply(_.partial(u,r))}}(this)),r.on("click","#show-tags",function(t){return t.preventDefault(),o.toggleShowTags(),p(o)}),r.on("click",".forecasting-add-sprint",function(r){var n,i;return i=o.forecastedStories,t.currentSprint?(n=_.map(i,function(e,r){return e.milestone=t.currentSprint.id,e.order=r,e}),t.$apply(_.partial(u,n))):(n=_.map(i,function(t,e){return t.order=e,t}),e.$broadcast("sprintform:create",t.projectId,n))})},p=function(t){var e,n;return e=angular.element("#show-tags"),t.showTags?(e.addClass("active"),n=r.instant("BACKLOG.TAGS.HIDE"),e.text(n)):(e.removeClass("active"),n=r.instant("BACKLOG.TAGS.SHOW"),e.text(n))},u=function(t,e,r){var n;return n=e.find("sidebar.backlog-filter"),n.addClass("active"),r.activeFilters=!0},l=function(t,n,i){var o,s,a,c;return a=n.find("sidebar.backlog-filter"),a.one("transitionend",function(){return g(150,function(){return e.$broadcast("resize"),$(".burndown").css("visibility","visible")})}),c=angular.element("#show-filters-button"),$(".burndown").css("visibility","hidden"),a.toggleClass("active"),c.toggleClass("active"),o=r.instant("BACKLOG.FILTERS.HIDE"),s=r.instant("BACKLOG.FILTERS.SHOW"),m(c,[o,s]),i.toggleActiveFilters()},a=function(t,e,r,n){return t.filtersSearch={},e.on("click","#show-filters-button",function(r){return r.preventDefault(),t.$apply(function(){return l(t,e,n)})})},o=function(t,e,r,n){var i,o;return i=e.controller(),c(t,e,r,i),a(t,e,r,i),s(t,e,r,i),o=i.location.search(),(o.status||o.tags||o.q||o.assigned_to||o.owner)&&u(t,e,i),t.$on("showTags",function(){return p(i)}),t.$on("$destroy",function(){return e.off(),$(window).off(".shift-pressed")})},{link:o}},h.directive("tgBacklog",["$tgRepo","$rootScope","$translate","$tgResources",e]),s=function(t,e,r,n){var i,o;return o=e.get("backlog/us-role-points-popover.html",!0),i=function(e,i,s){return c(e,"project",function(t){var n,s;return s=_.filter(t.roles,"computable"),n=_.size(s),n>1?i.append(r(o({roles:s}))(e)):(i.find(".icon-arrow-down").remove(),i.find(".header-points").addClass("not-clickable"))}),e.$on("uspoints:select",function(t,e,r){return i.find(".popover").popover().close(),i.find(".header-points").html(r+"/Total")}),e.$on("uspoints:clear-selection",function(t,e){var r;return i.find(".popover").popover().close(),r=n.instant("COMMON.FIELDS.POINTS"),i.find(".header-points").text(r)}),i.on("click",function(t){var e;return e=angular.element(t.target),(e.is("span")||e.is("div"))&&t.stopPropagation(),i.find(".popover").popover().open()}),i.on("click",".clear-selection",function(e){return e.preventDefault(),e.stopPropagation(),t.$broadcast("uspoints:clear-selection")}),i.on("click",".role",function(e){var r,n;return e.preventDefault(),e.stopPropagation(),n=angular.element(e.currentTarget),r=n.scope(),t.$broadcast("uspoints:select",n.data("role-id"),n.text())}),e.$on("$destroy",function(){return i.off()})},{link:i}},h.directive("tgUsRolePointsSelector",["$rootScope","$tgTemplate","$compile","$translate",s]),o=function(t,e,r){var n,i;return i=r.get("common/estimation/us-points-roles-popover.html",!0),n=function(e,n,o){var s,a,c,u,l,p,h;return s=n.controller(),h=null,p=null,u=null,c=null,e.$on("uspoints:select",function(t,r,n){var i;return i=e.$eval(o.tgBacklogUsPoints),p=r,c.render()}),e.$on("uspoints:clear-selection",function(t){var r;return r=e.$eval(o.tgBacklogUsPoints),p=null,c.render()}),e.$watch(o.tgBacklogUsPoints,function(i){var o;if(i)return c=t.create(n,i,e.project),o=c.calculateRoles(),0===o.length?(n.find(".icon-arrow-bottom").remove(),n.find("a.us-points").addClass("not-clickable")):1===o.length&&(p=_.keys(i.points)[0]),c.isEditable&&a(),c.onSelectedPointForRole=function(t,e,r){return i.points=r,c.render(),this.save(t,e).then(function(){return s.loadProjectStats()})},c.render=function(){var t,e,n,i,s,a,c,u,l;return l=this.calculateTotalPoints(),null==p||1===o.length?(c=l,u=l):(i=this.us.points[p],s=this.pointsById[i],c=s.name+" / "+l+"",u=s.name+" / "+l),t={totalPoints:l,roles:this.calculateRoles(),editable:this.isEditable,text:c,title:u},n="common/estimation/us-estimation-total.html",a=r.get(n,!0),e=a(t),this.$el.html(e)},c.render()}),l=function(){var t,e;return e=c.calculateRoles(),t=i({roles:e}),n.append(t),n.find(".pop-role").popover().open(function(){return $(this).remove()})},a=function(){return n.on("click","a.us-points",function(t){var r;return t.preventDefault(),t.stopPropagation(),r=e.$eval(o.tgBacklogUsPoints),h=p,null!=p?c.renderPointsSelector(p):l()}),n.on("click",".role",function(t){var r,i,s;return t.preventDefault(),t.stopPropagation(),i=angular.element(t.currentTarget),s=e.$eval(o.tgBacklogUsPoints),h=i.data("role-id"),r=n.find(".pop-role"),r.find("a").removeClass("active"),r.find("a[data-role-id='"+h+"']").addClass("active"),c.renderPointsSelector(h)})},e.$on("$destroy",function(){return n.off()})},{link:n}},h.directive("tgBacklogUsPoints",["$tgEstimationsService","$tgRepo","$tgTemplate",o]),i=function(t){var e,r,n;return e=function(){return $(".js-burndown-graph").removeClass("shown"),$(".js-toggle-burndown-visibility-button").removeClass("active"),$(".js-burndown-graph").removeClass("open")},n=function(t){return $(".js-toggle-burndown-visibility-button").addClass("active"),t?$(".js-burndown-graph").addClass("shown"):$(".js-burndown-graph").addClass("open")},r=function(r,i,o){var s,a,c;return s=!0,a=u(["is-burndown-grpahs-collapsed"]),r.isBurndownGraphCollapsed=t.get(a)||!1,c=function(){return r.isBurndownGraphCollapsed?e(s):n(s),s=!1},r.$watch("showGraphPlaceholder",function(){if(null!=r.showGraphPlaceholder)return r.isBurndownGraphCollapsed=r.isBurndownGraphCollapsed||r.showGraphPlaceholder,c()}),i.on("click",".js-toggle-burndown-visibility-button",function(){return r.isBurndownGraphCollapsed=!r.isBurndownGraphCollapsed,t.set(a,r.isBurndownGraphCollapsed),c()}),r.$on("$destroy",function(){return i.off()})},{link:r}},h.directive("tgToggleBurndownVisibility",["$tgStorage",i]),r=function(t){var e,r;return r=function(e,r){var n,i,o,s,a,c,u,l,p,h,f;return h=e.width(),e.height(h/6),a=function(){l=[];for(var t=0,e=r.milestones.length-1;0<=e?t<=e:t>=e;0<=e?t++:t--)l.push(t);return l}.apply(this),o=[],f=_.map(r.milestones,function(t){return 0}),o.push({data:_.zip(a,f),lines:{fillColor:"rgba(0,0,0,0)"},points:{show:!1}}),c=_.map(r.milestones,function(t){return t.optimal}),o.push({data:_.zip(a,c),lines:{fillColor:"rgba(120,120,120,0.2)"}}),s=_.filter(_.map(r.milestones,function(t){return t.evolution}),function(t){return null!=t}),o.push({data:_.zip(a,s),lines:{fillColor:"rgba(102,153,51,0.3)"}}),n=_.map(r.milestones,function(t){return-t["team-increment"]-t["client-increment"]}),o.push({data:_.zip(a,n),lines:{fillColor:"rgba(255,51,51,0.3)"}}),p=_.map(r.milestones,function(t){return-t["team-increment"]}),o.push({data:_.zip(a,p),lines:{fillColor:"rgba(153,51,51,0.3)"}}),i=["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)"],u={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{ticks:r.milestones.length,axisLabel:t.instant("BACKLOG.CHART.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5,tickFormatter:function(t,e){return""}},yaxis:{axisLabel:t.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:i,tooltip:!0,tooltipOpts:{content:function(e,n,i,o){var s;return 1===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.OPTIMAL",s)):2===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.REAL",s)):3===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.INCREMENT_CLIENT",s)):(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.INCREMENT_TEAM",s))}}},e.empty(),e.plot(o,u).data("plot")},e=function(t,e,n){var i;return i=angular.element(e),t.$watch("stats",function(e){if(null!=t.stats)return r(i,t.stats),t.$on("resize",function(){return r(i,t.stats)})}),t.$on("$destroy",function(){return e.off()})},{link:e}},h.directive("tgBurndownBacklogGraph",["$translate",r]),n=function(t,e){var r,n,i,o;return o=t.get("backlog/progress-bar.html",!0),i=function(t,r,n,i){var s;return s=o({projectPointsPercentaje:n,closedPointsPercentaje:i}),s=e(s)(t),r.html(s)},r=function(t){var e;return e=_.max([0,t]),e=_.min([100,e]),Math.round(e)},n=function(t,e,n){var o;return o=angular.element(e),t.$watch(n.tgBacklogProgressBar,function(n){var o,s,a,c,u;if(null!=n)return u=n.total_points?n.total_points:n.defined_points,a=n.defined_points,o=n.closed_points,a>u?(c=100*u/a,s=100*o/a):(c=100,s=100*o/u),c=r(c-3),s=r(s-3),i(t,e,c,s)}),t.$on("$destroy",function(){return e.off()})},{link:n}},h.directive("tgBacklogProgressBar",["$tgTemplate","$compile",n])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,n=angular.module("taigaBacklog"),r=function(t){return $(t).scope().$destroy(),$(t).off(),$(t).remove()},t=function(){var t;return t=function(t,n,i){return e(t,"project",function(e){var i,o,s;if(e.my_permissions.indexOf("modify_us")>-1)return o=!1,i=dragula([n[0],$(".js-empty-backlog")[0]],{copySortSource:!1,copy:!1,isContainer:function(t){return t.classList.contains("sprint-table")},moves:function(t){return!!$(t).hasClass("row")}}),i.on("drag",function(t,e){var r,n;return n=$(t).parent(),o=n.hasClass("backlog-table-body"),$(document.body).addClass("drag-active"),r=$(t).find("input[type='checkbox']").is(":checked"),window.dragMultiple.start(t,e)}),i.on("cloned",function(t){return $(t).addClass("multiple-drag-mirror")}),i.on("dragend",function(e){var n,i,s,a,c,u,l,p;return c=$(e).parent(),$(".doom-line").remove(),c=$(e).parent(),a=c.hasClass("backlog-table-body")||c.hasClass("js-empty-backlog"),u=o||a?o===a:$(e).scope().sprint.id===c.scope().sprint.id,n=window.dragMultiple.stop(),$(document.body).removeClass("drag-active"),l=null,i=n.length?n[0]:e,a?s=$(i).index(".backlog-table-body .row"):(s=$(i).index(),l=c.scope().sprint.id),u?p=n.length?_.map(n,function(t){return t=$(t).scope().us}):[$(e).scope().us]:(p=n.length?_.map(n,function(t){return t=$(t).scope().us}):[$(e).scope().us],n.length?_.each(n,function(t){return r(t)}):r(e)),t.$emit("sprint:us:move",p,s,l)}),s=autoScroll([window],{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&i.dragging}}),t.$on("$destroy",function(){return n.off(),i.destroy()})})},{link:t}},n.directive("tgBacklogSortable",t)}.call(this),function(){var t,e,r,n,i;i=this.taiga,n=angular.module("taigaBacklog"),t=function(t,e){var r,n,i,o;return i=50,n={duration:500,easing:"linear"},o=function(t){return function(t){var e,r;return r=t.find(".sprint-table"),e=t.find(".compact-sprint"),e.toggleClass("active"),r.toggleClass("open")}}(this),r=function(t,r,i){return t.$watch(i.tgBacklogSprint,function(e){return e=t.$eval(i.tgBacklogSprint),e.closed?r.addClass("sprint-closed"):o(r)}),r.on("click",".sprint-name > .compact-sprint",function(t){return t.preventDefault(),o(r),r.find(".sprint-table").slideToggle(n)}),r.on("click",".edit-sprint",function(r){var n;return r.preventDefault(),n=t.$eval(i.tgBacklogSprint),e.$broadcast("sprintform:edit",n)}),t.$on("$destroy",function(){return r.off()})},{link:r}},n.directive("tgBacklogSprint",["$tgRepo","$rootScope",t]),e=function(t,e,r,n){var i,o;return o=e.get("backlog/sprint-header.html"),i=function(e,i,s,a){var c,u,l,p;return l=n.instant("BACKLOG.SPRINTS.DATE"),c=function(){return e.project.my_permissions.indexOf("modify_milestone")!==-1},u=function(){return e.project.my_permissions.indexOf("view_milestones")!==-1},p=function(n){var s,a,p,h,f,d,g;return d=t.resolve("project-taskboard",{project:e.project.slug,sprint:n.slug}),f=moment(n.estimated_start).format(l),h=moment(n.estimated_finish).format(l),p=f+"-"+h,a={name:n.name,taskboardUrl:d,estimatedDateRange:p,closedPoints:n.closed_points||0,totalPoints:n.total_points||0,isVisible:u(),isEditable:c()},g=e.$new(),_.assign(g,a),s=r(o)(g),i.html(s)},e.$watch("sprint",function(t){return p(t)}),e.$on("$destroy",function(){return i.off()})},{link:i,restrict:"EA"}},n.directive("tgBacklogSprintHeader",["$tgNavUrls","$tgTemplate","$compile","$translate",e]),r=function(t,e,r){var n,i;return n=!0,i=function(i,o,s){var a,c;return c=$("
    "),o.after(c),a=null,o.on("click",function(r){return r.preventDefault(),n=!n,a=e().target(c).start(),n?t.$broadcast("backlog:unload-closed-sprints"):t.$broadcast("backlog:load-closed-sprints")}),i.$on("$destroy",function(){return o.off()}),i.$on("closed-sprints:reloaded",function(t){return function(t,e){var n,i;return a.finish(),n=e.length>0?"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS":"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS",i=r.instant(n),o.find(".text").text(i)}}(this))},{link:i}},n.directive("tgBacklogToggleClosedSprintsVisualization",["$rootScope","$tgLoading","$translate",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c;s=this.taiga,n=this.taiga.mixOf,c=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,a=this.taiga.timeout,i=angular.module("taigaTaskboard"),t=function(t){var e,r;return r=function(e,r){var n,i,o,s;return s=e.width(),e.height(240),i=_.map(r,function(t){return moment(new Date(t.day).getTime())}),n=[],n.unshift({data:_.zip(i,_.map(r,function(t){return t.optimal_points})),lines:{fillColor:"rgba(120,120,120,0.2)"}}),n.unshift({data:_.zip(i,_.map(r,function(t){return t.open_points})),lines:{fillColor:"rgba(102,153,51,0.3)"}}),o={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{tickSize:[1,"day"],min:i[0],max:_.last(i),mode:"time",daysNames:i,axisLabel:t.instant("TASKBOARD.CHARTS.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},yaxis:{min:0,axisLabel:t.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(e,r,n,i){var o,s;return o=moment(r).format(t.instant("TASKBOARD.CHARTS.DATE")),s=Math.round(n),1===i.seriesIndex?t.instant("TASKBOARD.CHARTS.OPTIMAL",{formattedDate:o,roundedValue:s}):t.instant("TASKBOARD.CHARTS.REAL",{formattedDate:o,roundedValue:s})}}},e.empty(),e.plot(n,o).data("plot")},e=function(t,e,n){var i;return i=angular.element(e),t.$on("resize",function(){if(t.stats)return r(i,t.stats.days)}),t.$on("taskboard:graph:toggle-visibility",function(){return e.parent().toggleClass("open"),a(100,function(){if(t.stats)return r(i,t.stats.days)})}),t.$watch("stats",function(e){if(null!=t.stats)return r(i,t.stats.days)}),t.$on("$destroy",function(){return e.off()})},{link:e}},i.directive("tgSprintGraph",["$translate",t])}.call(this),function(){var t,e,r,n,i,o,s,a=[].indexOf||function(t){for(var e=0,r=this.length;e1&&r<=1&&(this.zoomLoading=!0,this.loadTasks().then(function(t){return function(){return t.zoomLoading=!1,t.taskboardTasksService.resetFolds()}}(this))),"0"===this.zoomLevel?this.rootscope.$broadcast("sprint:zoom0"):void 0)},e.prototype.changeQ=function(t){return this.replaceFilter("q",t),this.loadTasks(),this.generateFilters()},e.prototype.removeFilter=function(t){return this.unselectFilter(t.dataType,t.id),this.loadTasks(),this.generateFilters()},e.prototype.addFilter=function(t){return this.selectFilter(t.category.dataType,t.filter.id),this.loadTasks(),this.generateFilters()},e.prototype.selectCustomFilter=function(t){return this.replaceAllFilters(t.filter),this.loadTasks(),this.generateFilters()},e.prototype.removeCustomFilter=function(t){return this.filterRemoteStorageService.getFilters(this.scope.projectId,"tasks-custom-filters").then(function(e){return function(r){return delete r[t.id],e.filterRemoteStorageService.storeFilters(e.scope.projectId,r,"tasks-custom-filters").then(e.generateFilters)}}(this))},e.prototype.isFilterDataTypeSelected=function(t){var e,r,n,i;for(i=this.selectedFilters,r=0,n=i.length;r0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),a=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),s=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),e.selectedFilters=[],t.status&&(c=e.formatSelectedFilters("status",u,t.status),e.selectedFilters=e.selectedFilters.concat(c)),t.tags&&(c=e.formatSelectedFilters("tags",l,t.tags),e.selectedFilters=e.selectedFilters.concat(c)),t.assigned_to&&(c=e.formatSelectedFilters("assigned_to",n,t.assigned_to),e.selectedFilters=e.selectedFilters.concat(c)),t.owner&&(c=e.formatSelectedFilters("owner",s,t.owner),e.selectedFilters=e.selectedFilters.concat(c)),t.role&&(c=e.formatSelectedFilters("role",a,t.role),e.selectedFilters=e.selectedFilters.concat(c)),e.filterQ=t.q,e.filters=[{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:u},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:l,hideEmpty:!0,totalTaggedElements:p.length},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:a},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:s}],e.customFilters=[],_.forOwn(i,function(t,r){return e.customFilters.push({id:r,name:r,filter:t})})}}(this))},e.prototype._setMeta=function(){var t,e,r;return e=this.translate.instant("BACKLOG.SPRINTS.DATE"),r=this.translate.instant("TASKBOARD.PAGE_TITLE",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name}),t=this.translate.instant("TASKBOARD.PAGE_DESCRIPTION",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name,startDate:moment(this.scope.sprint.estimated_start).format(e),endDate:moment(this.scope.sprint.estimated_finish).format(e),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(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("taskform:bulk:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.add(r)}),t.analytics.trackEvent("task","create","bulk create task on taskboard",1)}}(this)),this.scope.$on("taskform:new:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.add(r)}),t.analytics.trackEvent("task","create","create task on taskboard",1)}}(this)),this.scope.$on("taskform:edit:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.replaceModel(r)})}}(this)),this.scope.$on("taskboard:task:move",this.taskMove),this.scope.$on("assigned-to:added",this.onAssignedToChanged)},e.prototype.onAssignedToChanged=function(t,e,r){return r.assigned_to=e,this.taskboardTasksService.replaceModel(r),this.repo.save(r).then(function(t){return function(){if(t.generateFilters(),t.isFilterDataTypeSelected("assigned_to")||t.isFilterDataTypeSelected("role"))return t.loadTasks()}}(this))},e.prototype.initializeSubscription=function(){var t,e;return t="changes.project."+this.scope.projectId+".tasks",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadTaskboard()}}(this)),e="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,e,function(t){return function(e){return t.refreshTagsColors(),t.loadSprintStats(),t.loadSprint()}}(this))},e.prototype.loadProject=function(){return this.rs.projects.get(this.scope.projectId).then(function(t){return function(e){return e.is_backlog_activated||t.errorHandlingService.permissionDenied(),t.scope.project=e,t.scope.pointsList=_.sortBy(e.points,"order"),t.scope.pointsById=o(e.points,function(t){return t.id}),t.scope.roleById=o(e.roles,function(t){return t.id}),t.scope.taskStatusList=_.sortBy(e.task_statuses,"order"),t.scope.usStatusList=_.sortBy(e.us_statuses,"order"),t.scope.usStatusById=o(e.us_statuses,function(t){return t.id}),t.scope.$emit("project:loaded",e),t.fillUsersAndRoles(e.members,e.roles),e}}(this))},e.prototype.loadSprintStats=function(){return this.rs.sprints.stats(this.scope.projectId,this.scope.sprintId).then(function(t){return function(e){var r,n,i,o;return o=_.reduce(_.values(e.total_points),function(t,e){return t+e},0),r=_.reduce(_.values(e.completed_points),function(t,e){return t+e},0),n=o-r,i=e.total_tasks-e.completed_tasks,t.scope.stats=e,t.scope.stats.totalPointsSum=o,t.scope.stats.completedPointsSum=r,t.scope.stats.remainingPointsSum=n,t.scope.stats.remainingTasks=i,e.totalPointsSum?t.scope.stats.completedPercentage=Math.round(100*e.completedPointsSum/e.totalPointsSum):t.scope.stats.completedPercentage=0,t.scope.stats.openTasks=e.total_tasks-e.completed_tasks,e}}(this))},e.prototype.refreshTagsColors=function(){return this.rs.projects.tagsColors(this.scope.projectId).then(function(t){return function(e){return t.scope.project.tags_colors=e._attrs}}(this))},e.prototype.loadSprint=function(){return this.rs.sprints.get(this.scope.projectId,this.scope.sprintId).then(function(t){return function(e){return t.scope.sprint=e,t.scope.userstories=_.sortBy(e.user_stories,"sprint_order"),t.taskboardTasksService.setUserstories(t.scope.userstories),e}}(this))},e.prototype.loadTasks=function(){var t;return t={},this.zoomLevel>1&&(t.include_attachments=1),t=_.merge(t,this.location.search()),this.rs.tasks.list(this.scope.projectId,this.scope.sprintId,null,t).then(function(t){return function(e){return t.taskboardTasksService.init(t.scope.project,t.scope.usersById),t.taskboardTasksService.set(e)}}(this))},e.prototype.loadTaskboard=function(){return this.q.all([this.refreshTagsColors(),this.loadSprintStats(),this.loadSprint().then(function(t){return function(){return t.loadTasks()}}(this))])},e.prototype.loadInitialData=function(){var t,e;return t={pslug:this.params.pslug,sslug:this.params.sslug},e=this.repo.resolve(t).then(function(t){return function(e){return t.scope.projectId=e.project,t.scope.sprintId=e.milestone,t.initializeSubscription(),e}}(this)),e.then(function(t){return function(){return t.loadProject()}}(this)).then(function(t){return function(){return t.generateFilters(),t.loadTaskboard().then(function(){return t.setRolePoints()})}}(this))},e.prototype.showPlaceHolder=function(t,e){return!(this.taskboardTasksService.tasksRaw.length||this.scope.taskStatusList[0].id!==t||this.scope.userstories.length&&this.scope.userstories[0].id!==e)},e.prototype.editTask=function(t){var e;return e=this.taskboardTasksService.getTask(t),e=e.set("loading",!0),this.taskboardTasksService.replace(e),this.rs.tasks.getByRef(e.getIn(["model","project"]),e.getIn(["model","ref"])).then(function(t){return function(r){return t.rs2.attachments.list("task",e.get("id"),e.getIn(["model","project"])).then(function(n){return t.rootscope.$broadcast("taskform:edit",r,n.toJS()),e=e.set("loading",!1),t.taskboardTasksService.replace(e)})}}(this))},e.prototype.taskMove=function(t,e,r,n,i,o){var s,a,c,u;return e=this.taskboardTasksService.getTaskModel(e.get("id")),s=this.taskboardTasksService.move(e.id,n,i,o),c={status__is_archived:!1,include_attachments:!0},a={headers:{"set-orders":JSON.stringify(s.set_orders)}},u=this.repo.save(e,!0,c,a,!0).then(function(t){return function(e){var r;if(r=e[1],r&&r["taiga-info-order-updated"]&&(o=JSON.parse(r["taiga-info-order-updated"]),t.taskboardTasksService.assignOrders(o)), +t.loadSprintStats(),t.generateFilters(),t.isFilterDataTypeSelected("status"))return t.loadTasks()}}(this))},e.prototype.addNewTask=function(t,e){switch(t){case"standard":return this.rootscope.$broadcast("taskform:new",this.scope.sprintId,null!=e?e.id:void 0);case"bulk":return this.rootscope.$broadcast("taskform:bulk",this.scope.sprintId,null!=e?e.id:void 0)}},e.prototype.toggleFold=function(t){return this.taskboardTasksService.toggleFold(t)},e.prototype.changeTaskAssignedTo=function(t){var e;return e=this.taskboardTasksService.getTaskModel(t),this.rootscope.$broadcast("assigned-to:add",e)},e.prototype.setRolePoints=function(){var t,e,r,n;return t=_.filter(this.scope.project.roles,"computable"),r=function(e){return function(e){return e=parseInt(e,10),_.find(t,function(t){return t.id===e})}}(this),e=function(t){return function(e){var r;return r=parseInt(e,10),_.find(t.scope.project.points,function(t){return t.id===e})}}(this),n=_.reduce(this.scope.userstories,function(t){return function(t,n,i){return _.forOwn(n.points,function(n,i){var o,s;return s=r(i),o=e(n),t[s.id]||(t[s.id]=s,t[s.id].points=0),t[s.id].points+=o.value}),t}}(this),{}),this.scope.pointsByRole=Object.keys(n).map(function(t){return n[t]})},e}(s(u.Controller,u.PageMixin,u.FiltersMixin)),a.controller("TaskboardController",t),e=function(t){var e;return e=function(e,r,n){var i,o;return i=r.controller(),r.on("click",".toggle-analytics-visibility",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),r.toggleClass("active"),t.$broadcast("taskboard:graph:toggle-visibility")}),o=r.find(".taskboard-table-body"),o.on("scroll",function(t){var e,n;return n=angular.element(t.currentTarget),e=r.find(".taskboard-table-header .taskboard-table-inner"),e.css("left",-1*n.scrollLeft())}),e.$on("$destroy",function(){return r.off()})},{link:e}},a.directive("tgTaskboard",["$rootScope",e]),r=function(t){var e,r,n;return e=40,n=300,r=function(r,i,o){var s,a,c,u,l;return r.$on("sprint:zoom0",function(t){return function(){return c()}}(this)),r.$on("sprint:task:moved",function(t){return function(){return c()}}(this)),r.$watch("usTasks",function(){if(r.project)return r.statusesFolded=t.tasks.getStatusColumnModes(r.project.id),r.usFolded=t.tasks.getUsRowModes(r.project.id,r.sprintId),c()}),r.foldStatus=function(e){return r.statusesFolded[e.id]=!r.statusesFolded[e.id],t.tasks.storeStatusColumnModes(r.projectId,r.statusesFolded),c()},r.foldUs=function(e){return e?r.usFolded[e.id]=!r.usFolded[e.id]:r.usFolded[null]=!r.usFolded[null],t.tasks.storeUsRowModes(r.projectId,r.sprintId,r.usFolded),c()},s=function(t){return function(t,n){var i,o,s;return i=t?r.usTasks.getIn([t.toString(),n.toString()]).size:r.usTasks.getIn(["null",n.toString()]).size,r.statusesFolded[n]?(i&&r.usFolded[t]?(o=Math.round(Math.sqrt(i)),s=e*o):s=e,s):0}}(this),l=function(t){return function(t,e){var o;return o=i.find(".squish-status-"+t),e?o.css("max-width",e):"0"===r.ctrl.zoomLevel?o.css("max-width",148):o.css("max-width",n)}}(this),u=function(t){return function(){var t,e,r;return t=[],e=i.find(".task-colum-name"),t=_.map(e,function(t){return $(t).outerWidth(!0)}),r=_.reduce(t,function(t,e){return t+e}),i.find(".taskboard-table-inner").css("width",r)}}(this),a=function(t){return function(t){var e;return e=s(null,t),_.forEach(r.userstories,function(r){var n;if(n=s(r.id,t),n>e)return e=n}),l(t,e)}}(this),c=function(t){return function(){_.forEach(r.taskStatusList,function(t){return a(t.id)}),u()}}(this)},{link:r}},a.directive("tgTaskboardSquishColumn",["$tgResources",r])}.call(this),function(){var t,e,r,n,i,o,s,a;s=this.taiga,n=this.taiga.mixOf,a=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,i=angular.module("taigaBacklog"),t=function(t,e,r,n){var i;return i=function(t,e,i){var o;return o=t.$watch("usTasks",function(i){var s,a,c,u,l,p,h,f,d;if(i&&i.size&&(o(),t.project.my_permissions.indexOf("modify_task")>-1))return h=null,p=null,l=null,d=e,u=function(){var t;return t=n.instant("BACKLOG.SORTABLE_FILTER_ERROR"),$tgConfirm.notify("error",t)},a=function(t){return t.scope().$destroy(),t.off(),t.remove()},s=_.map(e.find(".task-column"),function(t){return t}),c=dragula(s,{copySortSource:!1,copy:!1,accepts:function(t,e){return!$(e).hasClass("taskboard-userstory-box")},moves:function(t){return $(t).is("tg-card")}}),c.on("drag",function(t){if(h=$(t).parent().scope(),e.hasClass("active-filters"))return u(),setTimeout(function(){return c.cancel(!0)},0),!1}),c.on("dragend",function(e){var n,i,o,s,c,u,f;return f=$(e).parent(),l=$(e),i=l.scope().task,n=l.index(),p=f.scope(),u=h.us?h.us.id:null,c=h.st.id,s=p.us?p.us.id:null,o=p.st.id,o===c&&s===u||a(l),t.$apply(function(){return r.$broadcast("taskboard:task:move",i,i.getIn(["model","status"]),s,o,n)})}),f=autoScroll([$(".taskboard-table-body")[0]],{margin:100,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&c.dragging}}),t.$on("$destroy",function(){return e.off(),c.destroy()})})},{link:i}},i.directive("tgTaskboardSortable",["$tgRepo","$tgResources","$rootScope","$translate",t])}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga.groupBy,t=function(t){function e(){this.reset()}return r(e,t),e.$inject=[],e.prototype.reset=function(){return this.tasksRaw=[],this.foldStatusChanged={},this.usTasks=Immutable.Map()},e.prototype.init=function(t,e){return this.project=t,this.usersById=e},e.prototype.resetFolds=function(){return this.foldStatusChanged={},this.refresh()},e.prototype.toggleFold=function(t){return this.foldStatusChanged[t]=!this.foldStatusChanged[t],this.refresh()},e.prototype.add=function(t){return this.tasksRaw=this.tasksRaw.concat(t),this.refresh()},e.prototype.set=function(t){return this.tasksRaw=t,this.refreshRawOrder(),this.refresh()},e.prototype.setUserstories=function(t){return this.userstories=t},e.prototype.refreshRawOrder=function(){var t,e,r,n,i;for(this.order={},r=this.tasksRaw,n=[],t=0,e=r.length;t1)for(s=0,l=f.length;s1)for(o=0,p=m.length;o1&&(b=_.map(m,function(t){return function(e){return{us_id:e.id,order:t.order[e.id]}}}(this)))}}else S=0;for(l=u=0,f=t.length;u1&&r<=1?(this.zoomLoading=!0,this.loadUserstories().then(function(t){return function(){return t.zoomLoading=!1,t.kanbanUserstoriesService.resetFolds()}}(this))):void 0)},e.prototype.filtersReloadContent=function(){return this.loadUserstories().then(function(t){return function(){var e,r,n,i,o;if(n=_.difference(t.kanbanUserstoriesService.archivedStatus,t.kanbanUserstoriesService.statusHide),n.length){for(i=[],e=0,r=n.length;e1&&(t.include_attachments=1,t.include_tasks=1),t=_.merge(t,this.location.search()),e=this.rs.userstories.listAll(this.scope.projectId,t).then(function(t){return function(e){return t.kanbanUserstoriesService.init(t.scope.project,t.scope.usersById),t.kanbanUserstoriesService.set(e),p(t.scope,function(){return t.scope.$broadcast("userstories:loaded",e)}),e}}(this)),e.then(function(t){return function(){return t.scope.$broadcast("redraw:wip")}}(this)),e},e.prototype.loadUserStoriesForStatus=function(t,e){var r,n;if(r=this.location.search().status,!r||(r=r.split(",").map(function(t){return parseInt(t,10)}),r.indexOf(e)!==-1))return n={status:e,include_attachments:!0,include_tasks:!0},n=_.merge(n,this.location.search()),this.rs.userstories.listAll(this.scope.projectId,n).then(function(t){return function(r){return t.scope.$broadcast("kanban:shown-userstories-for-status",e,r),r}}(this))},e.prototype.hideUserStoriesForStatus=function(t,e){return this.scope.$broadcast("kanban:hidden-userstories-for-status",e)},e.prototype.loadKanban=function(){return this.q.all([this.refreshTagsColors(),this.loadUserstories()])},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_kanban_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.projectId=t.id,this.scope.points=_.sortBy(t.points,"order"),this.scope.pointsById=c(t.points,function(t){return t.id}),this.scope.usStatusById=c(t.us_statuses,function(t){return t.id}),this.scope.usStatusList=_.sortBy(t.us_statuses,"order"),this.scope.$emit("project:loaded",t),t},e.prototype.initializeSubscription=function(){var t;return t="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadUserstories()}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.loadKanban(),this.generateFilters()},e.prototype.prepareBulkUpdateData=function(t,e){return null==e&&(e="kanban_order"),_.map(t,function(t){return{us_id:t.id,order:t[e]}})},e.prototype.moveUs=function(t,e,r,n){var i,o;return this.cleanSelectedUss(),e=_.map(e,function(t){return function(e){return t.kanbanUserstoriesService.getUsModel(e.id)}}(this)),i=this.kanbanUserstoriesService.move(e,r,n),o=this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId,r,i.bulkOrders),o.then(function(t){return function(){var r,n,s;return r={headers:{"set-orders":JSON.stringify(i.setOrders)}},n={include_attachments:!0,include_tasks:!0},s=_.map(e,function(e){return t.repo.save(e,!0,n,r,!0)}),o=t.q.all(s),o.then(function(e){var r,n;return r=e[1],r&&r["taiga-info-order-updated"]&&(n=JSON.parse(r["taiga-info-order-updated"]),t.kanbanUserstoriesService.assignOrders(n)),t.scope.$broadcast("redraw:wip"),t.generateFilters(),t.isFilterDataTypeSelected("status")&&t.filtersReloadContent(),o})}}(this))},e}(u(h.Controller,h.PageMixin,h.FiltersMixin,h.UsFiltersMixin)),l.controller("KanbanController",r),n=function(t,e){var r;return r=function(t,e,r){var n;return n=e.find(".kanban-table-body"),n.on("scroll",function(t){var r,n;return n=angular.element(t.currentTarget),r=e.find(".kanban-table-header .kanban-table-inner"),r.css("left",-1*n.scrollLeft())}),t.$on("$destroy",function(){return e.off()})},{link:r}},l.directive("tgKanban",["$tgRepo","$rootScope",n]),t=function(t,e,r){var n,i,o;return o=e.instant("KANBAN.ACTION_SHOW_ARCHIVED"),n=e.instant("KANBAN.ACTION_HIDE_ARCHIVED"),i=function(e,i,s){var a,c;return c=e.$eval(s.tgKanbanArchivedStatusHeader),a=!0,r.addArchivedStatus(c.id),r.hideStatus(c.id),e["class"]="icon-watch",e.title=o,i.on("click",function(i){return a=!a,e.$apply(function(){return a?(e["class"]="icon-watch",e.title=o,t.$broadcast("kanban:hide-userstories-for-status",c.id),r.hideStatus(c.id)):(e["class"]="icon-unwatch",e.title=n,t.$broadcast("kanban:show-userstories-for-status",c.id),r.showStatus(c.id))})}),e.$on("$destroy",function(){return i.off()})},{link:i}},l.directive("tgKanbanArchivedStatusHeader",["$rootScope","$translate","tgKanbanUserstories",t]),e=function(t,e){var r,n;return n=[],r=function(r,n,i){var o,s,a;return o=t.instant("KANBAN.HIDDEN_USER_STORIES"),s=r.$eval(i.tgKanbanArchivedStatusIntro),n.text(o),a=function(t){return t?n.text(""):n.text(o)},r.$on("kanban:us:move",function(t,r,n,i,o){var s;return s=!!e.getStatus(i).length,a(s)}),r.$on("kanban:shown-userstories-for-status",function(t,r,n){var i;if(r===s.id)return e.deleteStatus(r),e.add(n),i=!!e.getStatus(r).length,a(i)}),r.$on("kanban:hidden-userstories-for-status",function(t,e){if(e===s.id)return a(!1)}),r.$on("$destroy",function(){return n.off()})},{link:r}},l.directive("tgKanbanArchivedStatusIntro",["$translate","tgKanbanUserstories",e]),i=function(t,e){var r;return r=function(r,n,i){var o,s;return r.foldStatus=function(e){r.folds[e.id]=!r.folds[e.id],t.kanban.storeStatusColumnModes(r.projectId,r.folds),s()},s=function(){var t,e;return t=_.map(r.usStatusList,function(t){return r.folds[t.id]?40:310}),e=_.reduce(t,function(t,e){return t+e}),n.find(".kanban-table-inner").css("width",e)},o=r.$watch("usByStatus",function(n){if(n.size)return r.folds=t.kanban.getStatusColumnModes(e.project.get("id")),s(),o()})},{link:r}},l.directive("tgKanbanSquishColumn",["$tgResources","tgProjectService",i]),o=function(t){var e;return e=function(e,r,n){var i,o;return o=e.$eval(n.tgKanbanWipLimit),i=function(e){return function(){return r.find(".kanban-wip-limit").remove(),t(function(){var t;if(t=r.find("tg-card")[o.wip_limit])return angular.element(t).before("
    ")})}}(this),o&&!o.is_archived&&(e.$on("redraw:wip",i),e.$on("kanban:us:move",i),e.$on("usform:new:success",i),e.$on("usform:bulk:success",i)),e.$on("$destroy",function(){return r.off()})},{link:e}},l.directive("tgKanbanWipLimit",["$timeout",o])}.call(this),function(){var t,e,r,n,i,o,s,a,c;s=this.taiga,n=this.taiga.mixOf,c=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,a=this.taiga.timeout,i=angular.module("taigaKanban"),t=function(t,e,r){var n;return n=function(t,e,n){var i;return i=t.$watch("usByStatus",function(n){var o,s,a,c,u,l,p;if(n&&n.size&&(i(),t.project.my_permissions.indexOf("modify_us")>-1))return u=null,c=null,p=e,s=function(t){return t.scope().$destroy(),t.off(),t.remove()},o=_.map(e.find(".task-column"),function(t){return t}),a=dragula(o,{copySortSource:!1,copy:!1,moves:function(t){return $(t).is("tg-card")}}),a.on("drag",function(t){return window.dragMultiple.start(t,o)}),a.on("cloned",function(t,e){return $(t).addClass("multiple-drag-mirror")}),a.on("dragend",function(e){var n,i,o,a,l,p,h,f;return h=$(e).parent(),u=h.scope(),p=u.s.id,n=window.dragMultiple.stop(),n.length||(n=[e]),o=n[0],a=$(o).index(),l=u.s.id,f=_.map(n,function(t){return $(t).scope().us}),i=_.map(f,function(t){return{id:t.get("id"),oldStatusId:t.getIn(["model","status"])}}),t.$apply(function(){return _.each(f,function(t){return function(t,e){var r,i;if(r=t.getIn(["model","status"]),i=l===r,!i)return c=$(n[e]),s(c)}}(this)),r.$broadcast("kanban:us:move",i,l,a)})}),l=autoScroll(o,{margin:100,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&a.dragging}}),t.$on("$destroy",function(){return e.off(),a.destroy()})})},{link:n}},i.directive("tgKanbanSortable",["$tgRepo","$tgResources","$rootScope",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){function r(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},h={}.hasOwnProperty;u=this.taiga,a=this.taiga.mixOf,l=this.taiga.toString,s=this.taiga.joinStr,o=this.taiga.groupBy,i=this.taiga.bindOnce,n=this.taiga.bindMethods,c=angular.module("taigaEpics"),t=function(t){function e(t,e,r,i,o,s,a,c,u,l,p,h,f,d,g,m,v){var y;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=i,this.rs=o,this.rs2=s,this.params=a,this.q=c,this.location=u,this.log=l,this.appMetaService=p,this.analytics=h,this.navUrls=f,this.translate=d,this.modelTransform=g,this.errorHandlingService=m,this.projectService=v,n(this),this.scope.epicRef=this.params.epicref,this.scope.sectionName=this.translate.instant("EPIC.SECTION_NAME"),this.initializeEventHandlers(),y=this.loadInitialData(),y.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),y.then(null,this.onInitialDataError.bind(this))}return p(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r;return r=this.translate.instant("EPIC.PAGE_TITLE",{epicRef:"#"+this.scope.epic.ref,epicSubject:this.scope.epic.subject,projectName:this.scope.project.name}),t=this.translate.instant("EPIC.PAGE_DESCRIPTION",{epicStatus:(null!=(e=this.scope.statusById[this.scope.epic.status])?e.name:void 0)||"--",epicDescription:angular.element(this.scope.epic.description_html||"").text()}),this.appMetaService.setAll(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on epic",1)}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadEpic()}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-epics",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.immutableProject=this.projectService.project,this.scope.$emit("project:loaded",t),this.scope.statusList=t.epic_statuses,this.scope.statusById=o(t.epic_statuses,function(t){return t.id}),t},e.prototype.loadEpic=function(){return this.rs.epics.getByRef(this.scope.projectId,this.params.epicref).then(function(t){return function(e){var r,n,i;if(t.scope.epic=e,t.scope.immutableEpic=Immutable.fromJS(e._attrs),t.scope.epicId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"epic"),null!=(null!=(n=t.scope.epic.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.epic.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-epics-detail",r)),null!=(null!=(i=t.scope.epic.neighbors.next)?i.ref:void 0))return r={project:t.scope.project.slug,ref:t.scope.epic.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-epics-detail",r)}}(this))},e.prototype.loadUserstories=function(){return this.rs2.userstories.listInEpic(this.scope.epicId).then(function(t){return function(e){return t.scope.userstories=e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadEpic().then(function(t){return function(){return t.loadUserstories()}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.upvote(this.scope.epicId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.downvote(this.scope.epicId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.watch(this.scope.epicId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.unwatch(this.scope.epicId).then(e,t)},e.prototype.onSelectColor=function(t){var e,r,n;return r=function(t){return function(){return t.rootscope.$broadcast("object:updated"),t.confirm.notify("success")}}(this),e=function(t){return function(){return t.confirm.notify("error")}}(this),n=this.modelTransform.save(function(e){return e.color=t,e}),n.then(r,e)},e}(a(u.Controller,u.PageMixin)),c.controller("EpicDetailController",t), +r=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},c.directive("tgEpicStatusDisplay",["$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s,a){var c,u;return u=a.get("common/components/status-button.html",!0),c=function(e,s,a,c){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_epic")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=o(u({status:n,statuses:e.statusList,editable:l()}))(e),s.html(r)}}(this),h=function(e){var o,a,c,u;return o=n().target(s).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),o.finish()},a=function(){return r.notify("error"),o.finish()},u.then(c,a)},s.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return s.find(".pop-status").popover().open()}),s.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),$.fn.popover().closeAll(),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=c.$modelValue)?t.status:void 0},function(){var t;if(t=c.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:c,restrict:"EA",require:"ngModel"}},c.directive("tgEpicStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$translate","$tgTemplate",e])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g=function(t,e){function r(){this.constructor=t}for(var n in e)m.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},m={}.hasOwnProperty;f=this.taiga,p=this.taiga.mixOf,d=this.taiga.toString,l=this.taiga.joinStr,u=this.taiga.groupBy,c=this.taiga.bindOnce,a=this.taiga.bindMethods,h=angular.module("taigaIssues"),t=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d,g,m){var v;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=c,this.log=u,this.appMetaService=l,this.analytics=p,this.navUrls=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.projectService=m,a(this),this.scope.issueRef=this.params.issueref,this.scope.sectionName=this.translate.instant("ISSUES.SECTION_NAME"),this.initializeEventHandlers(),v=this.loadInitialData(),v.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),v.then(null,this.onInitialDataError.bind(this))}return g(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r,n,i,o;return o=this.translate.instant("ISSUE.PAGE_TITLE",{issueRef:"#"+this.scope.issue.ref,issueSubject:this.scope.issue.subject,projectName:this.scope.project.name}),t=this.translate.instant("ISSUE.PAGE_DESCRIPTION",{issueStatus:(null!=(e=this.scope.statusById[this.scope.issue.status])?e.name:void 0)||"--",issueType:(null!=(r=this.scope.typeById[this.scope.issue.type])?r.name:void 0)||"--",issueSeverity:(null!=(n=this.scope.severityById[this.scope.issue.severity])?n.name:void 0)||"--",issuePriority:(null!=(i=this.scope.priorityById[this.scope.issue.priority])?i.name:void 0)||"--",issueDescription:angular.element(this.scope.issue.description_html||"").text()}),this.appMetaService.setAll(o,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on issue",1)}}(this)),this.scope.$on("promote-issue-to-us:success",function(t){return function(){return t.analytics.trackEvent("issue","promoteToUserstory","promote issue to userstory",1),t.rootscope.$broadcast("object:updated"),t.loadIssue()}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadIssue()}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.project.is_issues_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-issues",t):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.issue_statuses,this.scope.statusById=u(t.issue_statuses,function(t){return t.id}),this.scope.typeById=u(t.issue_types,function(t){return t.id}),this.scope.typeList=_.sortBy(t.issue_types,"order"),this.scope.severityList=t.severities,this.scope.severityById=u(t.severities,function(t){return t.id}),this.scope.priorityList=t.priorities,this.scope.priorityById=u(t.priorities,function(t){return t.id}),t},e.prototype.loadIssue=function(){return this.rs.issues.getByRef(this.scope.projectId,this.params.issueref).then(function(t){return function(e){var r,n,i;if(t.scope.issue=e,t.scope.issueId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"issue"),null!=(null!=(n=t.scope.issue.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.issue.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-issues-detail",r)),null!=(null!=(i=t.scope.issue.neighbors.next)?i.ref:void 0))return r={project:t.scope.project.slug,ref:t.scope.issue.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-issues-detail",r)}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadIssue()},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.upvote(this.scope.issueId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.downvote(this.scope.issueId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.watch(this.scope.issueId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.unwatch(this.scope.issueId).then(e,t)},e}(p(f.Controller,f.PageMixin)),h.controller("IssueDetailController",t),i=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},h.directive("tgIssueStatusDisplay",["$tgTemplate","$compile",i]),n=function(t,e,r,n,i,o,s){var a,c;return c=o.get("common/components/status-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=c({status:n,statuses:e.statusList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-status").popover().open()}),o.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.status:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",n]),o=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-type-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.typeById[t.type],r=c({type:n,typees:e.typeList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.type=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".type-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-type").popover().open()}),o.on("click",".type",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),r=e.data("type-id"),h(r)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.type:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueTypeButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",o]),r=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-severity-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.severityById[t.severity],r=c({severity:n,severityes:e.severityList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.severity=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".severity-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-severity").popover().open()}),o.on("click",".severity",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("severity-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.severity:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueSeverityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-priority-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.priorityById[t.priority],r=c({priority:n,priorityes:e.priorityList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.priority=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".priority-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-priority").popover().open()}),o.on("click",".priority",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("priority-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.priority:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssuePriorityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",e]),s=function(t,e,r,n){var i;return i=function(i,o,s,a){var c;return c=function(n){return function(n,i){var o,s,a;return o={generated_from_issue:n.id,project:n.project,subject:n.subject,description:n.description,tags:n.tags,is_blocked:n.is_blocked,blocked_note:n.blocked_note},a=function(){return i.finish(),r.notify("success"),t.$broadcast("promote-issue-to-us:success")},s=function(){return i.finish(),r.notify("error")},e.create("userstories",o).then(a,s)}}(this),o.on("click","a",function(t){var e,i,o,s;return t.preventDefault(),e=a.$modelValue,s=n.instant("ISSUES.CONFIRM_PROMOTE.TITLE"),i=n.instant("ISSUES.CONFIRM_PROMOTE.MESSAGE"),o=e.subject,r.ask(s,o,i).then(function(t){return function(t){return c(e,t)}}(this))}),i.$on("$destroy",function(){return o.off()})},{restrict:"AE",require:"ngModel",templateUrl:"issue/promote-issue-to-us-button.html",link:i}},h.directive("tgPromoteIssueToUsButton",["$rootScope","$tgRepo","$tgConfirm","$translate",s])}.call(this),function(){var t,e,r,n,i,o,s,a=[].indexOf||function(t){for(var e=0,r=this.length;e0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),s=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),c=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),e.selectedFilters=[],t.status&&(u=e.formatSelectedFilters("status",p,t.status),e.selectedFilters=e.selectedFilters.concat(u)),t.tags&&(u=e.formatSelectedFilters("tags",h,t.tags),e.selectedFilters=e.selectedFilters.concat(u)),t.assigned_to&&(u=e.formatSelectedFilters("assigned_to",n,t.assigned_to),e.selectedFilters=e.selectedFilters.concat(u)),t.owner&&(u=e.formatSelectedFilters("owner",s,t.owner),e.selectedFilters=e.selectedFilters.concat(u)),t.type&&(u=e.formatSelectedFilters("type",d,t.type),e.selectedFilters=e.selectedFilters.concat(u)),t.severity&&(u=e.formatSelectedFilters("severity",l,t.severity),e.selectedFilters=e.selectedFilters.concat(u)),t.priority&&(u=e.formatSelectedFilters("priority",a,t.priority),e.selectedFilters=e.selectedFilters.concat(u)),t.role&&(u=e.formatSelectedFilters("role",c,t.role),e.selectedFilters=e.selectedFilters.concat(u)),e.filterQ=t.q,e.filters=[{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TYPE"),dataType:"type",content:d},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.SEVERITY"),dataType:"severity",content:l},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.PRIORITIES"),dataType:"priority",content:a},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:p},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:h,hideEmpty:!0,totalTaggedElements:f.length},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:c},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:s}],e.customFilters=[],_.forOwn(i,function(t,r){return e.customFilters.push({id:r,name:r,filter:t})})}}(this))},e.prototype.initializeSubscription=function(){var t;return t="changes.project."+this.scope.projectId+".issues",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadIssues()}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_issues_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.issueStatusById=a(t.issue_statuses,function(t){return t.id}),this.scope.issueStatusList=_.sortBy(t.issue_statuses,"order"),this.scope.severityById=a(t.severities,function(t){return t.id}),this.scope.severityList=_.sortBy(t.severities,"order"),this.scope.priorityById=a(t.priorities,function(t){return t.id}),this.scope.priorityList=_.sortBy(t.priorities,"order"),this.scope.issueTypes=_.sortBy(t.issue_types,"order"),this.scope.issueTypeById=a(t.issue_types,function(t){return t.id}),t},e.prototype.loadIssuesRequests=0,e.prototype.loadIssues=function(){var t,e;return t=this.location.search(),e=this.rs.issues.list(this.scope.projectId,t),this.loadIssuesRequests+=1,e.index=this.loadIssuesRequests,e.then(function(t){return function(r){return e.index===t.loadIssuesRequests&&(t.scope.issues=r.models,t.scope.page=r.current,t.scope.count=r.count,t.scope.paginatedBy=r.paginatedBy),r}}(this)),e},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.generateFilters(),this.loadIssues()},e.prototype.addNewIssue=function(){return this.rootscope.$broadcast("issueform:new",this.scope.project)},e.prototype.addIssuesInBulk=function(){return this.rootscope.$broadcast("issueform:bulk",this.scope.projectId)},e.prototype.upVoteIssue=function(t){var e,r;return this.voting=t,r=function(t){return function(){return t.loadIssues(),t.voting=null}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.voting=null}}(this),this.rs.issues.upvote(t).then(r,e)},e.prototype.downVoteIssue=function(t){var e,r;return this.voting=t,r=function(t){return function(){return t.loadIssues(),t.voting=null}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.voting=null}}(this),this.rs.issues.downvote(t).then(r,e)},e.prototype.getOrderBy=function(){return _.isString(this.location.search().order_by)?this.location.search().order_by:"created_date"},e}(u(h.Controller,h.PageMixin,h.FiltersMixin)),l.controller("IssuesController",r),n=function(t,e,r,n){var i,o,s,a;return a=r.get("issue/issue-paginator.html",!0),s=function(t,e,r,i){var o,s,c,u,l,p,h;return s=2,l=4,c=2,u=2,o=e.find(".issues-paginator"),p=function(){var e;return e=t.count/t.paginatedBy,e=parseInt(e,10)1,d.showNext=!(t.page===f),e=t.page,i=h=1,m=f;1<=m?h<=m:h>=m;i=1<=m?++h:--h)i===e+s&&f>e+s+u?g.push({classes:"dots",type:"dots"}):i===e-l&&e>c+l?g.push({classes:"dots",type:"dots"}):i>e+s&&i<=f-u||ic||(i===e?g.push({classes:"active",num:i,type:"page-active"}):g.push({classes:"page",num:i,type:"page"}));return r=a(d),r=n(r)(t),o.html(r)},t.$watch("issues",function(t){if(t)return h()}),e.on("click",".issues-paginator a.next",function(e){return e.preventDefault(),t.$apply(function(){return i.selectFilter("page",t.page+1),i.loadIssues()})}),e.on("click",".issues-paginator a.previous",function(e){return e.preventDefault(),t.$apply(function(){return i.selectFilter("page",t.page-1),i.loadIssues()})}),e.on("click",".issues-paginator li.page > a",function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=n.data("pagenum"),t.$apply(function(){return i.selectFilter("page",r),i.loadIssues()})})},o=function(t,r,i,o){var s,a,c,u;return a=o.getOrderBy(),a&&(c=p(a,"-")?"icon-arrow-up":"icon-arrow-down",s=r.find(".row.title > div[data-fieldname='"+d(a,"-")+"']"),u=$("").attr("svg-icon",c),s.append(u),n(s.contents())(t)),r.on("click",".row.title > div",function(i){var s,l,h;return h=angular.element(i.currentTarget),a=o.getOrderBy(),l=h.data("fieldname"),"total_voters"===l&&"-total_voters"!==a&&(a="total_voters"),s=a===l?"-"+l:l,t.$apply(function(){return o.replaceFilter("order_by",s),o.storeFilters(o.params.pslug,e.search(),o.filtersHashSuffix),o.loadIssues().then(function(){return r.find(".row.title > div > tg-svg").remove(),c=p(s,"-")?"icon-arrow-up":"icon-arrow-down",u=$("").attr("svg-icon",c),h.append(u),n(h.contents())(t)})})})},i=function(t,e,r){var n;return n=e.controller(),o(t,e,r,n),s(t,e,r,n),t.$on("$destroy",function(){return e.off()})},{link:i}},l.directive("tgIssues",["$log","$tgLocation","$tgTemplate","$compile",n]),e=function(t,e,r){var n,i,o;return i=e.get("issue/issue-status-inline-edition-selection.html",!0),o=function(t,e,r){var n,i,o;if(i=t.find(".issue-status"),n=t.find(".issue-status .issue-status-bind"),o=r[e.status])return n.text(o.name),n.prop("title",o.name),i.css("color",o.color)},n=function(e,r,n){var s,a;return s=r.controller(),a=e.$eval(n.tgIssueStatusInlineEdition),r.on("click",".issue-status",function(t){return t.preventDefault(),t.stopPropagation(),r.find(".pop-status").popover().open()}),r.on("click",".status",function(n){var i;return n.preventDefault(),n.stopPropagation(),i=angular.element(n.currentTarget),a.status=i.data("status-id"),r.find(".pop-status").popover().close(),o(r,a,e.issueStatusById),e.$apply(function(){return t.save(a).then(function(){if(s.generateFilters(),s.isFilterDataTypeSelected("status"))return s.loadIssues()})})}),h.bindOnce(e,"project",function(t){if(r.append(i({statuses:t.issue_statuses})),o(r,a,e.issueStatusById),t.my_permissions.indexOf("modify_issue")===-1)return r.unbind("click"),r.find("a").addClass("not-clickable")}),e.$watch(n.tgIssueStatusInlineEdition,function(t){return function(t){return o(r,t,e.issueStatusById)}}(this)),e.$on("$destroy",function(){return r.off()})},{link:n}},l.directive("tgIssueStatusInlineEdition",["$tgRepo","$tgTemplate","$rootScope",e]),t=function(t,e,r,n){var i,o;return o=_.template('<%- name %>\n
    <%- name %>
    '),i=function(i,s,a){var c,u,l;return l=function(t){var e,a,c;return a={name:r.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png"},c=i.usersById[t.assigned_to],e=n.getAvatar(c),a.imgurl=e.url,a.bg=null,c&&(a.name=c.full_name_display,a.bg=e.bg),s.find(".avatar").html(o(a)),s.find(".issue-assignedto").attr("title",a.name)},c=s.controller(),u=i.$eval(a.tgIssueAssignedToInlineEdition),l(u),s.on("click",".issue-assignedto",function(t){return e.$broadcast("assigned-to:add",u)}),h.bindOnce(i,"project",function(t){if(t.my_permissions.indexOf("modify_issue")===-1)return s.unbind("click"),s.find("a").addClass("not-clickable")}),i.$on("assigned-to:added",function(e,r,n){if(n.id===u.id)return n.assigned_to=r,t.save(u).then(function(){if(l(n),c.generateFilters(),c.isFilterDataTypeSelected("assigned_to")||c.isFilterDataTypeSelected("role"))return c.loadIssues()})}),i.$watch(a.tgIssueAssignedToInlineEdition,function(t){return l(t)}),i.$on("$destroy",function(){return s.off()})},{link:i}},l.directive("tgIssueAssignedToInlineEdition",["$tgRepo","$rootScope","$translate","tgAvatarService",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){function r(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},h={}.hasOwnProperty;l=this.taiga,c=this.taiga.mixOf,a=this.taiga.groupBy,s=this.taiga.bindOnce,o=this.taiga.bindMethods,u=angular.module("taigaUserStories"),i=function(t){function e(t,e,r,n,i,s,a,c,u,l,p,h,f,d,g,m,v,y){var _;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=s,this.q=a,this.location=c,this.log=u,this.appMetaService=l,this.navUrls=p,this.analytics=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.configService=m,this.projectService=v,this.wysiwigService=y,o(this),this.scope.usRef=this.params.usref,this.scope.sectionName=this.translate.instant("US.SECTION_NAME"),this.scope.tribeEnabled=this.configService.config.tribeHost,this.initializeEventHandlers(),_=this.loadInitialData(),_.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),_.then(null,this.onInitialDataError.bind(this))}return p(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","$tgQueueModelTransformation","tgErrorHandlingService","$tgConfig","tgProjectService","tgWysiwygService"], e.prototype._setMeta=function(){var t,e,r,n,i,o;return o=this.scope.tasks.length,t=_.filter(this.scope.tasks,function(t){return function(e){return t.scope.taskStatusById[e.status].is_closed}}(this)).length,r=o>0?Math.round(100*t/o):0,i=this.translate.instant("US.PAGE_TITLE",{userStoryRef:"#"+this.scope.us.ref,userStorySubject:this.scope.us.subject,projectName:this.scope.project.name}),e=this.translate.instant("US.PAGE_DESCRIPTION",{userStoryStatus:(null!=(n=this.scope.statusById[this.scope.us.status])?n.name:void 0)||"--",userStoryPoints:this.scope.us.total_points,userStoryDescription:angular.element(this.wysiwigService.getHTML(this.scope.us.description)||"").text(),userStoryClosedTasks:t,userStoryTotalTasks:o,userStoryProgressPercentage:r}),this.appMetaService.setAll(i,e)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("related-tasks:update",function(t){return function(){var e;if(t.scope.tasks=_.clone(t.scope.tasks,!1),e=_.every(t.scope.tasks,function(t){return t.is_closed}),t.scope.us.is_closed!==e)return t.loadUs()}}(this)),this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on userstory",1)}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadUs()}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t),this.scope.project.is_backlog_activated?this.scope.us.milestone?(t.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",t)):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-backlog",t):this.scope.project.is_kanban_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-kanban",t):void 0},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.us_statuses,this.scope.statusById=a(t.us_statuses,function(t){return t.id}),this.scope.taskStatusById=a(t.task_statuses,function(t){return t.id}),this.scope.pointsList=_.sortBy(t.points,"order"),this.scope.pointsById=a(this.scope.pointsList,function(t){return t.id}),t},e.prototype.loadUs=function(){var t,e,r,n;return t=_.pick(this.location.search(),"milestone","no-milestone","kanban-status"),r=t.milestone,r&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:r,order_by:"sprint_order"}),n=t["no-milestone"],n&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:"null",order_by:"backlog_order"}),e=t["kanban-status"],e&&this.rs.userstories.storeQueryParams(this.scope.projectId,{status:e,order_by:"kanban_order"}),this.rs.userstories.getByRef(this.scope.projectId,this.params.usref).then(function(t){return function(e){return t.scope.us=e,t.scope.usId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"us"),e}}(this))},e.prototype.loadSprint=function(){if(this.scope.us.milestone)return this.rs.sprints.get(this.scope.us.project,this.scope.us.milestone).then(function(t){return function(e){return t.scope.sprint=e,e}}(this))},e.prototype.loadTasks=function(){return this.rs.tasks.list(this.scope.projectId,null,this.scope.usId).then(function(t){return function(e){return t.scope.tasks=e,e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadUs().then(function(t){return function(){return t.q.all([t.loadSprint(),t.loadTasks()])}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.upvote(this.scope.usId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.downvote(this.scope.usId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.watch(this.scope.usId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.unwatch(this.scope.usId).then(e,t)},e.prototype.onTribeInfo=function(){var t,e,r,n;return r=this.translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TITLE"),t=$("").attr({src:"/"+window._version+"/images/monster-fight.png",alt:this.translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TITLE")}),n=this.translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TEXT"),e=$("
    ").append(t).append(n),this.confirm.success(r,e)},e}(c(l.Controller,l.PageMixin)),u.controller("UserStoryDetailController",i),r=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:i.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},u.directive("tgUsStatusDisplay",["$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=o.get("common/components/status-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_us")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=c({status:n,statuses:e.statusList,editable:l()}),o.html(r),s(o.contents())(e)}}(this),h=function(e){return function(e){var s,a,c,u;return o.find(".pop-status").popover().close(),s=n().target(o.find(".js-edit-status")).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)}}(this),o.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-status").popover().open()}),o.on("click",".status",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("status-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.status:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},u.directive("tgUsStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",e]),n=function(t,e,r,n,i,o,s){var a,c;return c=o.get("us/us-team-requirement-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_us")!==-1},p=function(t){var r,n;return r={canEdit:l(),isRequired:t.team_requirement},n=c(r),n=s(n)(e),o.html(n)},h=function(e){var s,a;return s=n().target(o.find("label")).start(),a=i.save(function(t){return t.team_requirement=e,t}),a.then(function(e){return function(){return s.finish(),t.$broadcast("object:updated")}}(this)),a.then(null,function(){return s.finish(),r.notify("error")})},o.on("click",".team-requirement",function(t){var e;if(l())return e=!u.$modelValue.team_requirement,h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.team_requirement:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},u.directive("tgUsTeamRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",n]),t=function(t,e,r,n,i,o,s){var a,c;return c=o.get("us/us-client-requirement-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_us")!==-1},p=function(t){var r,n;return r={canEdit:l(),isRequired:t.client_requirement},n=s(c(r))(e),o.html(n)},h=function(e){var s,a;return s=n().target(o.find("label")).start(),a=i.save(function(t){return t.client_requirement=e,t}),a.then(function(e){return function(){return s.finish(),t.$broadcast("object:updated")}}(this)),a.then(null,function(){return r.notify("error")})},o.on("click",".client-requirement",function(t){var e;if(l())return e=!u.$modelValue.client_requirement,h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.client_requirement:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},u.directive("tgUsClientRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){function r(){this.constructor=t}for(var n in e)l.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},l={}.hasOwnProperty;c=this.taiga,s=this.taiga.mixOf,o=this.taiga.groupBy,i=this.taiga.bindMethods,a=angular.module("taigaTasks"),t=function(t){function e(t,e,r,n,o,s,a,c,u,l,p,h,f,d,g,m){var v;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=o,this.params=s,this.q=a,this.location=c,this.log=u,this.appMetaService=l,this.navUrls=p,this.analytics=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.projectService=m,i(this),this.scope.taskRef=this.params.taskref,this.scope.sectionName=this.translate.instant("TASK.SECTION_NAME"),this.initializeEventHandlers(),v=this.loadInitialData(),v.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),v.then(null,this.onInitialDataError.bind(this))}return u(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r;return r=this.translate.instant("TASK.PAGE_TITLE",{taskRef:"#"+this.scope.task.ref,taskSubject:this.scope.task.subject,projectName:this.scope.project.name}),t=this.translate.instant("TASK.PAGE_DESCRIPTION",{taskStatus:(null!=(e=this.scope.statusById[this.scope.task.status])?e.name:void 0)||"--",taskDescription:angular.element(this.scope.task.description_html||"").text()}),this.appMetaService.setAll(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on task",1)}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadTask()}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;if(t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t),this.scope.project.is_backlog_activated){if(this.scope.task.milestone)return t.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",t);if(this.scope.task.us)return t.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",t)}else if(this.scope.project.is_kanban_activated&&this.scope.us)return t.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.task_statuses,this.scope.statusById=o(t.task_statuses,function(t){return t.id}),t},e.prototype.loadTask=function(){return this.rs.tasks.getByRef(this.scope.projectId,this.params.taskref).then(function(t){return function(e){var r,n,i;return t.scope.task=e,t.scope.taskId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"task"),null!=(null!=(n=t.scope.task.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.task.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-tasks-detail",r)),null!=(null!=(i=t.scope.task.neighbors.next)?i.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.task.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-tasks-detail",r)),e}}(this))},e.prototype.loadSprint=function(){if(this.scope.task.milestone)return this.rs.sprints.get(this.scope.task.project,this.scope.task.milestone).then(function(t){return function(e){return t.scope.sprint=e,e}}(this))},e.prototype.loadUserStory=function(){if(this.scope.task.user_story)return this.rs.userstories.get(this.scope.task.project,this.scope.task.user_story).then(function(t){return function(e){return t.scope.us=e,e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadTask().then(function(t){return function(){return t.q.all([t.loadSprint(),t.loadUserStory()])}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.upvote(this.scope.taskId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.downvote(this.scope.taskId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.watch(this.scope.taskId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.unwatch(this.scope.taskId).then(e,t)},e}(s(c.Controller,c.PageMixin)),a.controller("TaskDetailController",t),n=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},a.directive("tgTaskStatusDisplay",["$tgTemplate","$compile",n]),r=function(t,e,r,n,i,o,s,a){var c,u;return u=a.get("common/components/status-button.html",!0),c=function(e,s,a,c){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_task")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=o(u({status:n,statuses:e.statusList,editable:l()}))(e),s.html(r)}}(this),h=function(e){var o,a,c,u;return o=n().target(s).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),o.finish()},a=function(){return r.notify("error"),o.finish()},u.then(c,a)},s.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return s.find(".pop-status").popover().open()}),s.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),$.fn.popover().closeAll(),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=c.$modelValue)?t.status:void 0},function(){var t;if(t=c.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:c,restrict:"EA",require:"ngModel"}},a.directive("tgTaskStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$translate","$tgTemplate",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=s.get("issue/iocaine-button.html",!0),a=function(e,s,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_task")!==-1},p=function(t){var r,n;return l()||t.is_iocaine?(r={isIocaine:t.is_iocaine,isEditable:l()},n=o(c(r))(e),s.html(n)):void s.html("")},h=function(e){var o,a;return o=n().target(s.find("label")).start(),a=i.save(function(t){return t.is_iocaine=e,t}),a.then(function(){return t.$broadcast("object:updated")}),a.then(null,function(){return r.notify("error")}),a["finally"](function(){return o.finish()})},s.on("click",".is-iocaine",function(t){var e;if(l())return e=!u.$modelValue.is_iocaine,h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.is_iocaine:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:a,restrict:"EA",require:"ngModel"}},a.directive("tgTaskIsIocaineButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$tgTemplate",e])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l=function(t,e){function r(){this.constructor=t}for(var n in e)p.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},p={}.hasOwnProperty;u=this.taiga,a=this.taiga.mixOf,c=angular.module("taigaTeam"),e=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h){var f;this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.params=i,this.q=o,this.location=s,this.navUrls=a,this.appMetaService=c,this.auth=u,this.translate=l,this.projectService=p,this.errorHandlingService=h,this.scope.sectionName="TEAM.SECTION_NAME",f=this.loadInitialData(),f.then(function(t){return function(){var e,r;return r=t.translate.instant("TEAM.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.translate.instant("TEAM.PAGE_DESCRIPTION",{projectName:t.scope.project.name,projectDescription:t.scope.project.description}),t.appMetaService.setAll(r,e)}}(this)),f.then(null,this.onInitialDataError.bind(this))}return l(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$location","$tgNavUrls","tgAppMetaService","$tgAuth","$translate","tgProjectService","tgErrorHandlingService"],e.prototype.setRole=function(t){return t?this.scope.filtersRole=t:this.scope.filtersRole=null},e.prototype.loadMembers=function(){var t,e,r,n,i;for(i=this.auth.getUser(),this.scope.totals={},n=this.scope.activeUsers,t=0,e=n.length;t=0)})}},c.filter("membersFilter",s)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){return function(){return t.apply(e,arguments)}},l=function(t,e){function r(){this.constructor=t}for(var n in e)p.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},p={}.hasOwnProperty;c=this.taiga,s=this.taiga.mixOf,o=this.taiga.groupBy,n=this.taiga.bindOnce,i=this.taiga.debounce,a=angular.module("taigaWiki"),t=function(t){function e(t,e,r,n,i,o,s,a,c,l,p,h,f,d,g,m,v){var y;this.scope=t,this.rootscope=e,this.repo=r,this.model=n,this.confirm=i,this.rs=o,this.params=s,this.q=a,this.location=c,this.filter=l,this.log=p,this.appMetaService=h,this.navUrls=f,this.analytics=d,this.translate=g,this.errorHandlingService=m,this.projectService=v,this.moveLink=u(this.moveLink,this),this.loadWiki=u(this.loadWiki,this),this.scope.$on("wiki:links:move",this.moveLink),this.scope.$on("wikipage:add",this.loadWiki),this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,y=this.loadInitialData(),y.then(function(t){return function(){return t._setMeta()}}(this)),y.then(null,this.onInitialDataError.bind(this))}return l(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$filter","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r,n,i;return i=this.translate.instant("WIKI.PAGE_TITLE",{wikiPageName:this.scope.wikiSlug,projectName:this.scope.project.name}),t=this.translate.instant("WIKI.PAGE_DESCRIPTION",{wikiPageContent:angular.element((null!=(e=this.scope.wiki)?e.html:void 0)||"").text(),totalEditions:(null!=(r=this.scope.wiki)?r.editions:void 0)||0,lastModifiedDate:moment(null!=(n=this.scope.wiki)?n.modified_date:void 0).format(this.translate.instant("WIKI.DATETIME"))}),this.appMetaService.setAll(i,t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_wiki_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadWiki=function(){var t;return t=this.rs.wiki.getBySlug(this.scope.projectId,this.params.slug),t.then(function(t){return function(e){return t.scope.wiki=e,t.scope.wikiId=e.id,t.scope.wiki}}(this)),t.then(null,function(t){return function(e){var r;return t.scope.wikiId=null,t.scope.project.my_permissions.indexOf("add_wiki_page")===-1?null:(r={project:t.scope.projectId,slug:t.scope.wikiSlug,content:""},t.scope.wiki=t.model.make_model("wiki",r),t.scope.wiki)}}(this))},e.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(t){return function(e){var r,n,i,o,s;for(t.scope.wikiLinks=e,o=t.scope.wikiLinks,r=0,n=o.length;r\n \n \n\n
    \n\n \n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\n
    \n
    "}},a.directive("tgWikiWysiwyg",["$tgQueueModelTransformation","$rootScope","$tgConfirm","tgAttachmentsFullService","$tgQqueue","$tgRepo","$tgAnalytics","tgWikiHistoryService",r])}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.groupBy,e=this.taiga.bindOnce,i=angular.module("taigaWiki"),t=function(t,r,n,i,o,s,a,c,u){var l,p,h;return h=a.get("wiki/wiki-nav.html",!0),p=function(n,a,l){var p,f,d,g;return p=a.controller(),null==l.ngModel?r.error("WikiNavDirective: no ng-model attr is defined"):(f=n.project.my_permissions.indexOf("add_wiki_link")>-1,d=null,g=function(e){var r,l,m,v,y;return f=n.project.my_permissions.indexOf("add_wiki_link")>-1,r=n.project.my_permissions.indexOf("delete_wiki_link")>-1,l=h({wikiLinks:e,projectSlug:n.projectSlug,addWikiLinkPermission:f,deleteWikiLinkPermission:r}),l=c(l)(n),a.off(),f&&d&&d.destroy(),a.html(l),f&&(m=null,y=a.find(".sortable"),d=dragula([y[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:y[0],moves:function(t){return $(t).is("li")}}),d.on("dragend",function(t){var e;return m=$(t),t=m.scope().link,e=m.index(),n.$emit("wiki:links:move",t,e)}),v=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&d.dragging}})),a.on("click",".add-button",function(t){return t.preventDefault(),a.find(".new").removeClass("hidden"),a.find(".new input").focus(),a.find(".add-button").hide()}),a.on("click",".js-delete-link",function(e){var r,o,s,a;return e.preventDefault(),e.stopPropagation(),s=angular.element(e.currentTarget),r=s.parents(".wiki-link").data("id"),a=u.instant("WIKI.DELETE_LINK_TITLE"),o=n.wikiLinks[r].title,i.askOnDelete(a,o).then(function(e){return function(e){var o;return o=t.remove(n.wikiLinks[r]),o.then(function(){return o=p.loadWikiLinks(),o.then(function(){return e.finish(),g(n.wikiLinks)}),o.then(null,function(){return e.finish()})}),o.then(null,function(){return e.finish(!1),i.notify("error")})}}(this))}),a.on("keyup",".new input",function(e){var r,c,u,l;return e.preventDefault(),13===e.keyCode?(l=angular.element(e.currentTarget),c=l.val(),r=s().target(a.find(".new")).start(),u=t.create("wiki-links",{project:n.projectId,title:c}),u.then(function(){var t;return o.trackEvent("wikilink","create","create wiki link",1),t=p.loadWikiLinks(),t.then(function(){return r.finish(),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show(),g(n.wikiLinks)}),t.then(null,function(){return r.finish(),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show(),i.notify("error","Error loading wiki links")})}),u.then(null,function(t){var e;return r.finish(),a.find(".new input").val(c),a.find(".new input").focus().select(),null!=(null!=t&&null!=(e=t.__all__)?e[0]:void 0)?i.notify("error","The link already exists"):i.notify("error")})):27===e.keyCode?(l=angular.element(e.currentTarget),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show()):void 0})},e(n,l.ngModel,g))},l=function(t,e,r){return p(t,e,r),t.$on("$destroy",function(){return e.off()})},{link:l}},i.directive("tgWikiNav",["$tgRepo","$log","$tgLocation","$tgConfirm","$tgAnalytics","$tgLoading","$tgTemplate","$compile","$translate",t]); }.call(this),function(){var t,e,r,n,i=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;n=this.taiga,e=this.taiga.mixOf,r=angular.module("taigaWiki"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.model=n,this.confirm=i,this.rs=o,this.params=s,this.q=a,this.navUrls=c,this.errorHandlingService=u,this.projectService=l,this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return i(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgNavUrls","tgErrorHandlingService","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_wiki_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadWikiPages=function(){var t;return t=this.rs.wiki.list(this.scope.projectId).then(function(t){return function(e){return t.scope.wikipages=e}}(this))},e.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(t){return function(e){var r,n,i,o,s;for(t.scope.wikiLinks=e,o=t.scope.wikiLinks,r=0,n=o.length;rt.total_memberships,this.scope.$emit("project:loaded",t),t},e.prototype.loadMembers=function(){var t;return t=this.getUrlFilters(),this.rs.memberships.list(this.scope.projectId,t).then(function(t){return function(e){return t.scope.memberships=_.filter(e.models,function(t){return null===t.user||t.is_user_active}),t.scope.page=e.current,t.scope.count=e.count,t.scope.paginatedBy=e.paginatedBy,e}}(this))},e.prototype.loadInitialData=function(){return this.loadProject(),this.q.all([this.loadMembers(),this.auth.refresh()])},e.prototype.getUrlFilters=function(){var t;return t=_.pick(this.location.search(),"page"),t.page||(t.page=1),t},e.prototype.addNewMembers=function(){return this.lightboxFactory.create("tg-lb-add-members",{"class":"lightbox lightbox-add-member",project:"project"},{project:this.scope.project})},e.prototype.showLimitUsersWarningMessage=function(){var t,e,r;return r=this.translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING"),e=this.translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE",{members:this.scope.project.max_memberships}),t="/"+window._version+"/svg/icons/team-question.svg",this.confirm.success(r,e,{name:t,type:"img"})},e}(c(l.Controller,l.PageMixin,l.FiltersMixin)),u.controller("MembershipsController",t),e=function(t,e){var r,n,i;return i=t.get("admin/admin-membership-paginator.html",!0),n=function(t,r,n,o){var s,a,c,u,l,p,h;return a=2,l=4,c=2,u=2,s=r.find(".memberships-paginator"),p=function(){var e;return e=t.count/t.paginatedBy,e=parseInt(e,10)1,d.showNext=!(t.page===f),r=t.page,o=h=1,m=f;1<=m?h<=m:h>=m;o=1<=m?++h:--h)o===r+a&&f>r+a+u?g.push({classes:"dots",type:"dots"}):o===r-l&&r>c+l?g.push({classes:"dots",type:"dots"}):o>r+a&&o<=f-u||oc||(o===r?g.push({classes:"active",num:o,type:"page-active"}):g.push({classes:"page",num:o,type:"page"}));return n=i(d),n=e(n)(t),s.html(n),s.show()},t.$watch("memberships",function(t){if(t)return h()}),r.on("click",".memberships-paginator a.next",function(e){return e.preventDefault(),t.$apply(function(){return o.selectFilter("page",t.page+1),o.loadMembers()})}),r.on("click",".memberships-paginator a.previous",function(e){return e.preventDefault(),t.$apply(function(){return o.selectFilter("page",t.page-1),o.loadMembers()})}),r.on("click",".memberships-paginator li.page > a",function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=n.data("pagenum"),t.$apply(function(){return o.selectFilter("page",r),o.loadMembers()})})},r=function(t,e,r){var i;return i=e.controller(),n(t,e,r,i),t.$on("$destroy",function(){return e.off()})},{link:r}},u.directive("tgMemberships",["$tgTemplate","$compile",e]),i=function(t,e,r,n,i){var o,s;return s=e.get("admin/memberships-row-avatar.html",!0),o=function(e,o,a){var c,u,l;return u=r.instant("ADMIN.MEMBERSHIP.STATUS_PENDING"),l=function(t){var r,a,c;return r=i.getAvatar(t),a={full_name:t.full_name?t.full_name:"",email:t.user_email?t.user_email:t.email,imgurl:r.url,bg:r.bg,pending:t.is_user_active?"":u,isOwner:t.is_owner},c=s(a),c=n(c)(e),o.html(c)},null==a.tgMembershipsRowAvatar?t.error("MembershipsRowAvatarDirective: the directive need a member"):(c=e.$eval(a.tgMembershipsRowAvatar),l(c),e.$on("$destroy",function(){return o.off()}))},{link:o}},u.directive("tgMembershipsRowAvatar",["$log","$tgTemplate","$translate","$compile","tgAvatarService",i]),n=function(t,e,r,n,i){var o,s;return s=n.get("admin/admin-memberships-row-checkbox.html",!0),o=function(n,o,a){var c,u,l;return n.$on("$destroy",function(){return o.off()}),null==a.tgMembershipsRowAdminCheckbox?t.error("MembershipsRowAdminCheckboxDirective: the directive need a member"):(u=n.$eval(a.tgMembershipsRowAdminCheckbox),u.is_owner?void o.find(".js-check").remove():(l=function(t){var e,r;return e={inputId:"is-admin-"+t.id},r=s(e),r=i(r)(n),o.html(r)},o.on("click",":checkbox",function(t){return function(t){var n,i,s;return i=function(){return r.notify("success")},n=function(t){return u.revert(),o.find(":checkbox").prop("checked",u.is_admin),r.notify("error",t.is_admin[0])},s=angular.element(t.currentTarget),u.is_admin=s.prop("checked"),e.save(u).then(i,n)}}(this)),c=l(u),u.is_admin?o.find(":checkbox").prop("checked",!0):void 0))},{link:o}},u.directive("tgMembershipsRowAdminCheckbox",["$log","$tgRepo","$tgConfirm","$tgTemplate","$compile",n]),o=function(t,e,r){var n,i;return i=_.template(''),n=function(n,o,s){var a,c,u,l;return l=function(t){var e,r;return e={roleList:n.project.roles,selectedRole:t.role},r=i(e),o.html(r)},null==s.tgMembershipsRowRoleSelector?t.error("MembershipsRowRoleSelectorDirective: the directive need a member"):(a=o.controller(),u=n.$eval(s.tgMembershipsRowRoleSelector),c=l(u),o.on("change","select",function(t){return function(t){var n,i,o,s;if(o=function(){return r.notify("success")},i=function(){return r.notify("error")},s=angular.element(t.currentTarget),n=parseInt(s.val(),10),u.role!==n)return u.role=n,e.save(u).then(o,i)}}(this)),n.$on("$destroy",function(){return o.off()}))},{link:n}},u.directive("tgMembershipsRowRoleSelector",["$log","$tgRepo","$tgConfirm",o]),r=function(t,e,r,n,i,o,s,a,c,u){var l,p,h;return l='
    \n
    \n\n \n',h='\n\n\n \n',p=function(p,f,d){var g,m,v,y;return y=function(t){var e;return e=t.user?i(l)(p):i(h)(p),f.html(e)},null==d.tgMembershipsRowActions?t.error("MembershipsRowActionsDirective: the directive need a member"):(g=f.controller(),v=p.$eval(d.tgMembershipsRowActions),y(v),f.on("click",".js-resend",function(t){var e,i;return t.preventDefault(),i=function(){var t;return t=o.instant("ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION",{email:p.member.email}),n.notify("success",t)},e=function(){var t;return t=o.instant("ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION"),n.notify("error",t)},r.memberships.resendInvitation(p.member.id).then(i,e)}),m=function(){var t,r,i;return i=o.instant("ADMIN.MEMBERSHIP.DELETE_MEMBER"),t=o.instant("ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE",{email:v.email}),r=v.user?v.full_name:t,n.askOnDelete(i,r).then(function(t){var i,c;return c=function(e){return function(){var e;return t.finish(),v.user!==p.user.id?(p.page>1&&p.count-1<=p.paginatedBy&&g.selectFilter("page",p.page-1),u.fetchProject().then(function(){return g.loadInitialData()})):s.path(a.resolve("home")),e=o.instant("ADMIN.MEMBERSHIP.SUCCESS_DELETE",{message:r}),n.notify("success",e,null,5e3)}}(this),i=function(e){return function(){var e;return t.finish(!1),e=o.instant("ADMIN.MEMBERSHIP.ERROR_DELETE",{message:r}),n.notify("error",e)}}(this),e.remove(v).then(c,i)})},f.on("click",".delete",function(t){var e;return t.preventDefault(),p.project.owner.id===v.user?(e=p.user.id===v.user,c.create("tg-lightbox-leave-project-warning",{"class":"lightbox lightbox-leave-project-warning"},{isCurrentUser:e,project:p.project})):m()}),p.$on("$destroy",function(){return f.off()}))},{link:p}},u.directive("tgMembershipsRowActions",["$log","$tgRepo","$tgResources","$tgConfirm","$compile","$translate","$tgLocation","$tgNavUrls","tgLightboxFactory","tgProjectService",r]),s=function(){return{templateUrl:"admin/no-more-memberships-explanation.html",scope:{project:"="}}},u.directive("tgNoMoreMembershipsExplanation",[s])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgAdminNavigation,e.find(".active").removeClass("active"),e.find("#adminmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaAdmin"),e.directive("tgAdminNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w=function(t,e){function r(){this.constructor=t}for(var n in e)A.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},A={}.hasOwnProperty,O=function(t,e){return function(){return t.apply(e,arguments)}};T=this.taiga,$=this.taiga.mixOf,E=this.taiga.scopeDefer,P=this.taiga.trim,C=this.taiga.toString,k=this.taiga.joinStr,j=this.taiga.groupBy,b=this.taiga.bindOnce,S=this.taiga.debounce,I=angular.module("taigaAdmin"),v=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g){var m;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.appMetaService=u,this.translate=l,this.tgAuth=p,this.currentUserService=h,this.errorHandlingService=f,this.projectService=d,this.model=g,this.scope.project={},this.scope.projectTags=[],m=this.loadInitialData(),m.then(function(t){return function(){var e,r,n;return r=t.translate.instant(t.scope.sectionName),n=t.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:r,projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(n,e),t.fillUsersAndRoles(t.scope.project.members,t.scope.project.roles)}}(this)),m.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:loaded",function(t){return function(){var e,r,n;return r=t.translate.instant(t.scope.sectionName),n=t.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:r,projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(n,e)}}(this))}return w(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","$tgAuth","tgCurrentUserService","tgErrorHandlingService","tgProjectService","$tgModel"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t=this.model.make_model("projects",t),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.epicStatusList=_.sortBy(t.epic_statuses,"order"),this.scope.usStatusList=_.sortBy(t.us_statuses,"order"),this.scope.pointsList=_.sortBy(t.points,"order"),this.scope.taskStatusList=_.sortBy(t.task_statuses,"order"),this.scope.issueTypesList=_.sortBy(t.issue_types,"order"),this.scope.issueStatusList=_.sortBy(t.issue_statuses,"order"),this.scope.prioritiesList=_.sortBy(t.priorities,"order"),this.scope.severitiesList=_.sortBy(t.severities,"order"),E(this.scope,function(e){return function(){return e.scope.$emit("project:loaded",t)}}(this)),this.scope.projectTags=_.map(this.scope.project.tags,function(t){return function(e){return[e,t.scope.project.tags_colors[e]]}}(this)),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.tgAuth.refresh()},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.project)},e.prototype.addTag=function(t,e){var r;return r=_.clone(this.scope.project.tags),r.push(t),this.scope.projectTags.push([t,null]),this.scope.project.tags=r},e.prototype.deleteTag=function(t){var e;return e=_.clone(this.scope.project.tags),_.pull(e,t[0]),_.remove(this.scope.projectTags,function(e){return function(e){return e[0]===t[0]}}(this)),this.scope.project.tags=e},e}($(T.Controller,T.PageMixin)),I.controller("ProjectProfileController",v),y=function(t,e,r,n,i,o,s,a){var c;return c=function(c,u,l){var p,h,f,d;return p=u.controller(),h=u.find("form").checksley({onlyOneErrorElement:!0}),f=S(2e3,function(u){return function(u){var l,f,g;if(u.preventDefault(),h.validate())return l=r().target(d).start(),f=c.project.isAttributeModified("is_private"),g=t.save(c.project),g.then(function(){var t;return l.finish(),f&&c.project.is_private?a.trackEvent("project-privacy-changed","from-public-to-private","Change project privacy from public to private",1):f&&!c.project.is_private&&a.trackEvent("project-privacy-changed","from-private-to-public","Change project privacy from private to public",1),e.notify("success"),t=n.resolve("project-admin-project-profile-details",{project:c.project.slug}),i.path(t),o.fetchProject().then(function(t){return function(){return p.loadInitialData()}}(this)),s.loadProjects()}),g.then(null,function(t){if(l.finish(),h.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),d=u.find(".submit-button"),u.on("submit","form",f)},{link:c}},I.directive("tgProjectProfile",["$tgRepo","$tgConfirm","$tgLoading","$tgNavUrls","$tgLocation","tgProjectService","tgCurrentUserService","$tgAnalytics",y]),h=function(t,e,r){var n;return n=function(n,i,o){var s,a,c;return s=i.find("form").checksley({onlyOneErrorElement:!0}),a=S(2e3,function(i){return function(i){var o,a;if(i.preventDefault(),s.validate())return o=r().target(c).start(),a=t.save(n.project),a.then(function(){return o.finish(),e.notify("success")}),a.then(null,function(t){if(o.finish(),s.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),c=i.find(".submit-button"),i.on("submit","form",a),n.$on("$destroy",function(){return i.off()})},{link:n}},I.directive("tgProjectDefaultValues",["$tgRepo","$tgConfirm","$tgLoading",h]),m=function(t,e,r,n){var i;return i=function(r,i,o){var s;return s=function(o){return function(){var o,s;if(o=i.find("form").checksley(),o.initializeFields(),o.reset(),o.validate())return s=t.save(r.project),s.then(function(){return r.$emit("project:loaded",r.project),e.notify("success"),n.fetchProject()}),s.then(null,function(t){if(o.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this),i.on("change",".module-activation.module-direct-active input",function(t){return t.preventDefault(),r.$applyAsync(s)}),i.on("submit","form",function(t){return t.preventDefault(),s()}),i.on("click",".save",function(t){return t.preventDefault(),s()}),i.on("keydown",".videoconference-attributes input",function(t){return 32!==t.which}),r.$watch("project.videoconferences",function(t,e){if(null!=t&&null!=e&&t!==e)return r.project.videoconferences_extra_data=""}),r.$watch("isVideoconferenceActivated",function(t,e){if(t===!1&&(r.project.videoconferences=null,r.project.videoconferences_extra_data="",e===!0))return s()}),r.$watch("project",function(t){return null!=t.videoconferences?r.isVideoconferenceActivated=!0:r.isVideoconferenceActivated=!1})},{link:i}},I.directive("tgProjectModules",["$tgRepo","$tgConfirm","$tgLoading","tgProjectService",m]),f=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,l,p,h,f,d,g,m,v,y,_,b,j,k,$,I,E,T,C,P,w,A,O,R,M;return u=s.find(".admin-project-export-buttons"),E=function(){return u.removeClass("hidden")},p=function(){return u.addClass("hidden")},m=s.find(".admin-project-export-result"),A=function(){return m.removeClass("hidden")},h=function(){return m.addClass("hidden")},R=s.find(".spin"),O=function(){return R.removeClass("hidden")},f=function(){return R.addClass("hidden")},y=s.find(".result-title"),g=n.instant("ADMIN.PROJECT_EXPORT.LOADING_TITLE"),d=n.instant("ADMIN.PROJECT_EXPORT.LOADING_MESSAGE"),l=function(){return y.html(n.instant("ADMIN.PROJECT_EXPORT.DUMP_READY"))},c=function(){return y.html(n.instant("ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE"))},M=function(t){return y.html(n.instant("ADMIN.PROJECT_EXPORT.SYNC_MESSAGE",{url:t}))},k=function(){return y.html(g)},b=function(){return y.html(d)},I=function(){return y.html(l)},v=s.find(".result-message "),j=function(){return v.html(d)},_=function(){return v.html(c)},$=function(t){return v.html(M(t))},w=function(){return O(),k(),j(),p(),A()},C=function(){return f(),b(),_()},P=function(t){return f(),I(),$(t)},T=function(){return f(),h(),E()},s.on("click","a.button-export",S(2e3,function(s){return function(s){var a,c;return s.preventDefault(),c=function(e){var r;return i.trackEvent("exporter","export-project","Exported project",1),202===e.status?C():(r=e.data.url,P(r),t.open(r,"_blank"))},a=function(t){var e,i;return T(),e=n.instant("ADMIN.PROJECT_EXPORT.ERROR"),429===t.status?e=n.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY"):(null!=(i=t.data)?i._error_message:void 0)&&(e=n.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY",{message:t.data._error_message})),r.notify("error",e)},w(),e.projects["export"](o.projectId).then(c,a)}}(this)))},{link:o}},I.directive("tgProjectExport",["$window","$tgResources","$tgConfirm","$translate","$tgAnalytics",f]),i=function(t){function e(t,e,r,n,i,o){this.scope=t,this.rootscope=e,this.urls=r,this.confirm=n,this.rs=i,this.translate=o,this._generateUuid=O(this._generateUuid,this),this.setCsvUuid=O(this.setCsvUuid,this),this.rootscope.$on("project:loaded",this.setCsvUuid),this.scope.$watch("csvUuid",function(t){return function(e){return e?t.scope.csvUrl=t.urls.resolveAbsolute(t.type+"-csv",e):t.scope.csvUrl=""}}(this))}return w(e,t),e.$inject=["$scope","$rootScope","$tgUrls","$tgConfirm","$tgResources","$translate"],e.prototype.setCsvUuid=function(){return this.scope.csvUuid=this.scope.project[this.type+"_csv_uuid"]},e.prototype._generateUuid=function(t){var e;return null==t&&(t=null),e=this.rs.projects["regenerate_"+this.type+"_csv_uuid"](this.scope.projectId),e.then(function(t){return function(e){var r;return t.scope.csvUuid=null!=(r=e.data)?r.uuid:void 0}}(this)),e.then(null,function(t){return function(){return t.confirm.notify("error")}}(this)),e["finally"](function(){if(t)return t.finish()}),e},e.prototype.regenerateUuid=function(){var t,e;return this.scope.csvUuid?(e=this.translate.instant("ADMIN.REPORTS.REGENERATE_TITLE"),t=this.translate.instant("ADMIN.REPORTS.REGENERATE_SUBTITLE"),this.confirm.ask(e,t).then(this._generateUuid)):this._generateUuid()},e}(T.Controller),o=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="epics",e}(i),c=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="userstories",e}(i),a=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="tasks",e}(i),s=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="issues",e}(i),I.controller("CsvExporterEpicsController",o),I.controller("CsvExporterUserstoriesController",c),I.controller("CsvExporterTasksController",a),I.controller("CsvExporterIssuesController",s),n=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_EPIC"},{controller:"CsvExporterEpicsController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvEpic",["$translate",n]),p=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_US"},{controller:"CsvExporterUserstoriesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvUs",["$translate",p]),l=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_TASK"},{controller:"CsvExporterTasksController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvTask",["$translate",l]),u=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_ISSUE"},{controller:"CsvExporterIssuesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvIssue",["$translate",u]),d=function(t,e,r,n){var i;return i=function(t,i,o){var s,a,c;return c=function(){return i.find(".size-info").addClass("active")},a=function(r){var o;return o=e.make_model("projects",r.data),t.project=o,i.find(".loading-overlay").removeClass("active"),n.notify("success")},s=function(t){return 413===t.status&&c(),i.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},i.on("click",".js-change-logo",function(){return i.find("#logo-field").click()}),i.on("change","#logo-field",function(e){if(t.logoAttachment)return i.find(".loading-overlay").addClass("active"),r.projects.changeLogo(t.project.id,t.logoAttachment).then(a,s)}),i.on("click","a.js-use-default-logo",function(e){return i.find(".loading-overlay").addClass("active"),r.projects.removeLogo(t.project.id).then(a,s)}),t.$on("$destroy",function(){return i.off()})},{link:i}},I.directive("tgProjectLogo",["$tgAuth","$tgModel","$tgResources","$tgConfirm",d]),g=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgProjectLogoModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},I.directive("tgProjectLogoModel",["$parse",g]),r=function(){return{scope:{project:"="},templateUrl:"admin/admin-project-restrictions.html"}},I.directive("tgAdminProjectRestrictions",[r]),e=function(t){return{link:function(e){return e.requestOwnership=function(){return t.create("tg-lb-request-ownership",{"class":"lightbox lightbox-request-ownership"},{projectId:e.projectId})}},scope:{projectId:"=",owner:"="},templateUrl:"admin/admin-project-request-ownership.html"}},I.directive("tgAdminProjectRequestOwnership",["tgLightboxFactory",e]),t=function(t){return{link:function(e){return e.changeOwner=function(){return t.create("tg-lb-change-owner",{"class":"lightbox lightbox-select-user","project-id":"projectId","active-users":"activeUsers","current-owner-id":"currentOwnerId"},{projectId:e.projectId,activeUsers:e.activeUsers,currentOwnerId:e.owner.id,members:e.members})}},scope:{activeUsers:"=",projectId:"=",owner:"=",members:"="},templateUrl:"admin/admin-project-change-owner.html"}},I.directive("tgAdminProjectChangeOwner",["tgLightboxFactory",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,I,E=function(t,e){function r(){this.constructor=t}for(var n in e)T.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},T={}.hasOwnProperty,C=function(t,e){return function(){return t.apply(e,arguments)}};j=this.taiga,b=this.taiga.mixOf,I=this.taiga.trim,k=this.taiga.toString,y=this.taiga.joinStr,v=this.taiga.groupBy,d=this.taiga.bindOnce,g=this.taiga.debounce,m=this.taiga.getDefaulColorList,S=angular.module("taigaAdmin"),u=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h){var f,d,g;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.appMetaService=u,this.translate=l,this.errorHandlingService=p,this.projectService=h,this.scope.project={},this.loadInitialData(),d=this.translate.instant(this.scope.sectionName),g=this.translate.instant("ADMIN.PROJECT_VALUES.PAGE_TITLE",{sectionName:d,projectName:this.scope.project.name}),f=this.scope.project.description,this.appMetaService.setAll(g,f)}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgErrorHandlingService","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject()},e}(b(j.Controller,j.PageMixin)),S.controller("ProjectValuesSectionController",u),a=function(t){function e(t,e,r,n,i){var o;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.moveValue=C(this.moveValue,this),this.loadValues=C(this.loadValues,this),this.scope.$on("admin:project-values:move",this.moveValue),o=this.scope.$watch("resource",function(t){return function(e){if(e)return t.loadValues(),o()}}(this))}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources"],e.prototype.loadValues=function(){return this.rs[this.scope.resource].listValues(this.scope.projectId,this.scope.type).then(function(t){return function(e){return t.scope.values=e,t.scope.maxValueOrder=_.maxBy(e,"order").order,e}}(this))},e.prototype.moveValue=function(t,e,r){var n,i;return i=this.scope.values,n=i.indexOf(e),i.splice(n,1),i.splice(r,0,e),_.each(i,function(t,e){return t.order=e}),this.repo.saveAll(i)},e}(j.Controller),S.controller("ProjectValuesController",a),c=function(t,e,r,n,i,o,s,a){var c,u,l;return u=function(t,e,r){var n,i,o,s,a,c;return s=null,o=null,i=null,c=e.find(".sortable"),n=dragula([c[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:c[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),n.on("dragend",function(e){var r,n;return i=$(e),n=i.scope().value,r=i.index(),t.$broadcast("admin:project-values:move",n,r)}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&n.dragging}}),t.$on("$destroy",function(){ return e.off(),n.destroy()})},l=function(t,n,i){var c,u,l,p,h,f,d,m,v;return c=n.controller(),v=i.type,f=i.objname,p=function(){return t.newValue={name:"",is_closed:!1,is_archived:!1}},h=function(){return t.addNewElementText=o.instant("ADMIN.PROJECT_VALUES_"+f.toUpperCase()+".ACTION_ADD")},p(),h(),s.$on("$translateChangeEnd",function(){return t.$evalAsync(h)}),l=function(t){return function(t){var e;if(null==t&&(t=!1),e=n.find(".table-main"),$(document.body).scrollTop(e.offset().top+e.height()),t)return n.find(".new-value input:visible").first().focus()}}(this),m=function(t){var r,n,i,o;if(n=t.parents("form"),r=n.checksley(),r.validate())return o=n.scope().value,i=e.save(o),i.then(function(e){return function(){var e;return e=t.parents(".row.table-main"),e.addClass("hidden"),e.siblings(".visualization").removeClass("hidden"),a.fetchProject()}}(this)),i.then(null,function(t){return r.setErrors(t)})},d=function(r){var n,i,o;if(i=r.parents("form"),n=i.checksley(),n.validate())return t.newValue.project=t.project.id,t.newValue.order=t.maxValueOrder?t.maxValueOrder+1:1,o=e.create(v,t.newValue),o.then(function(e){return function(e){return r.addClass("hidden"),t.values.push(e),t.maxValueOrder=e.order,p()}}(this)),o.then(null,function(t){return n.setErrors(t)})},u=function(e){var r,n,i;return n=e.parents(".row.table-main"),r=e.parents("form"),i=r.scope().value,t.$apply(function(){return n.addClass("hidden"),i.revert(),n.siblings(".visualization").removeClass("hidden")})},n.on("click",".show-add-new",function(t){return t.preventDefault(),n.find(".new-value").removeClass("hidden"),l(!0)}),n.on("click",".add-new",g(2e3,function(t){var e;return t.preventDefault(),e=n.find(".new-value"),d(e)})),n.on("click",".delete-new",function(t){return t.preventDefault(),n.find(".new-value").addClass("hidden"),p()}),n.on("click",".edit-value",function(t){var e,r,n;return t.preventDefault(),n=angular.element(t.currentTarget),r=n.parents(".row.table-main"),r.addClass("hidden"),e=r.siblings(".edition"),e.removeClass("hidden"),e.find("input:visible").first().focus().select()}),n.on("keyup",".new-value input",function(t){var e;return 13===t.keyCode?(e=n.find(".new-value"),d(e)):27===t.keyCode?(n.find(".new-value").addClass("hidden"),p()):void 0}),n.on("click",".save",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),m(e)}),n.on("click",".cancel",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),u(e)}),n.on("click",".delete-value",function(n){var i,s,a,u,l,p,h;return n.preventDefault(),u=angular.element(n.currentTarget),s=u.parents("form"),h=s.scope().value,i={},_.each(t.values,function(t){if(h.id!==t.id)return i[t.id]=t.name}),a=h.name,0===_.keys(i).length?r.error(o.instant("ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL")):(p=o.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE"),l=o.instant("ADMIN.PROJECT_VALUES.REPLACEMENT"),r.askChoice(p,a,i,l).then(function(t){var n,i;return i=function(){return c.loadValues()["finally"](function(){return t.finish()})},n=function(){return r.notify("error")},e.remove(h,{moveTo:t.selected}).then(i,n)}))})},c=function(t,e,r){return u(t,e,r),l(t,e,r),t.$on("$destroy",function(){return e.off()})},{link:c}},S.directive("tgProjectValues",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope","tgProjectService",c]),t=function(){var t;return t=function(t,e,r,n){var i;return t.colorList=m(),t.allowEmpty=!1,r.tgAllowEmpty&&(t.allowEmpty=!0),i=e.controller(),t.$watch(r.ngModel,function(e){return t.color=e.color}),e.on("click",".current-color",function(t){var r,n;return t.preventDefault(),t.stopPropagation(),n=angular.element(t.currentTarget),$(".select-color").hide(),n.siblings(".select-color").show(),r=angular.element("body"),r.on("click",function(t){return function(t){if(0===angular.element(t.target).parent(".select-color").length)return e.find(".select-color").hide(),r.unbind("click")}}(this))}),e.on("click",".select-color .color",function(r){var i;return r.preventDefault(),i=angular.element(r.currentTarget),t.$apply(function(){return n.$modelValue.color=i.data("color")}),e.find(".select-color").hide()}),e.on("click",".select-color .selected-color",function(r){return r.preventDefault(),t.$apply(function(){return n.$modelValue.color=t.color}),e.find(".select-color").hide()}),e.on("keyup","input",function(r){return r.stopPropagation(),13===r.keyCode?(t.$apply(function(){return n.$modelValue.color=t.color}),e.find(".select-color").hide()):27===r.keyCode?e.find(".select-color").hide():void 0}),t.$on("$destroy",function(){return e.off()})},{link:t,require:"ngModel"}},S.directive("tgColorSelection",t),p="text",r="multiline",l="richtext",e="date",f="url",h=[{key:p,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:r,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:l,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT"},{key:e,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"},{key:f,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL"}],n=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p,f,d;this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.params=i,this.q=o,this.location=s,this.navUrls=a,this.appMetaService=c,this.translate=u,this.projectService=l,this.moveCustomAttributes=C(this.moveCustomAttributes,this),this.deleteCustomAttribute=C(this.deleteCustomAttribute,this),this.saveCustomAttribute=C(this.saveCustomAttribute,this),this.createCustomAttribute=C(this.createCustomAttribute,this),this.loadCustomAttributes=C(this.loadCustomAttributes,this),this.scope.TYPE_CHOICES=h,this.scope.project=this.projectService.project.toJS(),this.scope.projectId=this.scope.project.id,f=this.translate.instant(this.scope.sectionName),d=this.translate.instant("ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE",{sectionName:f,projectName:this.scope.project.name}),p=this.scope.project.description,this.appMetaService.setAll(d,p),this.scope.init=function(t){return function(e){return t.scope.type=e,t.loadCustomAttributes()}}(this)}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadCustomAttributes=function(){return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then(function(t){return function(e){var r;return t.scope.customAttributes=e,t.scope.maxOrder=null!=(r=_.maxBy(e,"order"))?r.order:void 0,e}}(this))},e.prototype.createCustomAttribute=function(t){return this.repo.create("custom-attributes/"+this.scope.type,t)},e.prototype.saveCustomAttribute=function(t){return this.repo.save(t)},e.prototype.deleteCustomAttribute=function(t){return this.repo.remove(t)},e.prototype.moveCustomAttributes=function(t,e){var r,n;return r=this.scope.customAttributes,n=r.indexOf(t),r.splice(n,1),r.splice(e,0,t),_.each(r,function(t,e){return t.order=e}),this.repo.saveAll(r)},e}(b(j.Controller,j.PageMixin)),S.controller("ProjectCustomAttributesController",n),i=function(t,e,r,n){var i;return i=function(t,r,i){var o,s,a,c,u,l,p,h,f,d,m,v,y,_,b,S,j,k;return o=r.controller(),t.$on("$destroy",function(){return r.off()}),j=r.find(".js-sortable"),l=dragula([j[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:j[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),l.on("dragend",function(t){var e,r,n;return r=$(t),e=r.scope().attr,n=r.index(),o.moveCustomAttributes(e,n)}),b=function(){return r.find(".js-new-custom-field").removeClass("hidden"),r.find(".js-new-custom-field input:visible").first().focus()},f=function(){return r.find(".js-new-custom-field").addClass("hidden")},y=function(){return r.find(".js-add-custom-field-button").removeClass("hidden")},p=function(){return r.find(".js-add-custom-field-button").addClass("hidden")},_=function(){return r.find(".js-cancel-new-custom-field-button").removeClass("hidden")},h=function(){return r.find(".js-cancel-new-custom-field-button").addClass("hidden")},m=function(){return t.newAttr={}},c=function(r){var n,i,s,a;if(i=r.checksley(),i.validate())return a=function(t){return function(){return o.loadCustomAttributes(),f(),m(),e.notify("success")}}(this),s=function(t){return function(t){return i.setErrors(t)}}(this),n=t.newAttr,n.project=t.projectId,n.order=t.maxOrder?t.maxOrder+1:1,o.createCustomAttribute(n).then(a,s)},s=function(){return f(),m()},t.$watch("customAttributes",function(t){if(t)return 0===t.length?(h(),p(),b()):(f(),y(),_())}),r.on("click",".js-add-custom-field-button",function(t){return t.preventDefault(),b()}),r.on("click",".js-create-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),c(e)})),r.on("click",".js-cancel-new-custom-field-button",function(t){return t.preventDefault(),s()}),r.on("keyup",".js-new-custom-field input",function(t){var e,r;return 13===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),c(e)):27===t.keyCode?s():void 0}),S=function(t){return t.find(".js-view-custom-field").addClass("hidden"),t.find(".js-edit-custom-field").removeClass("hidden"),t.find(".js-edit-custom-field input:visible").first().focus().select()},d=function(t){return t.find(".js-edit-custom-field").addClass("hidden"),t.find(".js-view-custom-field").removeClass("hidden")},v=function(e){return t.$apply(function(){return e.scope().attr.revert()})},k=function(t){var r,n,i,s;if(n=t.checksley(),n.validate())return s=function(r){return function(){return o.loadCustomAttributes(),d(t),e.notify("success")}}(this),i=function(t){return function(t){return n.setErrors(t)}}(this),r=t.scope().attr,o.saveCustomAttribute(r).then(s,i)},a=function(t){return d(t),v(t)},r.on("click",".js-edit-custom-field-button",function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),S(e)}),r.on("click",".js-update-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),k(e)})),r.on("click",".js-cancel-edit-custom-field-button",function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),a(e)}),r.on("keyup",".js-edit-custom-field input",function(t){var e,r;return 13===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),k(e)):27===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),a(e)):void 0}),u=function(t){var r,i,s,a;return r=t.scope().attr,i=r.name,a=n.instant("COMMON.CUSTOM_ATTRIBUTES.DELETE"),s=n.instant("COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE"),e.ask(a,s,i).then(function(t){var n,s;return s=function(){return o.loadCustomAttributes()["finally"](function(){return t.finish()})},n=function(){return e.notify("error",null,"We have not been able to delete '"+i+"'.")},o.deleteCustomAttribute(r).then(s,n)})},r.on("click",".js-delete-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),u(e)}))},{link:i}},S.directive("tgProjectCustomAttributes",["$log","$tgConfirm","animationFrame","$translate",i]),o=function(t){function e(t,e,r,n,i,o,s){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.model=o,this.projectService=s,this.mixingClass=C(this.mixingClass,this),this.cancelMixingTags=C(this.cancelMixingTags,this),this.confirmMixingTags=C(this.confirmMixingTags,this),this.toggleMixingFromTags=C(this.toggleMixingFromTags,this),this.startMixingTags=C(this.startMixingTags,this),this.deleteTag=C(this.deleteTag,this),this.editTag=C(this.editTag,this),this.createTag=C(this.createTag,this),this.filterAndSortTags=C(this.filterAndSortTags,this),this.loadTags=C(this.loadTags,this),this.loading=!0,this.loadTags()}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$tgModel","tgProjectService"],e.prototype.loadTags=function(){var t;return t=this.projectService.project.toJS(),this.rs.projects.tagsColors(t.id).then(function(t){return function(e){return t.scope.projectTagsAll=_.map(e.getAttrs(),function(e,r){return t.model.make_model("tag",{name:r,color:e})}),t.filterAndSortTags(),t.loading=!1}}(this))},e.prototype.filterAndSortTags=function(){return this.scope.projectTags=_.sortBy(this.scope.projectTagsAll,function(t){return t.name.toLowerCase()}),this.scope.projectTags=_.filter(this.scope.projectTags,function(t){return function(e){return e.name.indexOf(t.scope.tagsFilter.name)!==-1}}(this))},e.prototype.createTag=function(t,e){return this.rs.projects.createTag(this.scope.projectId,t,e)},e.prototype.editTag=function(t,e,r){return t===e&&(e=null),this.rs.projects.editTag(this.scope.projectId,t,e,r)},e.prototype.deleteTag=function(t){return this.scope.loadingDelete=!0,this.rs.projects.deleteTag(this.scope.projectId,t)["finally"](function(t){return function(){return t.scope.loadingDelete=!1}}(this))},e.prototype.startMixingTags=function(t){return this.scope.mixingTags.toTag=t.name},e.prototype.toggleMixingFromTags=function(t){var e;if(t.name!==this.scope.mixingTags.toTag)return e=this.scope.mixingTags.fromTags.indexOf(t.name),e===-1?this.scope.mixingTags.fromTags.push(t.name):this.scope.mixingTags.fromTags.splice(e,1)},e.prototype.confirmMixingTags=function(){var t,e;return e=this.scope.mixingTags.toTag,t=this.scope.mixingTags.fromTags,this.scope.loadingMixing=!0,this.rs.projects.mixTags(this.scope.projectId,e,t).then(function(t){return function(){return t.cancelMixingTags(),t.loadTags()}}(this))["finally"](function(t){return function(){return t.scope.loadingMixing=!1}}(this))},e.prototype.cancelMixingTags=function(){return this.scope.mixingTags.toTag=null,this.scope.mixingTags.fromTags=[]},e.prototype.mixingClass=function(t){if(null!==this.scope.mixingTags.toTag){if(t.name===this.scope.mixingTags.toTag)return"mixing-tags-to";if(this.scope.mixingTags.fromTags.indexOf(t.name)!==-1)return"mixing-tags-from"}},e}(j.Controller),S.controller("ProjectTagsController",o),s=function(t,e,r,n,i,o,s){var a;return a=function(t,e,n){var i,a,c,u,l,p,h,f,d,m,v,y;return a=$(window),i=e.controller(),y=n.type,d=n.objname,p=function(){return t.newValue={tag:"",color:""}},h=function(){return t.tagsFilter={name:""}},l=function(){return t.mixingTags={toTag:null,fromTags:[]}},f=function(){return t.addNewElementText=o.instant("ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD")},p(),h(),l(),f(),s.$on("$translateChangeEnd",function(){return t.$evalAsync(f)}),u=function(t){return function(t){var r;if(null==t&&(t=!1),r=e.find(".table-main"),$(document.body).scrollTop(r.offset().top+r.height()),t)return e.find(".new-value input:visible").first().focus()}}(this),v=function(e){return function(e){var r,n,o,s,a;if(n=e.parents("form"),r=n.checksley(),r.validate())return a=n.scope().tag,o=a.clone(),o.revert(),t.loadingEdit=!0,s=i.editTag(o.name,a.name,a.color),s.then(function(){return i.loadTags().then(function(){var r;return r=e.parents(".row.table-main"),r.addClass("hidden"),t.loadingEdit=!1,r.siblings(".visualization").removeClass("hidden")})}),s.then(null,function(e){return t.loadingEdit=!1,r.setErrors(e.data)})}}(this),m=function(e){return function(e){var r,n,o;if(n=e.parents("form"),n=e,r=n.checksley(),r.validate())return t.loadingCreate=!0,o=i.createTag(t.newValue.tag,t.newValue.color),o.then(function(r){return i.loadTags().then(function(){return t.loadingCreate=!1,e.addClass("hidden"),p()})}),o.then(null,function(e){return t.loadingCreate=!1,r.setErrors(e.data)})}}(this),c=function(e){var r,n,i;return n=e.parents(".row.table-main"),r=e.parents("form"),i=r.scope().tag,t.$apply(function(){return n.addClass("hidden"),i.revert(),n.siblings(".visualization").removeClass("hidden")})},t.$watch("tagsFilter.name",function(t){return i.filterAndSortTags()}),a.on("keyup",function(e){if(27===e.keyCode)return t.$apply(function(){return l()})}),e.on("click",".show-add-new",function(t){return t.preventDefault(),e.find(".new-value").removeClass("hidden")}),e.on("click",".add-new",g(2e3,function(t){var r;return t.preventDefault(),r=e.find(".new-value"),m(r)})),e.on("click",".delete-new",function(t){return t.preventDefault(),e.find(".new-value").addClass("hidden"),p()}),e.on("click",".mix-tags",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return i.startMixingTags(r.parents("form").scope().tag)})}),e.on("click",".mixing-row",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return i.toggleMixingFromTags(r.parents("form").scope().tag)})}),e.on("click",".mixing-confirm",function(e){return e.preventDefault(),e.stopPropagation(),t.$apply(function(){return i.confirmMixingTags()})}),e.on("click",".mixing-cancel",function(e){return e.preventDefault(),e.stopPropagation(),t.$apply(function(){return i.cancelMixingTags()})}),e.on("click",".edit-value",function(t){var e,r,n;return t.preventDefault(),n=angular.element(t.currentTarget),r=n.parents(".row.table-main"),r.addClass("hidden"),e=r.siblings(".edition"),e.removeClass("hidden"),e.find("input:visible").first().focus().select()}),e.on("keyup",".new-value input",function(t){var r;return 13===t.keyCode?(r=e.find(".new-value"),m(r)):27===t.keyCode?(e.find(".new-value").addClass("hidden"),p()):void 0}),e.on("keyup",".status-name input",function(t){var e;return e=angular.element(t.currentTarget),13===t.keyCode?v(e):27===t.keyCode?c(e):void 0}),e.on("click",".save",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),v(e)}),e.on("click",".cancel",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),c(e)}),e.on("click",".delete-tag",function(t){var e,n,s,a;return t.preventDefault(),s=angular.element(t.currentTarget),e=s.parents("form"),n=e.scope().tag,a=o.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_TAG"),r.askOnDelete(a,n.name).then(function(t){var e,o;return o=function(){return i.loadTags()["finally"](function(){return t.finish()})},e=function(){return r.notify("error")},i.deleteTag(n.name).then(o,e)})}),t.$on("$destroy",function(){return e.off(),a.off()})},{link:a}},S.directive("tgProjectTags",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope",s])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){return function(){return t.apply(e,arguments)}},h=function(t,e){function r(){this.constructor=t}for(var n in e)f.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},f={}.hasOwnProperty,d=[].indexOf||function(t){for(var e=0,r=this.length;e
    \n
    \n
    <%- category.activePermissions %>/<%- category.permissions.length %>
    \n <% _.each(category.permissions, function(permission) { %>\n
    \n <% }) %>\n
    \n'),o=_.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
    '),i=_.template('
    '),a=function(a,u,l){var p,h,f,g,m;return p=u.controller(),h=function(t){var e,r,n,i,o,s,c,u,l,p;return s=function(e){return _.map(e,function(e){var r;return _.extend({},e,{active:(r=e.key,d.call(t.permissions,r)>=0)})})},n=function(t,e,r){return!(e.external_user&&!r.is_private&&0===t.key.indexOf("view_"))},c=function(e){return _.map(e,function(e){return e.permissions=e.permissions.map(function(e){return e.editable=n(e,t,a.project),e}),_.extend({},e,{activePermissions:_.filter(e.permissions,"active").length})})},e=[],r=[{key:"view_epics",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS"},{key:"add_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS"},{key:"modify_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS"},{key:"comment_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS"},{key:"delete_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME",permissions:s(r)}),o=[{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"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME",permissions:s(o)}),l=[{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:"comment_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_USER_STORIES"},{key:"delete_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME",permissions:s(l)}),u=[{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:"comment_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_TASKS"},{key:"delete_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME",permissions:s(u)}),i=[{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:"comment_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_ISSUES"},{key:"delete_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME",permissions:s(i)}),p=[{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"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME",permissions:s(p)}),c(e)},m=function(t,e){return t.find(".resume").html(n(c({category:e}))(a))},f=function(t,e){var r;return r=o({category:t,index:e}),r=angular.element(r),m(r,t),n(r)(a)},g=function(){var n;return u.off(),n=i(),_.each(h(a.role),function(t,e){return n=angular.element(n).append(f(t,e))}),u.html(n),u.on("click",".resume",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),e.toggleClass("open-drawer"),e.next().toggleClass("open")}),u.on("change",".category-item input",function(n){var i,o,s,c;return i=function(){var t;return t=_.filter(u.find(".category-item input"),function(t){return angular.element(t).is(":checked")}),t=_.sortBy(_.map(t,function(t){var e;return e=angular.element(t).parents(".category-item").data("id")})),t.length&&t.push("view_project"),t},c=angular.element(n.currentTarget),a.role.permissions=i(),s=function(){var e,n;return e=h(a.role),n=c.parents(".category-config").data("id"),m(c.parents(".category-config"),e[n]),t.$broadcast("projects:reload"),r.notify("success"),p.forceLoadProject()},o=function(){return r.notify("error"),c.prop("checked",!c.prop("checked")),a.role.permissions=i()},a.role.external_user?(a.project.public_permissions=a.role.permissions,a.project.anon_permissions=a.role.permissions.filter(function(t){return 0===t.indexOf("view_")}),e.save(a.project).then(s,o)):e.save(a.role).then(s,o)})},a.$on("$destroy",function(){return u.off()}),a.$on("role:changed",function(){return g()}),s(a,l.ngModel,g)},{link:a}},u.directive("tgRolePermissions",["$rootScope","$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b=function(t,e){function r(){this.constructor=t}for(var n in e)S.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},S={}.hasOwnProperty;v=this.taiga,g=this.taiga.mixOf,f=this.taiga.bindMethods,d=this.taiga.debounce,y=this.taiga.timeout,m=angular.module("taigaAdmin"),h=function(t){function e(t,e,r,n,i,o,s,a,c,u){var l;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.location=i,this.navUrls=o,this.appMetaService=s,this.translate=a,this.errorHandlingService=c,this.projectService=u,f(this),this.scope.sectionName="ADMIN.WEBHOOKS.SECTION_NAME",this.scope.project={},l=this.loadInitialData(),l.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.WEBHOOKS.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),l.then(null,this.onInitialDataError.bind(this)), this.scope.$on("webhooks:reload",this.loadWebhooks)}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgErrorHandlingService","tgProjectService"],e.prototype.loadWebhooks=function(){return this.rs.webhooks.list(this.scope.projectId).then(function(t){return function(e){return t.scope.webhooks=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadWebhooks()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("WebhooksController",h),p=function(t,e,r,n,i){var o;return o=function(n,o,s){var a,c,u,l,p,h,f,g;return g=n.$eval(s.tgWebhook),h=function(){var e;return e=i.instant("ADMIN.WEBHOOKS.DATE"),t.webhooklogs.list(g.id).then(function(t){return function(t){var r,n,i,o;for(r=0,n=t.length;r=1)return a.addClass("hidden")})}),s.on("click",function(t){return a.removeClass("hidden"),a.find("input")[0].focus()})},{link:o}},m.directive("tgNewWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",c]),r=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GITHUB.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GITHUB.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"github").then(function(t){return function(e){return t.scope.github=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("GithubController",r),i=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GITLAB.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GITLAB.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(t){return function(){return t.loadModules()}}(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gitlab").then(function(t){return function(e){return t.scope.gitlab=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("GitlabController",i),t=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.BITBUCKET.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.BITBUCKET.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(t){return function(){return t.loadModules()}}(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"bitbucket").then(function(t){return function(e){return t.scope.bitbucket=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("BitbucketController",t),u=function(){var t;return t=function(t,e,r){return e.on("click",".select-input-content",function(){return e.find("input").select(),e.find(".help-copy").addClass("visible")})},{link:t}},m.directive("tgSelectInputText",u),n=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.github,"github"),c.then(function(){return n.trackEvent("github-webhook","created-or-changed","Create or changed github webhook",1),s.finish(),e.notify("success")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgGithubWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",n]),o=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.gitlab,"gitlab"),c.then(function(){return n.trackEvent("gitlab-webhook","created-or-changed","Create or changed gitlab webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgGitlabWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",o]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.bitbucket,"bitbucket"),c.then(function(){return n.trackEvent("bitbucket-webhook","created-or-changed","Create or changed bitbucket webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgBitbucketWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",e]),l=function(){var t;return t=function(t,e,r,n){return n.$parsers.push(function(t){return t=$.trim(t),""===t?[]:t.split(",")})},{link:t,restrict:"EA",require:"ngModel"}},m.directive("tgValidOriginIps",l),s=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GOGS.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GOGS.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gogs").then(function(t){return function(e){return t.scope.gogs=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),a=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.gogs,"gogs"),c.then(function(){return n.trackEvent("gogs-webhook","create-or-change","Create or change gogs webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c),o.on("click",".submit-button",c)},{link:i}},m.controller("GogsController",s),m.directive("tgGogsWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",a])}.call(this),function(){var t,e,r,n,i,o;i=this.taiga,e=this.taiga.bindOnce,o=this.taiga.timeout,r=this.taiga.debounce,n=angular.module("taigaProject"),t=function(t,e,r,n,i,o,s,a,c,u){var l;return l=function(r,l,p){var h,f;return h=null,r.$on("deletelightbox:new",function(t,e){return s.open(l),h=e}),r.$on("$destroy",function(){return l.off()}),f=function(){var r;return a.start(),s.close(l),r=t.remove(h),r.then(function(t){return u.trackEvent("projects","delete","Delete project",1),a.pageLoaded(),e.$broadcast("projects:reload"),n.path(i.resolve("home")),o.notify("success"),c.loadProjects()}),r.then(null,function(){return o.notify("error"),s.close(l)})},l.on("click",".button-red",function(t){return t.preventDefault(),s.close(l)}),l.on("click",".button-green",function(t){return t.preventDefault(),f()})},{link:l}},n.directive("tgLbDeleteProject",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","$tgConfirm","lightboxService","tgLoader","tgCurrentUserService","$tgAnalytics",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l;u=this.taiga.bindOnce,r=function(){var t;return t=function(t,e,r){return u(t,r.tgBoBind,function(t){return e.text(t)})},{link:t}},i=function(){var t;return t=function(t,e,r){return u(t,r.tgBoHtml,function(t){return e.html(t)})},{link:t}},o=function(){var t;return t=function(t,e,r){return u(t,r.tgBoRef,function(t){return e.html("#"+t+" ")})},{link:t}},s=function(){var t;return t=function(t,e,r){return u(t,r.tgBoSrc,function(t){return e.attr("src",t)})},{link:t}},n=function(){var t;return t=function(t,e,r){return u(t,r.tgBoHref,function(t){return e.attr("href",t)})},{link:t}},e=function(){var t;return t=function(t,e,r){return u(t,r.tgBoAlt,function(t){return e.attr("alt",t)})},{link:t}},a=function(){var t;return t=function(t,e,r){return u(t,r.tgBoTitle,function(t){return e.attr("title",t)})},{link:t}},c=function(){var t;return t=function(t,e,r){return t.$watch(r.tgTitleHtml,function(t){if(null!=t)return e.attr("title",t)})},{link:t}},t=function(){var t;return t=function(t,e,r){return t.$watch(r.tgBindHtml,function(t){if(null!=t)return e.html(t)})},{link:t}},l=angular.module("taigaBase"),l.directive("tgBoBind",r),l.directive("tgBoHtml",i),l.directive("tgBoRef",o),l.directive("tgBoSrc",s),l.directive("tgBoHref",n),l.directive("tgBoAlt",e),l.directive("tgBoTitle",a),l.directive("tgBindTitle",c),l.directive("tgBindHtml",t)}.call(this),function(){var t,e;t=function(){function t(){this.config=window.taigaConfig}return t.prototype.get=function(t,e){return null==e&&(e=null),_.has(this.config,t)?this.config[t]:e},t}(),e=angular.module("taigaBase"),e.service("$tgConfig",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=angular.module("taigaBase"),t=function(t){function e(t,e,r,n,i,o,s){this.rootScope=t,this.scope=e,this.params=r,this.repo=n,this.rs=i,this.confirm=o,this.projectService=s,this.scope.currentPlugin=_.head(_.filter(this.rootScope.adminPlugins,{slug:this.params.plugin})),this.scope.projectSlug=this.params.pslug,this.loadInitialData()}return n(e,t),e.$inject=["$rootScope","$scope","$routeParams","$tgRepo","$tgResources","$tgConfirm","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.$broadcast("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject()},e}(taiga.Controller),r.controller("ContribController",t),e=function(t){function e(t,e,r){this.rootScope=t,this.scope=e,this.params=r,this.scope.currentPlugin=_.head(_.filter(this.rootScope.userSettingsPlugins,{slug:this.params.plugin}))}return n(e,t),e.$inject=["$rootScope","$scope","$routeParams"],e}(taiga.Controller),r.controller("ContribUserSettingsController",e)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function e(t,e){this.storage=t,this.params=e}return r(e,t),e.$inject=["$tgStorage","$routeParams"],e.prototype.generateHash=function(t){return null==t&&(t=[]),t=_.map(t,function(t){return JSON.stringify(t)}),hex_sha1(t.join(":"))},e}(e.Service)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,t=function(t){function e(t,r,n,i,o,s){this.http=t,this.q=r,this.storage=n,this.rootScope=i,this.cacheFactory=o,this.translate=s,e.__super__.constructor.call(this),this.cache=this.cacheFactory("httpget")}return n(e,t),e.$inject=["$http","$q","$tgStorage","$rootScope","$cacheFactory","$translate"],e.prototype.headers=function(){var t,e,r;return t={},r=this.storage.get("token"),r&&(t.Authorization="Bearer "+r),e=this.translate.preferredLanguage(),e&&(t["Accept-Language"]=e),t},e.prototype.request=function(t){return t.headers=_.assign({},t.headers||{},this.headers()),this.http(t)},e.prototype.get=function(t,e,r){return r=_.assign({method:"GET",url:t},r),e&&(r.params=e),r.cache=this.cache,this.request(r)["finally"](function(t){return function(e){return t.cache.removeAll()}}(this))},e.prototype.post=function(t,e,r,n){return n=_.assign({method:"POST",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype.put=function(t,e,r,n){return n=_.assign({method:"PUT",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype.patch=function(t,e,r,n){return n=_.assign({method:"PATCH",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype["delete"]=function(t,e,r,n){return n=_.assign({method:"DELETE",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e}(r.Service),e=angular.module("taigaBase"),e.service("$tgHttp",t)}.call(this),function(){var t,e;t=function(t,e,r){return t.noreload=function(r){var n,i;return n=e.current,i=r.$on("$locationChangeSuccess",function(){return e.current=n,i()}),t},t.isInCurrentRouteParams=function(e,r){var n;return n=t.search()||{},n[e]===r},t},e=angular.module("taigaBase"),e.factory("$tgLocation",["$location","$route","$rootScope",t])}.call(this),function(){var t,e,r,n,i,o=[].indexOf||function(t){for(var e=0,r=this.length;ef?(p=a.instant("PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED",{fileName:e.name,fileSize:r(e.size),maxFileSize:r(f)}),d={status:413,data:{_error_message:p}},l.reject(d),l.promise):(v=function(t){return function(t){var e,i;return i=Math.round(t.loaded/t.total*100),e=a.instant("PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE",{uploadedSize:r(t.loaded),totalSize:r(t.total)}),n("in-progress",null,e,i)}}(this),g=function(t){return function(t){return n("done",a.instant("PROJECT.IMPORT.TITLE"),a.instant("PROJECT.IMPORT.DESCRIPTION"))}}(this),m=function(t){return function(t){return n("error")}}(this),c=function(t){return function(t){var e;d={};try{d.data=JSON.parse(t.target.responseText)}catch(r){d.data={}}return d.status=t.target.status,t.target.getResponseHeader("Taiga-Info-Project-Is-Private")&&(d.headers={isPrivate:"True"===t.target.getResponseHeader("Taiga-Info-Project-Is-Private"),memberships:parseInt(t.target.getResponseHeader("Taiga-Info-Project-Memberships"))}),201!==(e=d.status)&&202!==e||l.resolve(d),l.reject(d)}}(this),h=function(t){return function(t){return l.reject("fail")}}(this),u=new FormData,u.append("dump",e),y=new XMLHttpRequest,y.upload.addEventListener("progress",v,!1),y.upload.addEventListener("load",g,!1),y.upload.addEventListener("error",m,!1),y.upload.addEventListener("abort",m,!1),y.addEventListener("load",c,!1),y.addEventListener("error",h,!1),y.open("POST",i.resolve("importer")),y.setRequestHeader("Authorization","Bearer "+o.getToken()),y.setRequestHeader("Accept","application/json"),y.send(u),l.promise)},c.changeLogo=function(e,o){var a,c,u,l,p,h;return u=t.get("maxUploadFileSize",null),u&&o.size>u?(p={status:413,data:{_error_message:"'"+o.name+"' ("+r(o.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(u)+")"}},c=s.defer(),c.reject(p),c.promise):(a=new FormData,a.append("logo",o),l={transformRequest:angular.identity,headers:{"Content-Type":void 0}},h=i.resolve("projects")+"/"+e+"/change_logo",n.post(h,a,{},l))},c.removeLogo=function(t){var e;return e=i.resolve("projects")+"/"+t+"/remove_logo",n.post(e)},function(t){return t.projects=c}},t=angular.module("taigaResources"),t.factory("$tgProjectsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$tgAuth","$q","$translate",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("roles",e)},n.list=function(e){return t.queryMany("roles",{project:e})},function(t){return t.roles=n}},t=angular.module("taigaResources"),t.factory("$tgRolesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r,n){var i;return i={},i["do"]=function(t,i){var o,s,a,c;return o=n.defer(),c=e.resolve("search"),s={url:c,method:"GET",timeout:o.promise,cancelable:!0,params:{project:t,text:i,get_all:!1}},a=r.request(s).then(function(t){return t.data}),a.abort=function(){return o.resolve()},a["finally"]=function(){return a.abort=angular.noop,o=a=null},a},function(t){return t.search=i}},t=angular.module("taigaResources"),t.factory("$tgSearchResourcesProvider",["$tgRepo","$tgUrls","$tgHttp","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(t,e,r){var n;return n={},n.get=function(r,n){return t.queryOne("milestones",n).then(function(t){var r;return r=t.user_stories,r=_.map(r,function(t){return e.make_model("userstories",t)}),t._attrs.user_stories=r,t})},n.stats=function(e,r){return t.queryOneRaw("milestones",r+"/stats")},n.list=function(r,n){var i;return i={project:r},i=_.extend({},i,n||{}),t.queryMany("milestones",i,{},!0).then(function(t){return function(t){var r,n,i,o,s,a;for(s=t[0],r=t[1],n=0,i=s.length;nc?(l={status:413,data:{_error_message:"'"+e.name+"' ("+r(e.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(c)+")"}},a=o.defer(),a.reject(l),a.promise):(s=new FormData,s.append("avatar",e),u={transformRequest:angular.identity,headers:{"Content-Type":void 0}},p=i.resolve("users")+"/change_avatar",n.post(p,s,{},u))},s.removeAvatar=function(){var t;return t=i.resolve("users")+"/remove_avatar",n.post(t)},s.changePassword=function(t,e){var r,o;return o=i.resolve("users")+"/change_password",r={current_password:t,password:e},n.post(o,r)},function(t){return t.userSettings=s}},t=angular.module("taigaResources"),t.factory("$tgUserSettingsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t,e){var r;return r={},r.contacts=function(r,n){var i,o;return null==n&&(n={}),o=e.resolve("user-contacts",r),i={headers:{}},n.enablePagination||(i.headers["x-disable-pagination"]="1"),t.get(o,{},i).then(function(t){return t.data})},function(t){return t.users=r}},t=angular.module("taigaResources"),t.factory("$tgUsersResourcesProvider",["$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e,r,n,i,o){var s,a;return a={},s="userstories-queryparams",a.get=function(t,r,n){var i;return i=a.getQueryParams(t),i.project=t,i=_.extend({},i,n),e.queryOne("userstories",r,i)},a.getByRef=function(t,r,n){var i;return null==n&&(n={}),i=a.getQueryParams(t),i.project=t,i.ref=r,i=_.extend({},i,n),e.queryOne("userstories","by_ref",i)},a.listInAllProjects=function(t){return e.queryMany("userstories",t)},a.filtersData=function(t){return e.queryOneRaw("userstories-filters",null,t)},a.listUnassigned=function(t,r,n){var i;return i={project:t,milestone:"null"},i=_.extend({},i,r||{}),a.storeQueryParams(t,i),e.queryMany("userstories",_.extend(i,{page_size:n}),{enablePagination:!0},!0)},a.listAll=function(t,r){var n;return n={project:t},n=_.extend({},n,r||{}),a.storeQueryParams(t,n),e.queryMany("userstories",n)},a.bulkCreate=function(t,e,i){var o,s;return o={project_id:t,status_id:e,bulk_stories:i},s=n.resolve("bulk-create-us"),r.post(s,o)},a.upvote=function(t){var e;return e=n.resolve("userstory-upvote",t),r.post(e)},a.downvote=function(t){var e;return e=n.resolve("userstory-downvote",t),r.post(e)},a.watch=function(t){var e;return e=n.resolve("userstory-watch",t),r.post(e)},a.unwatch=function(t){var e;return e=n.resolve("userstory-unwatch",t),r.post(e)},a.bulkUpdateBacklogOrder=function(t,e){var i,o;return o=n.resolve("bulk-update-us-backlog-order"),i={project_id:t,bulk_stories:e},r.post(o,i)},a.bulkUpdateMilestone=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-milestone"),o={project_id:t,milestone_id:e,bulk_stories:i},r.post(s,o)},a.bulkUpdateKanbanOrder=function(t,e){var i,o;return o=n.resolve("bulk-update-us-kanban-order"),i={project_id:t,bulk_stories:e},r.post(o,i)},a.listValues=function(t,r){var n;return n={project:t},a.storeQueryParams(t,n),e.queryMany(r,n)},a.storeQueryParams=function(e,r){var n,o;return o=e+":"+s,n=t([e,o]),i.set(n,r)},a.getQueryParams=function(e){var r,n;return n=e+":"+s,r=t([e,n]),i.get(r)||{}},a.storeShowTags=function(e,r){var n;return n=t([e,"showTags"]),i.set(n,r)},a.getShowTags=function(e){var r;return r=t([e,"showTags"]),i.get(r)||null},function(t){return t.userstories=a}},e=angular.module("taigaResources"),e.factory("$tgUserstoriesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",r])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={webhook:e},t.queryMany("webhooklogs",r)},n.resend=function(t){var n;return n=e.resolve("webhooklogs-resend",t),r.post(n)},function(t){return t.webhooklogs=n}},t=angular.module("taigaResources"),t.factory("$tgWebhookLogsResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={project:e},t.queryMany("webhooks",r)},n.test=function(t){var n;return n=e.resolve("webhooks-test",t),r.post(n)},function(t){return t.webhooks=n}},t=angular.module("taigaResources"),t.factory("$tgWebhooksResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("wiki",e)},n.getBySlug=function(e,r){return t.queryOne("wiki","by_slug?project="+e+"&slug="+r)},n.list=function(e){return t.queryMany("wiki",{project:e})},n.listLinks=function(e){return t.queryMany("wiki-links",{project:e})},function(t){return t.wiki=n}},t=angular.module("taigaResources"),t.factory("$tgWikiResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.debounce,i=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.translate=l,this.scope.sectionName=this.translate.instant("CHANGE_PASSWORD.SECTION_NAME"),this.scope.user=this.auth.getUser()}return s(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],e}(n(o.Controller,o.PageMixin)),i.controller("UserChangePasswordController",t),e=function(t,e,n,i){var o;return o=function(o,s,a,c){var u,l,p;return u=new checksley.Form(s.find("form")),l=r(2e3,function(r){return function(r){var s,a;if(r.preventDefault(),u.validate())return o.newPassword1!==o.newPassword2?void e.notify("error",i.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH")):(s=n().target(p).start(),a=t.userSettings.changePassword(o.currentPassword,o.newPassword1),a.then(function(){return s.finish(),e.notify("success")}),a.then(null,function(t){return s.finish(),e.notify("error",t.data._error_message)}))}}(this)),p=s.find(".submit-button"),s.on("submit","form",l),o.$on("$destroy",function(){return s.off()})},{link:o}},i.directive("tgUserChangePassword",["$tgResources","$tgConfirm","$tgLoading","$translate",e])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaUserSettings"),t=function(t,e,n,i,o,s,a){var c;return c=function(e,c,u){var l,p;return e.$on("deletelightbox:new",function(t,e){return s.open(c)}),e.$on("$destroy",function(){return c.off()}),l=function(){var r,u;return r=a().target(p).start(),u=t.remove(e.user),u.then(function(t){return r.finish(),s.close(c),n.logout(),i.path(o.resolve("login"))}),u.then(null,function(){return r.finish(),console.log("FAIL")})},c.on("click",".button-green",function(t){return t.preventDefault(),s.close(c)}),c.on("click",".button-red",r(2e3,function(t){return t.preventDefault(),l()})),p=c.find(".button-red")},{link:c,templateUrl:"user/lightbox/lightbox-delete-account.html"}},n.directive("tgLbDeleteUser",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","lightboxService","$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){function r(){this.constructor=t}for(var n in e)l.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},l={}.hasOwnProperty;c=this.taiga,o=this.taiga.mixOf,a=this.taiga.sizeFormat,s=angular.module("taigaUserSettings"),i=this.taiga.debounce,n=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f){var d,g,m;this.scope=t,this.rootscope=e,this.config=r,this.repo=n,this.confirm=i,this.rs=o,this.params=s,this.q=c,this.location=u,this.navUrls=l,this.auth=p,this.translate=h,this.errorHandlingService=f,this.scope.sectionName="USER_SETTINGS.MENU.SECTION_TITLE",this.scope.project={},this.scope.user=this.auth.getUser(),this.scope.user||this.errorHandlingService.permissionDenied(),this.scope.lang=this.getLan(),this.scope.theme=this.getTheme(),d=this.config.get("maxUploadFileSize",null),d&&(m=this.translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE",{maxFileSize:a(d)}),this.scope.maxFileSizeMsg=m),g=this.loadInitialData(),g.then(null,this.onInitialDataError.bind(this))}return u(e,t),e.$inject=["$scope","$rootScope","$tgConfig","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.scope.availableThemes=this.config.get("themes",[]),this.rs.locales.list().then(function(t){return function(e){return t.scope.locales=e,e}}(this))},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.user)},e.prototype.getLan=function(){return this.scope.user.lang||this.translate.preferredLanguage()},e.prototype.getTheme=function(){return this.scope.user.theme||this.config.get("defaultTheme")||"taiga"},e}(o(c.Controller,c.PageMixin)),s.controller("UserSettingsController",n),r=function(t,e,r,n){var o;return o=function(o,s,a){var c;return c=i(2e3,function(i){return function(i){var a,c,u,l;if(i.preventDefault(),c=s.find("form").checksley(),c.validate())return a=o.user.isAttributeModified("email"),o.user.lang=o.lang,o.user.theme=o.theme,l=function(r){var i;return e.setUser(r),a?(i=n.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS"),t.success(i)):t.notify("success")},u=function(e){return c.setErrors(e),t.notify("error",e._error_message)},r.save(o.user).then(l,u)}}(this)),s.on("submit","form",c),o.$on("$destroy",function(){return s.off()})},{link:o}},s.directive("tgUserProfile",["$tgConfirm","$tgAuth","$tgRepo","$translate",r]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return u=function(){return o.find(".size-info").removeClass("hidden")},c=function(r){var s;return s=e.make_model("users",r.data),t.setUser(s),i.user=s,o.find(".loading-overlay").removeClass("active"),n.notify("success")},a=function(t){return 413===t.status&&u(),o.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},o.on("click",".js-change-avatar",function(){return o.find("#avatar-field").click()}),o.on("change","#avatar-field",function(t){if(i.avatarAttachment)return o.find(".loading-overlay").addClass("active"),r.userSettings.changeAvatar(i.avatarAttachment).then(c,a)}),o.on("click","a.js-use-gravatar",function(t){return o.find(".loading-overlay").addClass("active"),r.userSettings.removeAvatar().then(c,a)}),i.$on("$destroy",function(){return o.off()})},{link:i}},s.directive("tgUserAvatar",["$tgAuth","$tgModel","$tgResources","$tgConfirm",e]),t=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgAvatarModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},s.directive("tgAvatarModel",["$parse",t])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgUserSettingsNavigation,e.find(".active").removeClass("active"),e.find("#usersettingsmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaUserSettings"),e.directive("tgUserSettingsNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a=function(t,e){function r(){this.constructor=t}for(var n in e)c.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=this.taiga,i=this.taiga.mixOf,n=this.taiga.bindOnce,o=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.errorHandlingService=l,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.SECTION_NAME",this.scope.user=this.auth.getUser(),p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return a(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(t){return function(e){return t.scope.notifyPolicies=e,e}}(this))},e}(i(s.Controller,s.PageMixin)),o.controller("UserNotificationsController",t),e=function(){var t;return t=function(t,e,r){return t.$on("$destroy",function(){return e.off()})},{link:t}},o.directive("tgUserNotifications",e),r=function(t,e,r){var i,o;return o=_.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<% }) %>'),i=function(i,s,a){var c;return c=function(){var n,a;return s.off(),n={notifyPolicies:i.notifyPolicies},a=o(n),s.html(r(a)(i)),s.on("change","input[type=radio]",function(r){var n,o,s,a,c,u;return u=angular.element(r.currentTarget),a=u.parents(".policy-table-row").data("index"),s=i.notifyPolicies[a],c=s.notify_level,s.notify_level=parseInt(u.val(),10),o=function(){return e.notify("success")},n=function(){return e.notify("error"),u.parents(".policy-table-row").find("input[value="+c+"]").prop("checked",!0)},t.save(s).then(o,n)})},i.$on("$destroy",function(){return s.off()}),n(i,a.ngModel,c)},{link:i}},o.directive("tgUserNotificationsList",["$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){angular.module("taigaComponents",[])}.call(this),function(){var t;t=angular.module("taigaDiscover",[])}.call(this),function(){var t;t=angular.module("taigaExternalApps",[])}.call(this),function(){angular.module("taigaHistory",[])}.call(this),function(){var t;t=angular.module("taigaHome",[])}.call(this),function(){angular.module("taigaNavigationBar",[])}.call(this),function(){var t;t=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 t;t=angular.module("taigaUtils",[])}.call(this),function(){angular.module("taigaWikiHistory",[])}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{templateUrl:"components/assigned-to/assigned-item/assigned-item.html",scope:{member:"="},link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedItem",t)}.call(this), -function(){var t;t=function(){function t(){this.assigned&&this._getAssignedMember(),this._filterAssignedMember()}return t.$inject=[],t.prototype._getAssignedMember=function(){return this.assignedMember=_.filter(this.project.members,function(t){return function(e){return e.id===t.assigned.get("id")}}(this))},t.prototype._filterAssignedMember=function(){return this.assigned?this.nonAssignedMembers=_.filter(this.project.members,function(t){return function(e){return e.id!==t.assigned.get("id")}}(this)):this.nonAssignedMembers=this.project.members},t}(),angular.module("taigaComponents").controller("AssignedToSelectorCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToSelectorCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to-selector/assigned-to-selector.html",scope:{assigned:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToSelector",t)}.call(this),function(){var t;t=function(){function t(t,e){this.lightboxFactory=t,this.lightboxService=e,this.has_permissions=_.includes(this.project.my_permissions,"modify_epic")}return t.$inject=["tgLightboxFactory","lightboxService"],t.prototype._closeAndRemoveAssigned=function(){return this.lightboxService.closeAll(),this.onRemoveAssigned()},t.prototype._closeAndAssign=function(t){return this.lightboxService.closeAll(),this.onAssignTo({member:t})},t.prototype.onSelectAssignedTo=function(t,e){return this.lightboxFactory.create("tg-assigned-to-selector",{"class":"lightbox lightbox-assigned-to-selector open",assigned:"assigned",project:"project","on-remove-assigned":"onRemoveAssigned()","on-assign-to":"assignTo(member)"},{assigned:this.assignedTo,project:this.project,onRemoveAssigned:this._closeAndRemoveAssigned.bind(this),assignTo:this._closeAndAssign.bind(this)})},t}(),angular.module("taigaComponents").controller("AssignedToCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to.html",scope:{assignedTo:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToComponent",t)}.call(this),function(){var t;t=function(t,e,r){var n;return n=function(n,i,o){var s;return s=t(o.tgAttachmentLink)(n),i.on("click",function(t){return taiga.isImage(s.getIn(["file","name"]))?(t.preventDefault(),n.$apply(function(){return r.open($("tg-attachments-preview")),e.fileId=s.getIn(["file","id"])})):taiga.isPdf(s.getIn(["file","name"]))?(t.preventDefault(),window.open(s.getIn(["file","url"]))):void 0}),n.$on("$destroy",function(){return i.off()})},{link:n}},t.$inject=["$parse","tgAttachmentsPreviewService","lightboxService"],angular.module("taigaComponents").directive("tgAttachmentLink",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment-gallery.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentGallery",t)}.call(this),function(){var t;t=function(){function t(t,e){this.attachmentsService=t,this.translate=e,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 t.$inject=["tgAttachmentsService","$translate"],t.prototype.editMode=function(t){var e;return e=this.attachment.set("editable",t),this.onUpdate({attachment:e})},t.prototype["delete"]=function(){return this.onDelete({attachment:this.attachment})},t.prototype.save=function(){var t;return t=this.attachment.set("loading",!0),this.onUpdate({attachment:t}),t=this.attachment.merge({editable:!1,loading:!1}),t=t.mergeIn(["file"],{description:this.form.description,is_deprecated:!!this.form.is_deprecated}),this.onUpdate({attachment:t})},t}(),angular.module("taigaComponents").controller("Attachment",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachment",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=t(n.tgAttachmentsDrop),r.on("dragover",function(t){return t.preventDefault(),!1}),r.on("drop",function(t){var r;return t.stopPropagation(),t.preventDefault(),r=t.dataTransfer||t.originalEvent&&t.originalEvent.dataTransfer,e.$apply(function(){return i(e,{files:r.files})})}),e.$on("$destroy",function(){return r.off()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsDrop",t)}.call(this),function(){var t,e;e=this.taiga.sizeFormat,t=function(){function t(t,r,n,i,o,s,a){this.translate=t,this.confirm=r,this.config=n,this.storage=i,this.attachmentsFullService=o,this.projectService=s,this.attachmentsPreviewService=a,this.mode=this.storage.get("attachment-mode","list"),this.maxFileSize=this.config.get("maxUploadFileSize",null),this.maxFileSize&&(this.maxFileSize=e(this.maxFileSize)),this.maxFileSizeMsg=this.maxFileSize?this.translate.instant("ATTACHMENT.MAX_UPLOAD_SIZE",{maxFileSize:this.maxFileSize}):"",taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t.attachmentsFullService.attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t.attachmentsFullService.deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t.attachmentsFullService.attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t.attachmentsFullService.deprecatedsVisible}}(this))}return t.$inject=["$translate","$tgConfirm","$tgConfig","$tgStorage","tgAttachmentsFullService","tgProjectService","tgAttachmentsPreviewService"],t.prototype.uploadingAttachments=function(){return this.attachmentsFullService.uploadingAttachments},t.prototype.addAttachment=function(t){var e;return e="list"===this.mode,this.attachmentsFullService.addAttachment(this.projectId,this.objId,this.type,t,e)},t.prototype.setMode=function(t){return this.mode=t,this.storage.set("attachment-mode",t)},t.prototype.toggleDeprecatedsVisible=function(){return this.attachmentsFullService.toggleDeprecatedsVisible()},t.prototype.addAttachments=function(t){return _.forEach(t,function(t){return function(e){return t.addAttachment(e)}}(this))},t.prototype.loadAttachments=function(){return this.attachmentsFullService.loadAttachments(this.type,this.objId,this.projectId)},t.prototype.deleteAttachment=function(t){var e,r;return this.attachmentsPreviewService.fileId=null,r=this.translate.instant("ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT"),e=this.translate.instant("ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT",{fileName:t.getIn(["file","name"])}),this.confirm.askOnDelete(r,e).then(function(r){return function(n){var i,o;return i=function(){return e=r.translate.instant("ATTACHMENT.ERROR_DELETE_ATTACHMENT",{errorMessage:e}),r.confirm.notify("error",null,e),n.finish(!1)},o=function(){return n.finish()},r.attachmentsFullService.deleteAttachment(t,r.type).then(o,i)}}(this))},t.prototype.reorderAttachment=function(t,e){return this.attachmentsFullService.reorderAttachment(this.type,t,e)},t.prototype.updateAttachment=function(t){return this.attachmentsFullService.updateAttachment(t,this.type)},t.prototype._isEditable=function(){return!!this.projectService.project&&this.projectService.hasPermission(this.editPermission)},t.prototype.showAttachments=function(){return this._isEditable()||this.attachmentsFullService.attachments.size},t}(),angular.module("taigaComponents").controller("AttachmentsFull",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(){var t;return t=function(t,r,n,i){return e(t,"vm.objId",function(t){return i.loadAttachments()})},{scope:{},bindToController:{type:"@",objId:"=",projectId:"=",editPermission:"@"},controller:"AttachmentsFull",controllerAs:"vm",templateUrl:"components/attachments-full/attachments-full.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsFull",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.attachmentsService=t,this.rootScope=e,this._attachments=Immutable.List(),this._deprecatedsCount=0,this._attachmentsVisible=Immutable.List(),this._deprecatedsVisible=!1,this.uploadingAttachments=[],taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t._attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t._deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t._attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t._deprecatedsVisible}}(this))}return e(r,t),r.$inject=["tgAttachmentsService","$rootScope"],r.prototype.toggleDeprecatedsVisible=function(){return this._deprecatedsVisible=!this._deprecatedsVisible,this.regenerate()},r.prototype.regenerate=function(){return this._deprecatedsCount=this._attachments.count(function(t){return t.getIn(["file","is_deprecated"])}),this._deprecatedsVisible?this._attachmentsVisible=this._attachments:this._attachmentsVisible=this._attachments.filter(function(t){return!t.getIn(["file","is_deprecated"])})},r.prototype.addAttachment=function(t,e,r,n,i,o){return null==i&&(i=!0),null==o&&(o=!1),new Promise(function(s){return function(a,c){var u;return s.attachmentsService.validate(n)?(s.uploadingAttachments.push(n),u=s.attachmentsService.upload(n,e,t,r,o),u.then(function(t){var e;return s.uploadingAttachments=s.uploadingAttachments.filter(function(e){return e.name!==t.get("name")}),e=Immutable.Map(),e=e.merge({file:t,editable:i,loading:!1,from_comment:o}),s._attachments=s._attachments.push(e),s.regenerate(),s.rootScope.$broadcast("attachment:create"),a(e)})):c(new Error(n))}}(this))},r.prototype.loadAttachments=function(t,e,r){return this.attachmentsService.list(t,e,r).then(function(t){return function(e){return t._attachments=e.map(function(t){var e;return e=Immutable.Map(),e.merge({loading:!1,editable:!1,file:t})}),t.regenerate()}}(this))},r.prototype.deleteAttachment=function(t,e){var r;return r=function(e){return function(){return e._attachments=e._attachments.filter(function(e){return e!==t}),e.regenerate()}}(this),this.attachmentsService["delete"](e,t.getIn(["file","id"])).then(r)},r.prototype.reorderAttachment=function(t,e,r){var n,i,o;if(i=this.attachments.findIndex(function(t){return t===e}),i!==r)return n=this.attachments.remove(i),n=n.splice(r,0,e),n=n.map(function(t,e){return t.setIn(["file","order"],e+1)}),o=[],n.forEach(function(e){return function(r){var n;return n={order:r.getIn(["file","order"])},o.push(e.attachmentsService.patch(r.getIn(["file","id"]),t,n))}}(this)),Promise.all(o).then(function(t){return function(){return t._attachments=n,t.regenerate()}}(this))},r.prototype.updateAttachment=function(t,e){var r,n,i;return r=this._attachments.findIndex(function(e){return e.getIn(["file","id"])===t.getIn(["file","id"])}),n=this._attachments.get(r),i=taiga.patch(n.get("file"),t.get("file")),t.get("loading")?(this._attachments=this._attachments.set(r,t),this.regenerate()):this.attachmentsService.patch(t.getIn(["file","id"]),e,i).then(function(e){return function(){return e._attachments=e._attachments.set(r,t),e.regenerate()}}(this))},r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsFullService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsPreviewService=t,taiga.defineImmutableProperty(this,"current",function(t){return function(){return t.attachmentsPreviewService.fileId?t.getCurrent():null}}(this))}return t.$inject=["tgAttachmentsPreviewService"],t.prototype.hasPagination=function(){var t;return t=this.attachments.filter(function(t){return function(t){return taiga.isImage(t.getIn(["file","name"]))}}(this)),t.size>1},t.prototype.getCurrent=function(){var t,e;return t=this.attachments.find(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this)),e=t.get("file")},t.prototype.getIndex=function(){return this.attachments.findIndex(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this))},t.prototype.next=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(t+1).find(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.find(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t.prototype.previous=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(0,t).findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t}(),angular.module("taigaComponents").controller("AttachmentsPreview",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return $(document.body).on("keydown.image-preview",function(r){return e.fileId&&(39===r.keyCode?i.next():37===r.keyCode&&i.previous()),t.$digest()}),t.$on("$destroy",function(){return $(document.body).off(".image-preview")})},{scope:{},controller:"AttachmentsPreview",templateUrl:"components/attachments-preview/attachments-preview.html",link:r,controllerAs:"vm",bindToController:{attachments:"="}}},angular.module("taigaComponents").directive("tgAttachmentsPreview",["lightboxService","tgAttachmentsPreviewService",t])}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){}return e(r,t),r.$inject=[],r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsPreviewService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsService=t}return t.$inject=["tgAttachmentsService"],t.prototype.addAttachment=function(t){var e;if(e=Immutable.fromJS({file:t,name:t.name,size:t.size}),this.attachmentsService.validate(t)&&(this.attachments=this.attachments.push(e),this.onAdd))return this.onAdd({attachment:e})},t.prototype.addAttachments=function(t){return _.forEach(t,this.addAttachment.bind(this))},t.prototype.deleteAttachment=function(t){if(this.attachments=this.attachments.filter(function(e){return e!==t}),this.onDelete)return this.onDelete({attachment:t})},t}(),angular.module("taigaComponents").controller("AttachmentsSimple",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachments:"=",onAdd:"&",onDelete:"&"},controller:"AttachmentsSimple",controllerAs:"vm",templateUrl:"components/attachments-simple/attachments-simple.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsSimple",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o,s;return i=t(n.tgAttachmentsSortable),o=dragula([r[0]],{copySortSource:!1,copy:!1,mirrorContainer:r[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),o.on("dragend",function(t){var r,n;return t=$(t),r=t.scope().attachment,n=t.index(),e.$apply(function(){return i(e,{attachment:r,index:n})})}),s=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&o.dragging}}),e.$on("$destroy",function(){return r.off(),o.destroy()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsSortable",t)}.call(this),function(){var t;t=function(t){return{link:function(e,r){return t(function(){return r[0].select()})}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgAutoSelect",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=n.tgAvatarBig?"avatarBig":"avatar",e.$watch(i,function(e){var n;return n=t.getAvatar(e,i),r.attr("src",n.url),r.css("background",n.bg||"")})},{link:e,scope:{avatar:"=tgAvatar",avatarBig:"=tgAvatarBig"}}},t.$inject=["tgAvatarService"],angular.module("taigaComponents").directive("tgAvatar",t),angular.module("taigaComponents").directive("tgAvatarBig",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t,e;return t=function(t,e,r){return t.$watch("epics",function(e){if(e&&!e.isIterable)return t.immutable_epics=Immutable.fromJS(e)})},e=function(t,e){return e.format?"components/belong-to-epics/belong-to-epics-"+e.format+".html":"components/belong-to-epics/belong-to-epics-pill.html"},{link:t,scope:{epics:"="},templateUrl:e}},e.directive("tgBelongToEpics",t)}.call(this),function(){var t;t=function(t,e,r,n,i){return{restrict:"A",compile:function(o,s){var a,c;return a=e(s.tgBindCode),c=e(s.tgBindCode,function(t){return(t||"").toString()}),r.$$addBindingClass(o),function(e,o,s){return r.$$addBindingInfo(o,s.tgBindCode),e.$watch(c,function(){var r;return r=n.getHTML(a(e)),o.html(t.getTrustedHtml(r)||""),i.addHightlighter(o)})}}}},angular.module("taigaComponents").directive("tgBindCode",["$sce","$parse","$compile","tgWysiwygService","tgWysiwygCodeHightlighterService",t])}.call(this),function(){var t;t=function(){return{scope:{levels:"=",value:"="},templateUrl:"components/board-zoom/board-zoom.html"}},angular.module("taigaComponents").directive("tgBoardZoom",[t])}.call(this),function(){var t;t=function(){function t(){this.index=0}return t.$inject=[],t.prototype.next=function(){if(this.index++,this.index>=this.images.size)return this.index=0},t.prototype.previous=function(){if(this.index--,this.index<0)return this.index=this.images.size-1},t}(),angular.module("taigaComponents").controller("CardSlideshow",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{controller:"CardSlideshow",templateUrl:"components/card-slideshow/card-slideshow.html",bindToController:!0,controllerAs:"vm",scope:{images:"="}}},e.directive("tgCardSlideshow",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.visible=function(t){return this.zoom.indexOf(t)!==-1},t.prototype.hasTasks=function(){var t;return t=this.item.getIn(["model","tasks"]),t&&t.size>0},t.prototype.hasVisibleAttachments=function(){return this.item.get("images").size>0},t.prototype.toggleFold=function(){return this.onToggleFold({id:this.item.get("id")})},t.prototype.getClosedTasks=function(){return this.item.getIn(["model","tasks"]).filter(function(t){return t.get("is_closed")})},t.prototype.closedTasksPercent=function(){return 100*this.getClosedTasks().size/this.item.getIn(["model","tasks"]).size},t.prototype.getPermissionsKey=function(){return"task"===this.type?"modify_task":"modify_us"},t.prototype._setVisibility=function(){var t;return t={related:this.visible("related_tasks"),slides:this.visible("attachments")},_.isUndefined(this.item.get("foldStatusChanged"))||(this.visible("related_tasks")&&this.visible("attachments")?(t.related=!this.item.get("foldStatusChanged"),t.slides=!this.item.get("foldStatusChanged")):this.visible("attachments")?(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged")):this.visible("related_tasks")||this.visible("attachments")||(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged"))),this.item.getIn(["model","tasks"])&&this.item.getIn(["model","tasks"]).size||(t.related=!1),this.item.get("images")&&this.item.get("images").size||(t.slides=!1),t},t.prototype.isRelatedTasksVisible=function(){var t;return t=this._setVisibility(),t.related},t.prototype.isSlideshowVisible=function(){var t;return t=this._setVisibility(),t.slides},t.prototype.getNavKey=function(){return"task"===this.type?"project-tasks-detail":"project-userstories-detail"},t}(),angular.module("taigaComponents").controller("Card",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{link:function(t){},controller:"Card",controllerAs:"vm",bindToController:!0,templateUrl:"components/card/card.html",scope:{onToggleFold:"&",onClickAssignedTo:"&",onClickEdit:"&",project:"=",item:"=",zoom:"=",zoomLevel:"=",archived:"=",type:"@"}}},e.directive("tgCard",t)}.call(this),function(){var t;t=function(){return{link:function(t,e){return e.on("click",function(t){var r;if(!$(t.target).is("input"))return t.preventDefault(),r=e.find('input[type="file"]'),r.val(""),r.trigger("click")}),t.$on("$destroy",function(){return e.off()})}}},angular.module("taigaComponents").directive("tgClickInputFile",[t])}.call(this),function(){var t,e,r;r=this.taiga,e=r.getDefaulColorList,t=function(){function t(t){this.projectService=t,this.colorList=e(),this.checkIsColorRequired(),this.displayColorList=!1}return t.$inject=["tgProjectService"],t.prototype.userCanChangeColor=function(){return!this.requiredPerm||this.projectService.hasPermission(this.requiredPerm)},t.prototype.checkIsColorRequired=function(){if(!this.isColorRequired)return this.colorList=_.dropRight(this.colorList)},t.prototype.setColor=function(t){return this.color=t,this.customColor=t},t.prototype.resetColor=function(){if(this.isColorRequired&&!this.color)return this.color=this.initColor},t.prototype.toggleColorList=function(){return this.displayColorList=!this.displayColorList,this.customColor=this.color,this.resetColor()},t.prototype.onSelectDropdownColor=function(t){return this.color=t,this.onSelectColor({color:t}),this.toggleColorList()},t.prototype.onKeyDown=function(t){if(13===t.which)return!this.customColor&&this.isColorRequired||this.onSelectDropdownColor(this.customColor),t.preventDefault()},t}(),angular.module("taigaComponents").controller("ColorSelectorCtrl",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(t){var e;return e=function(e,r,n,i){var o,s,a;return o=null,s=function(){return t.cancel(o),o=null},a=function(){if(!o)return o=t(function(){return i.displayColorList=!1,i.resetColor()},400)},r.find(".color-selector").mouseenter(s).mouseleave(a),r.find(".color-selector-dropdown").mouseenter(s).mouseleave(a),e.$watch("vm.initColor",function(t){return i.setColor(t)})},{link:e,templateUrl:"components/color-selector/color-selector.html",controller:"ColorSelectorCtrl",controllerAs:"vm",bindToController:{isColorRequired:"=",onSelectColor:"&",initColor:"=",requiredPerm:"@"},scope:{}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgColorSelector",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){function t(t,e,r,n,i){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.navUrls=n,this.window=i,this.editMode=!1,this.loadingSubject=!1,this.originalSubject=this.item.subject}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation","$tgNavUrls","$window"],t.prototype._checkNav=function(){var t,e,r;if(null!=(null!=(e=this.item.neighbors.previous)?e.ref:void 0)&&(t={project:this.project.slug,ref:this.item.neighbors.previous.ref},this.previousUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)),null!=(null!=(r=this.item.neighbors.next)?r.ref:void 0))return t={project:this.project.slug,ref:this.item.neighbors.next.ref},this.nextUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)},t.prototype._checkPermissions=function(){return this.permissions={canEdit:_.includes(this.project.my_permissions,this.requiredPerm)}},t.prototype.editSubject=function(t){var e;if(e=this.window.getSelection(),"Range"!==e.type&&(t&&(this.editMode=!0),!t))return this.editMode=!1},t.prototype.onKeyDown=function(t){if(13===t.which&&this.saveSubject(),27===t.which)return this.item.subject=this.originalSubject,this.editSubject(!1)},t.prototype.saveSubject=function(){var t,e,r,n;return r=function(t){return function(){return t.loadingSubject=!1,t.rootScope.$broadcast("object:updated"),t.confirm.notify("success"),t.originalSubject=t.item.subject}}(this),e=function(t){return function(){return t.loadingSubject=!1,t.confirm.notify("error")}}(this),this.editMode=!1,this.loadingSubject=!0,t=this.item,n=this.modelTransform.save(function(t){return t}),n.then(r,e)},t}(),e.controller("StoryHeaderCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){var t;return this.$inject=[],t=function(t,e,r,n){return n._checkPermissions(),n._checkNav()},{link:t,controller:"StoryHeaderCtrl",bindToController:!0,scope:{item:"=",project:"=",requiredPerm:"@"},controllerAs:"vm",templateUrl:"components/detail/header/detail-header.html"}},e.directive("tgDetailHeader",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o;return o=t(n.tgFileChange),r.on("change",function(t){return e.$apply(function(){return o(e,{files:t.currentTarget.files})})}),e.$on("$destroy",function(){return r.off()})},{restrict:"A",link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgFileChange",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=taiga.generateHash,t=function(t){function n(t,e,r){this.q=t,this.urls=e,this.http=r}return r(n,t),n.$inject=["$q","$tgUrls","$tgHttp"],n.prototype.storeFilters=function(t,r,n){var i,o,s,a,c;return i=this.q.defer(),c=this.urls.resolve("user-storage"),s=t+":"+n,o=e([t,s]),_.isEmpty(r)?(a=this.http["delete"](c+"/"+o,{key:o,value:r}),a.then(function(){return i.resolve()}),a.then(null,function(){return i.reject()})):(a=this.http.put(c+"/"+o,{key:o,value:r}),a.then(function(t){return i.resolve()}),a.then(null,function(t){return function(e){var n;return n=t.http.post(""+c,{key:o,value:r}),n.then(function(){return i.resolve()}),n.then(null,function(){return i.reject()})}}(this))),i.promise},n.prototype.getFilters=function(t,r){var n,i,o,s,a;return n=this.q.defer(),a=this.urls.resolve("user-storage"),o=t+":"+r,i=e([t,o]),s=this.http.get(a+"/"+i),s.then(function(t){return n.resolve(t.data.value)}),s.then(null,function(t){return n.resolve({})}),n.promise},n}(taiga.Service),angular.module("taigaComponents").service("tgFilterRemoteStorageService",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=$("tg-filter"),t.$watch(r.ngIf,function(t){var r,n;if(t)return i.find(".filter-list").hide(),n=i.height(),r=0,i.children().each(function(){return r+=$(this).outerHeight(!0)}),$(e.context.nextSibling).css({"max-height":n-r,display:"block"})})},{priority:900,link:t}},angular.module("taigaComponents").directive("tgFilterSlideDown",[t])}.call(this),function(){var t;t=function(){function t(){this.opened=null,this.customFilterForm=!1,this.customFilterName=""}return t.$inject=[],t.prototype.toggleFilterCategory=function(t){return this.opened===t?this.opened=null:this.opened=t},t.prototype.isOpen=function(t){return this.opened===t},t.prototype.saveCustomFilter=function(){return this.onSaveCustomFilter({name:this.customFilterName}),this.customFilterForm=!1,this.opened="custom-filter",this.customFilterName=""},t.prototype.changeQ=function(){return this.onChangeQ({q:this.q})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.selectFilter=function(t,e){return e={category:t,filter:e},this.onAddFilter({filter:e})},t.prototype.removeCustomFilter=function(t){return this.onRemoveCustomFilter({filter:t})},t.prototype.selectCustomFilter=function(t){return this.onSelectCustomFilter({filter:t})},t.prototype.isFilterSelected=function(t,e){return!!_.find(this.selectedFilters,function(r){return e.id===r.id&&t.dataType===r.dataType})},t}(),angular.module("taigaComponents").controller("Filter",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=t.$watch("vm.defaultQ",function(e){return e&&!t.vm.filtersForm.$dirty?(t.vm.q=e,i()):t.vm.filtersForm.$dirty?i():void 0}),r.$observe("open",function(r){return r=t.$eval(r),r?e.addClass("open"):e.removeClass("open")})},{scope:{onChangeQ:"&",onAddFilter:"&",onSelectCustomFilter:"&",onRemoveFilter:"&",onRemoveCustomFilter:"&",onSaveCustomFilter:"&",customFilters:"<",defaultQ:"=q",filters:"<",customFilters:"<",selectedFilters:"<"},bindToController:!0,controller:"Filter",controllerAs:"vm",templateUrl:"components/filter/filter.html",link:t}},angular.module("taigaComponents").directive("tgFilter",[t])}.call(this),function(){var t,e;e=this.taiga,t=function(t,e,r,n,i){var o;return o=function(n,o,s,a){var c,u,l;return l=null,u=introJs(),u.oncomplete(function(){return $("html,body").scrollTop(0)}),u.onexit(function(){return e.disableJoyRide()}),c=function(t,e){if(e[t.joyride])return u.setOptions({exitOnEsc:!1,exitOnOverlayClick:!1,showStepNumbers:!1,nextLabel:i.instant("JOYRIDE.NAV.NEXT")+" →",prevLabel:"← "+i.instant("JOYRIDE.NAV.BACK"),skipLabel:i.instant("JOYRIDE.NAV.SKIP"),doneLabel:i.instant("JOYRIDE.NAV.DONE"),disableInteraction:!0}),u.setOption("steps",r.get(t.joyride)),u.start()},t.$on("$routeChangeSuccess",function(r,n){return n.joyride&&e.isAuthenticated()?(u.oncomplete(function(){return e.disableJoyRide(n.joyride)}),n.loader?l=t.$on("loader:end",function(){return e.loadJoyRideConfig().then(function(t){return c(n,t)}),l()}):e.loadJoyRideConfig().then(function(t){return c(n,t)})):(u.exit(),void(l&&l()))})},{scope:{},link:o}},t.$inject=["$rootScope","tgCurrentUserService","tgJoyRideService","$location","$translate"],angular.module("taigaComponents").directive("tgJoyRide",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.translate=t,this.checkPermissionsService=e}return e(r,t),r.$inject=["$translate","tgCheckPermissionsService"],r.prototype.getConfig=function(){return{dashboard:function(t){return function(){var e;return e=[{element:".project-list > section:not(.ng-hide)",position:"left",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TEXT")}},{element:".working-on-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TEXT")}},{element:".watching-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT2")]}}],$(".project-list .create-project-button").is(":hidden")||e.push({element:".project-list .create-project-button",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT2")]}}),e}}(this),backlog:function(t){return function(){var e;return e=[{element:".summary",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP1.TITLE"),text:[t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT1"),t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT2")] +},r}(n.Service),r=angular.module("taigaBase"),r.service("$tgUrls",t)}.call(this),function(){var t,e,r;r=this.taiga,e=function(t){var e,r;return e=function(e,r){return t.queryOne(r,e)},r={epic:{get:function(t){return e(t,"custom-attributes-values/epic")}},userstory:{get:function(t){return e(t,"custom-attributes-values/userstory")}},task:{get:function(t){return e(t,"custom-attributes-values/task")}},issue:{get:function(t){return e(t,"custom-attributes-values/issue")}}},function(t){return t.customAttributesValues=r}},t=angular.module("taigaResources"),t.factory("$tgCustomAttributesValuesResourcesProvider",["$tgRepo",e])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t){var e,r;return e=function(e,r){return t.queryMany(r,{project:e})},r={epic:{list:function(t){return e(t,"custom-attributes/epic")}},userstory:{list:function(t){return e(t,"custom-attributes/userstory")}},task:{list:function(t){return e(t,"custom-attributes/task")}},issue:{list:function(t){return e(t,"custom-attributes/issue")}}},function(t){return t.customAttributes=r}},t=angular.module("taigaResources"),t.factory("$tgCustomAttributesResourcesProvider",["$tgRepo",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e,r,n,i){var o,s;return s={},o="epics-queryparams",s.getByRef=function(t,r){var n;return n=s.getQueryParams(t),n.project=t,n.ref=r,e.queryOne("epics","by_ref",n)},s.listValues=function(t,r){var n;return n={project:t},s.storeQueryParams(t,n),e.queryMany(r,n)},s.storeQueryParams=function(e,r){var n,s;return s=e+":"+o,n=t([e,s]),i.set(n,r)},s.getQueryParams=function(e){var r,n;return n=e+":"+o,r=t([e,n]),i.get(r)||{}},s.upvote=function(t){var e;return e=n.resolve("epic-upvote",t),r.post(e)},s.downvote=function(t){var e;return e=n.resolve("epic-downvote",t),r.post(e)},s.watch=function(t){var e;return e=n.resolve("epic-watch",t),r.post(e)},s.unwatch=function(t){var e;return e=n.resolve("epic-unwatch",t),r.post(e)},function(t){return t.epics=s}},e=angular.module("taigaResources"),e.factory("$tgEpicsResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage",r])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e,r){return t.queryOneRaw("history/"+e,r)},n.editComment=function(t,n,i,o){var s,a,c;return c=r.resolve("history/"+t),c=c+"/"+n+"/edit_comment",a={id:i},s={comment:o},e.post(c,s,a).then(function(t){return function(t){return t.data}}(this))},n.getCommentHistory=function(t,n,i){var o,s;return s=r.resolve("history/"+t),s=s+"/"+n+"/comment_versions",o={id:i},e.get(s,o).then(function(t){return function(t){return t.data}}(this))},n.deleteComment=function(t,n,i){var o,s;return s=r.resolve("history/"+t),s=s+"/"+n+"/delete_comment",o={id:i},e.post(s,null,o).then(function(t){return function(t){return t.data}}(this))},n.undeleteComment=function(t,n,i){var o,s;return s=r.resolve("history/"+t),s=s+"/"+n+"/undelete_comment",o={id:i},e.post(s,null,o).then(function(t){return function(t){return t.data}}(this))},function(t){return t.history=n}},t=angular.module("taigaResources"),t.factory("$tgHistoryResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t){var e;return e={},e.get=function(e){return t.queryOne("invitations",e)},function(t){return t.invitations=e}},t=angular.module("taigaResources"),t.factory("$tgInvitationsResourcesProvider",["$tgRepo",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e,r,n,i,o){var s,a;return a={},s="issues-queryparams",a.get=function(t,r){var n;return n=a.getQueryParams(t),n.project=t,e.queryOne("issues",r,n)},a.getByRef=function(t,r){var n;return n=a.getQueryParams(t),n.project=t,n.ref=r,e.queryOne("issues","by_ref",n)},a.listInAllProjects=function(t){return e.queryMany("issues",t)},a.list=function(t,r,n){var i;return i={project:t},i=_.extend({},i,r||{}),a.storeQueryParams(t,i),e.queryPaginated("issues",i,n)},a.bulkCreate=function(t,e){var i,o;return o=n.resolve("bulk-create-issues"),i={project_id:t,bulk_issues:e},r.post(o,i)},a.upvote=function(t){var e;return e=n.resolve("issue-upvote",t),r.post(e)},a.downvote=function(t){var e;return e=n.resolve("issue-downvote",t),r.post(e)},a.watch=function(t){var e;return e=n.resolve("issue-watch",t),r.post(e)},a.unwatch=function(t){var e;return e=n.resolve("issue-unwatch",t),r.post(e)},a.stats=function(t){return e.queryOneRaw("projects",t+"/issues_stats")},a.filtersData=function(t){return e.queryOneRaw("issues-filters",null,t)},a.listValues=function(t,r){var n;return n={project:t},a.storeQueryParams(t,n),e.queryMany(r,n)},a.storeQueryParams=function(e,r){var n,o;return o=e+":"+s,n=t([e,o]),i.set(n,r)},a.getQueryParams=function(e){var r,n;return n=e+":"+s,r=t([e,n]),i.get(r)||{}},function(t){return t.issues=a}},e=angular.module("taigaResources"),e.factory("$tgIssuesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",r])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e){var r,n,i;return i={},n="kanban-statusviewmodels",r="kanban-statuscolumnmodels",i.storeStatusColumnModes=function(n,i){var o,s;return s=n+":"+r,o=t([n,s]),e.set(o,i)},i.getStatusColumnModes=function(n){var i,o;return o=n+":"+r,i=t([n,o]),e.get(i)||{}},function(t){return t.kanban=i}},e=angular.module("taigaResources"),e.factory("$tgKanbanResourcesProvider",["$tgStorage",r])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t){var e;return e={list:function(){return t.queryMany("locales")}},function(t){return t.locales=e}},t=angular.module("taigaResources"),t.factory("$tgLocalesResourcesProvider",["$tgRepo",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.render=function(t,n){var i,o;return null!=n&&""!==n||(n=" "),i={project_id:t,content:n},o=e.resolve("wiki"),r.post(o+"/render",i).then(function(t){return function(t){return t.data}}(this))},function(t){return t.mdrender=n}},t=angular.module("taigaResources"),t.factory("$tgMdRenderResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("memberships",e)},n.list=function(e,r,n){var i,o;return null==n&&(n=!0),o={project:e},o=_.extend({},o,r||{}),n?t.queryPaginated("memberships",o):t.queryMany("memberships",o,i={enablePagination:n})},n.listByUser=function(e,r){var n;return n={user:e},n=_.extend({},n,r||{}),t.queryPaginated("memberships",n)},n.resendInvitation=function(t){var n;return n=r.resolve("memberships"),e.post(n+"/"+t+"/resend_invitation",{})},n.bulkCreateMemberships=function(t,n,i){var o,s;return s=r.resolve("bulk-create-memberships"),o={project_id:t,bulk_memberships:n,invitation_extra_text:i},e.post(s,o)},function(t){return t.memberships=n}},t=angular.module("taigaResources"),t.factory("$tgMembershipsResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e;e=function(t){var e;return e={},e.list=function(e,r){return t.queryOneAttribute("project-modules",e,r)},function(t){return t.modules=e}},t=angular.module("taigaResources"),t.factory("$tgModulesResourcesProvider",["$tgRepo",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("notify-policies",e)},n.list=function(e){var r;return r=_.extend({},r,e||{}),t.queryMany("notify-policies",r)},function(t){return t.notifyPolicies=n}},t=angular.module("taigaResources"),t.factory("$tgNotifyPoliciesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t,e,n,i,o,s,a){var c;return c={},c.get=function(t){return e.queryOne("projects",t)},c.getBySlug=function(t){return e.queryOne("projects","by_slug?slug="+t)},c.list=function(){return e.queryMany("projects")},c.listByMember=function(t){var r;return r={member:t,order_by:"user_order"},e.queryMany("projects",r)},c.templates=function(){return e.queryMany("project-templates")},c.usersList=function(t){var r;return r={project:t},e.queryMany("users",r)},c.rolesList=function(t){var r;return r={project:t},e.queryMany("roles",r)},c.stats=function(t){return e.queryOneRaw("projects",t+"/stats")},c.bulkUpdateOrder=function(t){var e;return e=i.resolve("bulk-update-projects-order"),n.post(e,t)},c.regenerate_epics_csv_uuid=function(t){var e;return e=i.resolve("projects")+"/"+t+"/regenerate_epics_csv_uuid",n.post(e)},c.regenerate_userstories_csv_uuid=function(t){var e;return e=i.resolve("projects")+"/"+t+"/regenerate_userstories_csv_uuid",n.post(e)},c.regenerate_tasks_csv_uuid=function(t){var e;return e=i.resolve("projects")+"/"+t+"/regenerate_tasks_csv_uuid",n.post(e)},c.regenerate_issues_csv_uuid=function(t){var e;return e=i.resolve("projects")+"/"+t+"/regenerate_issues_csv_uuid",n.post(e)},c.leave=function(t){var e;return e=i.resolve("projects")+"/"+t+"/leave",n.post(e)},c.memberStats=function(t){return e.queryOneRaw("projects",t+"/member_stats")},c.tagsColors=function(t){return e.queryOne("projects",t+"/tags_colors")},c.deleteTag=function(t,e){var r;return r=i.resolve("projects")+"/"+t+"/delete_tag",n.post(r,{tag:e})},c.createTag=function(t,e,r){var o,s;return s=i.resolve("projects")+"/"+t+"/create_tag",o={},o.tag=e,o.color=null,r&&(o.color=r),n.post(s,o)},c.editTag=function(t,e,r,o){var s,a;return a=i.resolve("projects")+"/"+t+"/edit_tag",s={},s.from_tag=e,r&&(s.to_tag=r),s.color=null,o&&(s.color=o),n.post(a,s)},c.mixTags=function(t,e,r){var o;return o=i.resolve("projects")+"/"+t+"/mix_tags",n.post(o,{to_tag:e,from_tags:r})},c["export"]=function(t){var e;return e=i.resolve("exporter")+"/"+t,n.get(e)},c["import"]=function(e,n){var c,u,l,p,h,f,d,g,m,v,y;return l=s.defer(),f=t.get("maxUploadFileSize",null),f&&e.size>f?(p=a.instant("PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED",{fileName:e.name,fileSize:r(e.size),maxFileSize:r(f)}),d={status:413,data:{_error_message:p}},l.reject(d),l.promise):(v=function(t){return function(t){var e,i;return i=Math.round(t.loaded/t.total*100),e=a.instant("PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE",{uploadedSize:r(t.loaded),totalSize:r(t.total)}),n("in-progress",null,e,i)}}(this),g=function(t){return function(t){return n("done",a.instant("PROJECT.IMPORT.TITLE"),a.instant("PROJECT.IMPORT.DESCRIPTION"))}}(this),m=function(t){return function(t){return n("error")}}(this),c=function(t){return function(t){var e;d={};try{d.data=JSON.parse(t.target.responseText)}catch(r){d.data={}}return d.status=t.target.status,t.target.getResponseHeader("Taiga-Info-Project-Is-Private")&&(d.headers={isPrivate:"True"===t.target.getResponseHeader("Taiga-Info-Project-Is-Private"),memberships:parseInt(t.target.getResponseHeader("Taiga-Info-Project-Memberships"))}),201!==(e=d.status)&&202!==e||l.resolve(d),l.reject(d)}}(this),h=function(t){return function(t){return l.reject("fail")}}(this),u=new FormData,u.append("dump",e),y=new XMLHttpRequest,y.upload.addEventListener("progress",v,!1),y.upload.addEventListener("load",g,!1),y.upload.addEventListener("error",m,!1),y.upload.addEventListener("abort",m,!1),y.addEventListener("load",c,!1),y.addEventListener("error",h,!1),y.open("POST",i.resolve("importer")),y.setRequestHeader("Authorization","Bearer "+o.getToken()),y.setRequestHeader("Accept","application/json"),y.send(u),l.promise)},c.changeLogo=function(e,o){var a,c,u,l,p,h;return u=t.get("maxUploadFileSize",null),u&&o.size>u?(p={status:413,data:{_error_message:"'"+o.name+"' ("+r(o.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(u)+")"}},c=s.defer(),c.reject(p),c.promise):(a=new FormData,a.append("logo",o),l={transformRequest:angular.identity,headers:{"Content-Type":void 0}},h=i.resolve("projects")+"/"+e+"/change_logo",n.post(h,a,{},l))},c.removeLogo=function(t){var e;return e=i.resolve("projects")+"/"+t+"/remove_logo",n.post(e)},function(t){return t.projects=c}},t=angular.module("taigaResources"),t.factory("$tgProjectsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$tgAuth","$q","$translate",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("roles",e)},n.list=function(e){return t.queryMany("roles",{project:e})},function(t){return t.roles=n}},t=angular.module("taigaResources"),t.factory("$tgRolesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r,n){var i;return i={},i["do"]=function(t,i){var o,s,a,c;return o=n.defer(),c=e.resolve("search"),s={url:c,method:"GET",timeout:o.promise,cancelable:!0,params:{project:t,text:i,get_all:!1}},a=r.request(s).then(function(t){return t.data}),a.abort=function(){return o.resolve()},a["finally"]=function(){return a.abort=angular.noop,o=a=null},a},function(t){return t.search=i}},t=angular.module("taigaResources"),t.factory("$tgSearchResourcesProvider",["$tgRepo","$tgUrls","$tgHttp","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(t,e,r){var n;return n={},n.get=function(r,n){return t.queryOne("milestones",n).then(function(t){var r;return r=t.user_stories,r=_.map(r,function(t){return e.make_model("userstories",t)}),t._attrs.user_stories=r,t})},n.stats=function(e,r){return t.queryOneRaw("milestones",r+"/stats")},n.list=function(r,n){var i;return i={project:r},i=_.extend({},i,n||{}),t.queryMany("milestones",i,{},!0).then(function(t){return function(t){var r,n,i,o,s,a;for(s=t[0],r=t[1],n=0,i=s.length;nc?(l={status:413,data:{_error_message:"'"+e.name+"' ("+r(e.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(c)+")"}},a=o.defer(),a.reject(l),a.promise):(s=new FormData,s.append("avatar",e),u={transformRequest:angular.identity,headers:{"Content-Type":void 0}},p=i.resolve("users")+"/change_avatar",n.post(p,s,{},u))},s.removeAvatar=function(){var t;return t=i.resolve("users")+"/remove_avatar",n.post(t)},s.changePassword=function(t,e){var r,o;return o=i.resolve("users")+"/change_password",r={current_password:t,password:e},n.post(o,r)},function(t){return t.userSettings=s}},t=angular.module("taigaResources"),t.factory("$tgUserSettingsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t,e){var r;return r={},r.contacts=function(r,n){var i,o;return null==n&&(n={}),o=e.resolve("user-contacts",r),i={headers:{}},n.enablePagination||(i.headers["x-disable-pagination"]="1"),t.get(o,{},i).then(function(t){return t.data})},function(t){return t.users=r}},t=angular.module("taigaResources"),t.factory("$tgUsersResourcesProvider",["$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e,r,n,i,o){var s,a;return a={},s="userstories-queryparams",a.get=function(t,r,n){var i;return i=a.getQueryParams(t),i.project=t,i=_.extend({},i,n),e.queryOne("userstories",r,i)},a.getByRef=function(t,r,n){var i;return null==n&&(n={}),i=a.getQueryParams(t),i.project=t,i.ref=r,i=_.extend({},i,n),e.queryOne("userstories","by_ref",i)},a.listInAllProjects=function(t){return e.queryMany("userstories",t)},a.filtersData=function(t){return e.queryOneRaw("userstories-filters",null,t)},a.listUnassigned=function(t,r,n){var i;return i={project:t,milestone:"null"},i=_.extend({},i,r||{}),a.storeQueryParams(t,i),e.queryMany("userstories",_.extend(i,{page_size:n}),{enablePagination:!0},!0)},a.listAll=function(t,r){var n;return n={project:t},n=_.extend({},n,r||{}),a.storeQueryParams(t,n),e.queryMany("userstories",n)},a.bulkCreate=function(t,e,i){var o,s;return o={project_id:t,status_id:e,bulk_stories:i},s=n.resolve("bulk-create-us"),r.post(s,o)},a.upvote=function(t){var e;return e=n.resolve("userstory-upvote",t),r.post(e)},a.downvote=function(t){var e;return e=n.resolve("userstory-downvote",t),r.post(e)},a.watch=function(t){var e;return e=n.resolve("userstory-watch",t),r.post(e)},a.unwatch=function(t){var e;return e=n.resolve("userstory-unwatch",t),r.post(e)},a.bulkUpdateBacklogOrder=function(t,e){var i,o;return o=n.resolve("bulk-update-us-backlog-order"),i={project_id:t,bulk_stories:e},r.post(o,i)},a.bulkUpdateMilestone=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-milestone"),o={project_id:t,milestone_id:e,bulk_stories:i},r.post(s,o)},a.bulkUpdateKanbanOrder=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-kanban-order"),o={project_id:t,status_id:e,bulk_stories:i},r.post(s,o)},a.listValues=function(t,r){var n;return n={project:t},a.storeQueryParams(t,n),e.queryMany(r,n)},a.storeQueryParams=function(e,r){var n,o;return o=e+":"+s,n=t([e,o]),i.set(n,r)},a.getQueryParams=function(e){var r,n;return n=e+":"+s,r=t([e,n]),i.get(r)||{}},a.storeShowTags=function(e,r){var n;return n=t([e,"showTags"]),i.set(n,r)},a.getShowTags=function(e){var r;return r=t([e,"showTags"]),i.get(r)||null},function(t){return t.userstories=a}},e=angular.module("taigaResources"),e.factory("$tgUserstoriesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",r])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={webhook:e},t.queryMany("webhooklogs",r)},n.resend=function(t){var n;return n=e.resolve("webhooklogs-resend",t),r.post(n)},function(t){return t.webhooklogs=n}},t=angular.module("taigaResources"),t.factory("$tgWebhookLogsResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={project:e},t.queryMany("webhooks",r)},n.test=function(t){var n;return n=e.resolve("webhooks-test",t),r.post(n)},function(t){return t.webhooks=n}},t=angular.module("taigaResources"),t.factory("$tgWebhooksResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("wiki",e)},n.getBySlug=function(e,r){return t.queryOne("wiki","by_slug?project="+e+"&slug="+r)},n.list=function(e){return t.queryMany("wiki",{project:e})},n.listLinks=function(e){return t.queryMany("wiki-links",{project:e})},function(t){return t.wiki=n}},t=angular.module("taigaResources"),t.factory("$tgWikiResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.debounce,i=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.translate=l,this.scope.sectionName=this.translate.instant("CHANGE_PASSWORD.SECTION_NAME"),this.scope.user=this.auth.getUser()}return s(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],e}(n(o.Controller,o.PageMixin)),i.controller("UserChangePasswordController",t),e=function(t,e,n,i){var o;return o=function(o,s,a,c){var u,l,p;return u=new checksley.Form(s.find("form")),l=r(2e3,function(r){return function(r){var s,a;if(r.preventDefault(),u.validate())return o.newPassword1!==o.newPassword2?void e.notify("error",i.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH")):(s=n().target(p).start(),a=t.userSettings.changePassword(o.currentPassword,o.newPassword1),a.then(function(){return s.finish(),e.notify("success")}),a.then(null,function(t){return s.finish(),e.notify("error",t.data._error_message)}))}}(this)),p=s.find(".submit-button"),s.on("submit","form",l),o.$on("$destroy",function(){return s.off()})},{link:o}},i.directive("tgUserChangePassword",["$tgResources","$tgConfirm","$tgLoading","$translate",e])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaUserSettings"),t=function(t,e,n,i,o,s,a){var c;return c=function(e,c,u){var l,p;return e.$on("deletelightbox:new",function(t,e){return s.open(c)}),e.$on("$destroy",function(){return c.off()}),l=function(){var r,u;return r=a().target(p).start(),u=t.remove(e.user),u.then(function(t){return r.finish(),s.close(c),n.logout(),i.path(o.resolve("login"))}),u.then(null,function(){return r.finish(),console.log("FAIL")})},c.on("click",".button-green",function(t){return t.preventDefault(),s.close(c)}),c.on("click",".button-red",r(2e3,function(t){return t.preventDefault(),l()})),p=c.find(".button-red")},{link:c,templateUrl:"user/lightbox/lightbox-delete-account.html"}},n.directive("tgLbDeleteUser",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","lightboxService","$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){function r(){this.constructor=t}for(var n in e)l.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},l={}.hasOwnProperty;c=this.taiga,o=this.taiga.mixOf,a=this.taiga.sizeFormat,s=angular.module("taigaUserSettings"),i=this.taiga.debounce,n=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f){var d,g,m;this.scope=t,this.rootscope=e,this.config=r,this.repo=n,this.confirm=i,this.rs=o,this.params=s,this.q=c,this.location=u,this.navUrls=l,this.auth=p,this.translate=h,this.errorHandlingService=f,this.scope.sectionName="USER_SETTINGS.MENU.SECTION_TITLE",this.scope.project={},this.scope.user=this.auth.getUser(),this.scope.user||this.errorHandlingService.permissionDenied(),this.scope.lang=this.getLan(),this.scope.theme=this.getTheme(),d=this.config.get("maxUploadFileSize",null),d&&(m=this.translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE",{maxFileSize:a(d)}),this.scope.maxFileSizeMsg=m),g=this.loadInitialData(),g.then(null,this.onInitialDataError.bind(this))}return u(e,t),e.$inject=["$scope","$rootScope","$tgConfig","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.scope.availableThemes=this.config.get("themes",[]),this.rs.locales.list().then(function(t){return function(e){return t.scope.locales=e,e}}(this))},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.user)},e.prototype.getLan=function(){return this.scope.user.lang||this.translate.preferredLanguage()},e.prototype.getTheme=function(){return this.scope.user.theme||this.config.get("defaultTheme")||"taiga"},e}(o(c.Controller,c.PageMixin)),s.controller("UserSettingsController",n),r=function(t,e,r,n){var o;return o=function(o,s,a){var c;return c=i(2e3,function(i){return function(i){var a,c,u,l;if(i.preventDefault(),c=s.find("form").checksley(),c.validate())return a=o.user.isAttributeModified("email"),o.user.lang=o.lang,o.user.theme=o.theme,l=function(r){var i;return e.setUser(r),a?(i=n.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS"),t.success(i)):t.notify("success")},u=function(e){return c.setErrors(e),t.notify("error",e._error_message)},r.save(o.user).then(l,u)}}(this)),s.on("submit","form",c),o.$on("$destroy",function(){return s.off()})},{link:o}},s.directive("tgUserProfile",["$tgConfirm","$tgAuth","$tgRepo","$translate",r]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return u=function(){return o.find(".size-info").removeClass("hidden")},c=function(r){var s;return s=e.make_model("users",r.data),t.setUser(s),i.user=s,o.find(".loading-overlay").removeClass("active"),n.notify("success")},a=function(t){return 413===t.status&&u(),o.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},o.on("click",".js-change-avatar",function(){return o.find("#avatar-field").click()}),o.on("change","#avatar-field",function(t){if(i.avatarAttachment)return o.find(".loading-overlay").addClass("active"),r.userSettings.changeAvatar(i.avatarAttachment).then(c,a)}),o.on("click","a.js-use-gravatar",function(t){return o.find(".loading-overlay").addClass("active"),r.userSettings.removeAvatar().then(c,a)}),i.$on("$destroy",function(){return o.off()})},{link:i}},s.directive("tgUserAvatar",["$tgAuth","$tgModel","$tgResources","$tgConfirm",e]),t=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgAvatarModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},s.directive("tgAvatarModel",["$parse",t])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgUserSettingsNavigation,e.find(".active").removeClass("active"),e.find("#usersettingsmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaUserSettings"),e.directive("tgUserSettingsNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a=function(t,e){function r(){this.constructor=t}for(var n in e)c.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=this.taiga,i=this.taiga.mixOf,n=this.taiga.bindOnce,o=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.errorHandlingService=l,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.SECTION_NAME",this.scope.user=this.auth.getUser(),p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return a(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(t){return function(e){return t.scope.notifyPolicies=e,e}}(this))},e}(i(s.Controller,s.PageMixin)),o.controller("UserNotificationsController",t),e=function(){var t;return t=function(t,e,r){return t.$on("$destroy",function(){return e.off()})},{link:t}},o.directive("tgUserNotifications",e),r=function(t,e,r){var i,o;return o=_.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<% }) %>'),i=function(i,s,a){var c;return c=function(){var n,a;return s.off(),n={notifyPolicies:i.notifyPolicies},a=o(n),s.html(r(a)(i)),s.on("change","input[type=radio]",function(r){var n,o,s,a,c,u;return u=angular.element(r.currentTarget),a=u.parents(".policy-table-row").data("index"),s=i.notifyPolicies[a],c=s.notify_level,s.notify_level=parseInt(u.val(),10),o=function(){return e.notify("success")},n=function(){return e.notify("error"),u.parents(".policy-table-row").find("input[value="+c+"]").prop("checked",!0)},t.save(s).then(o,n)})},i.$on("$destroy",function(){return s.off()}),n(i,a.ngModel,c)},{link:i}},o.directive("tgUserNotificationsList",["$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){angular.module("taigaComponents",[])}.call(this),function(){var t;t=angular.module("taigaDiscover",[])}.call(this),function(){var t;t=angular.module("taigaExternalApps",[])}.call(this),function(){angular.module("taigaHistory",[])}.call(this),function(){var t;t=angular.module("taigaHome",[])}.call(this),function(){angular.module("taigaNavigationBar",[])}.call(this),function(){var t;t=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 t;t=angular.module("taigaUtils",[])}.call(this),function(){angular.module("taigaWikiHistory",[])}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{templateUrl:"components/assigned-to/assigned-item/assigned-item.html",scope:{member:"="},link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedItem",t); +}.call(this),function(){var t;t=function(){function t(){this.assigned&&this._getAssignedMember(),this._filterAssignedMember()}return t.$inject=[],t.prototype._getAssignedMember=function(){return this.assignedMember=_.filter(this.project.members,function(t){return function(e){return e.id===t.assigned.get("id")}}(this))},t.prototype._filterAssignedMember=function(){return this.assigned?this.nonAssignedMembers=_.filter(this.project.members,function(t){return function(e){return e.id!==t.assigned.get("id")}}(this)):this.nonAssignedMembers=this.project.members},t}(),angular.module("taigaComponents").controller("AssignedToSelectorCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToSelectorCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to-selector/assigned-to-selector.html",scope:{assigned:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToSelector",t)}.call(this),function(){var t;t=function(){function t(t,e){this.lightboxFactory=t,this.lightboxService=e,this.has_permissions=_.includes(this.project.my_permissions,"modify_epic")}return t.$inject=["tgLightboxFactory","lightboxService"],t.prototype._closeAndRemoveAssigned=function(){return this.lightboxService.closeAll(),this.onRemoveAssigned()},t.prototype._closeAndAssign=function(t){return this.lightboxService.closeAll(),this.onAssignTo({member:t})},t.prototype.onSelectAssignedTo=function(t,e){return this.lightboxFactory.create("tg-assigned-to-selector",{"class":"lightbox lightbox-assigned-to-selector open",assigned:"assigned",project:"project","on-remove-assigned":"onRemoveAssigned()","on-assign-to":"assignTo(member)"},{assigned:this.assignedTo,project:this.project,onRemoveAssigned:this._closeAndRemoveAssigned.bind(this),assignTo:this._closeAndAssign.bind(this)})},t}(),angular.module("taigaComponents").controller("AssignedToCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to.html",scope:{assignedTo:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToComponent",t)}.call(this),function(){var t;t=function(t,e,r){var n;return n=function(n,i,o){var s;return s=t(o.tgAttachmentLink)(n),i.on("click",function(t){return taiga.isImage(s.getIn(["file","name"]))?(t.preventDefault(),n.$apply(function(){return r.open($("tg-attachments-preview")),e.fileId=s.getIn(["file","id"])})):taiga.isPdf(s.getIn(["file","name"]))?(t.preventDefault(),window.open(s.getIn(["file","url"]))):void 0}),n.$on("$destroy",function(){return i.off()})},{link:n}},t.$inject=["$parse","tgAttachmentsPreviewService","lightboxService"],angular.module("taigaComponents").directive("tgAttachmentLink",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment-gallery.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentGallery",t)}.call(this),function(){var t;t=function(){function t(t,e){this.attachmentsService=t,this.translate=e,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 t.$inject=["tgAttachmentsService","$translate"],t.prototype.editMode=function(t){var e;return e=this.attachment.set("editable",t),this.onUpdate({attachment:e})},t.prototype["delete"]=function(){return this.onDelete({attachment:this.attachment})},t.prototype.save=function(){var t;return t=this.attachment.set("loading",!0),this.onUpdate({attachment:t}),t=this.attachment.merge({editable:!1,loading:!1}),t=t.mergeIn(["file"],{description:this.form.description,is_deprecated:!!this.form.is_deprecated}),this.onUpdate({attachment:t})},t}(),angular.module("taigaComponents").controller("Attachment",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachment",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=t(n.tgAttachmentsDrop),r.on("dragover",function(t){return t.preventDefault(),!1}),r.on("drop",function(t){var r;return t.stopPropagation(),t.preventDefault(),r=t.dataTransfer||t.originalEvent&&t.originalEvent.dataTransfer,e.$apply(function(){return i(e,{files:r.files})})}),e.$on("$destroy",function(){return r.off()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsDrop",t)}.call(this),function(){var t,e;e=this.taiga.sizeFormat,t=function(){function t(t,r,n,i,o,s,a){this.translate=t,this.confirm=r,this.config=n,this.storage=i,this.attachmentsFullService=o,this.projectService=s,this.attachmentsPreviewService=a,this.mode=this.storage.get("attachment-mode","list"),this.maxFileSize=this.config.get("maxUploadFileSize",null),this.maxFileSize&&(this.maxFileSize=e(this.maxFileSize)),this.maxFileSizeMsg=this.maxFileSize?this.translate.instant("ATTACHMENT.MAX_UPLOAD_SIZE",{maxFileSize:this.maxFileSize}):"",taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t.attachmentsFullService.attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t.attachmentsFullService.deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t.attachmentsFullService.attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t.attachmentsFullService.deprecatedsVisible}}(this))}return t.$inject=["$translate","$tgConfirm","$tgConfig","$tgStorage","tgAttachmentsFullService","tgProjectService","tgAttachmentsPreviewService"],t.prototype.uploadingAttachments=function(){return this.attachmentsFullService.uploadingAttachments},t.prototype.addAttachment=function(t){var e;return e="list"===this.mode,this.attachmentsFullService.addAttachment(this.projectId,this.objId,this.type,t,e)},t.prototype.setMode=function(t){return this.mode=t,this.storage.set("attachment-mode",t)},t.prototype.toggleDeprecatedsVisible=function(){return this.attachmentsFullService.toggleDeprecatedsVisible()},t.prototype.addAttachments=function(t){return _.forEach(t,function(t){return function(e){return t.addAttachment(e)}}(this))},t.prototype.loadAttachments=function(){return this.attachmentsFullService.loadAttachments(this.type,this.objId,this.projectId)},t.prototype.deleteAttachment=function(t){var e,r;return this.attachmentsPreviewService.fileId=null,r=this.translate.instant("ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT"),e=this.translate.instant("ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT",{fileName:t.getIn(["file","name"])}),this.confirm.askOnDelete(r,e).then(function(r){return function(n){var i,o;return i=function(){return e=r.translate.instant("ATTACHMENT.ERROR_DELETE_ATTACHMENT",{errorMessage:e}),r.confirm.notify("error",null,e),n.finish(!1)},o=function(){return n.finish()},r.attachmentsFullService.deleteAttachment(t,r.type).then(o,i)}}(this))},t.prototype.reorderAttachment=function(t,e){return this.attachmentsFullService.reorderAttachment(this.type,t,e)},t.prototype.updateAttachment=function(t){return this.attachmentsFullService.updateAttachment(t,this.type)},t.prototype._isEditable=function(){return!!this.projectService.project&&this.projectService.hasPermission(this.editPermission)},t.prototype.showAttachments=function(){return this._isEditable()||this.attachmentsFullService.attachments.size},t}(),angular.module("taigaComponents").controller("AttachmentsFull",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(){var t;return t=function(t,r,n,i){return e(t,"vm.objId",function(t){return i.loadAttachments()})},{scope:{},bindToController:{type:"@",objId:"=",projectId:"=",editPermission:"@"},controller:"AttachmentsFull",controllerAs:"vm",templateUrl:"components/attachments-full/attachments-full.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsFull",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.attachmentsService=t,this.rootScope=e,this._attachments=Immutable.List(),this._deprecatedsCount=0,this._attachmentsVisible=Immutable.List(),this._deprecatedsVisible=!1,this.uploadingAttachments=[],taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t._attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t._deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t._attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t._deprecatedsVisible}}(this))}return e(r,t),r.$inject=["tgAttachmentsService","$rootScope"],r.prototype.toggleDeprecatedsVisible=function(){return this._deprecatedsVisible=!this._deprecatedsVisible,this.regenerate()},r.prototype.regenerate=function(){return this._deprecatedsCount=this._attachments.count(function(t){return t.getIn(["file","is_deprecated"])}),this._deprecatedsVisible?this._attachmentsVisible=this._attachments:this._attachmentsVisible=this._attachments.filter(function(t){return!t.getIn(["file","is_deprecated"])})},r.prototype.addAttachment=function(t,e,r,n,i,o){return null==i&&(i=!0),null==o&&(o=!1),new Promise(function(s){return function(a,c){var u;return s.attachmentsService.validate(n)?(s.uploadingAttachments.push(n),u=s.attachmentsService.upload(n,e,t,r,o),u.then(function(t){var e;return s.uploadingAttachments=s.uploadingAttachments.filter(function(e){return e.name!==t.get("name")}),e=Immutable.Map(),e=e.merge({file:t,editable:i,loading:!1,from_comment:o}),s._attachments=s._attachments.push(e),s.regenerate(),s.rootScope.$broadcast("attachment:create"),a(e)})):c(new Error(n))}}(this))},r.prototype.loadAttachments=function(t,e,r){return this.attachmentsService.list(t,e,r).then(function(t){return function(e){return t._attachments=e.map(function(t){var e;return e=Immutable.Map(),e.merge({loading:!1,editable:!1,file:t})}),t.regenerate()}}(this))},r.prototype.deleteAttachment=function(t,e){var r;return r=function(e){return function(){return e._attachments=e._attachments.filter(function(e){return e!==t}),e.regenerate()}}(this),this.attachmentsService["delete"](e,t.getIn(["file","id"])).then(r)},r.prototype.reorderAttachment=function(t,e,r){var n,i,o;if(i=this.attachments.findIndex(function(t){return t===e}),i!==r)return n=this.attachments.remove(i),n=n.splice(r,0,e),n=n.map(function(t,e){return t.setIn(["file","order"],e+1)}),o=[],n.forEach(function(e){return function(r){var n;return n={order:r.getIn(["file","order"])},o.push(e.attachmentsService.patch(r.getIn(["file","id"]),t,n))}}(this)),Promise.all(o).then(function(t){return function(){return t._attachments=n,t.regenerate()}}(this))},r.prototype.updateAttachment=function(t,e){var r,n,i;return r=this._attachments.findIndex(function(e){return e.getIn(["file","id"])===t.getIn(["file","id"])}),n=this._attachments.get(r),i=taiga.patch(n.get("file"),t.get("file")),t.get("loading")?(this._attachments=this._attachments.set(r,t),this.regenerate()):this.attachmentsService.patch(t.getIn(["file","id"]),e,i).then(function(e){return function(){return e._attachments=e._attachments.set(r,t),e.regenerate()}}(this))},r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsFullService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsPreviewService=t,taiga.defineImmutableProperty(this,"current",function(t){return function(){return t.attachmentsPreviewService.fileId?t.getCurrent():null}}(this))}return t.$inject=["tgAttachmentsPreviewService"],t.prototype.hasPagination=function(){var t;return t=this.attachments.filter(function(t){return function(t){return taiga.isImage(t.getIn(["file","name"]))}}(this)),t.size>1},t.prototype.getCurrent=function(){var t,e;return t=this.attachments.find(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this)),e=t.get("file")},t.prototype.getIndex=function(){return this.attachments.findIndex(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this))},t.prototype.next=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(t+1).find(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.find(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t.prototype.previous=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(0,t).findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t}(),angular.module("taigaComponents").controller("AttachmentsPreview",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return $(document.body).on("keydown.image-preview",function(r){return e.fileId&&(39===r.keyCode?i.next():37===r.keyCode&&i.previous()),t.$digest()}),t.$on("$destroy",function(){return $(document.body).off(".image-preview")})},{scope:{},controller:"AttachmentsPreview",templateUrl:"components/attachments-preview/attachments-preview.html",link:r,controllerAs:"vm",bindToController:{attachments:"="}}},angular.module("taigaComponents").directive("tgAttachmentsPreview",["lightboxService","tgAttachmentsPreviewService",t])}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){}return e(r,t),r.$inject=[],r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsPreviewService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsService=t}return t.$inject=["tgAttachmentsService"],t.prototype.addAttachment=function(t){var e;if(e=Immutable.fromJS({file:t,name:t.name,size:t.size}),this.attachmentsService.validate(t)&&(this.attachments=this.attachments.push(e),this.onAdd))return this.onAdd({attachment:e})},t.prototype.addAttachments=function(t){return _.forEach(t,this.addAttachment.bind(this))},t.prototype.deleteAttachment=function(t){if(this.attachments=this.attachments.filter(function(e){return e!==t}),this.onDelete)return this.onDelete({attachment:t})},t}(),angular.module("taigaComponents").controller("AttachmentsSimple",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachments:"=",onAdd:"&",onDelete:"&"},controller:"AttachmentsSimple",controllerAs:"vm",templateUrl:"components/attachments-simple/attachments-simple.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsSimple",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o,s;return i=t(n.tgAttachmentsSortable),o=dragula([r[0]],{copySortSource:!1,copy:!1,mirrorContainer:r[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),o.on("dragend",function(t){var r,n;return t=$(t),r=t.scope().attachment,n=t.index(),e.$apply(function(){return i(e,{attachment:r,index:n})})}),s=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&o.dragging}}),e.$on("$destroy",function(){return r.off(),o.destroy()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsSortable",t)}.call(this),function(){var t;t=function(t){return{link:function(e,r){return t(function(){return r[0].select()})}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgAutoSelect",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=n.tgAvatarBig?"avatarBig":"avatar",e.$watch(i,function(e){var n;return n=t.getAvatar(e,i),r.attr("src",n.url),r.css("background",n.bg||"")})},{link:e,scope:{avatar:"=tgAvatar",avatarBig:"=tgAvatarBig"}}},t.$inject=["tgAvatarService"],angular.module("taigaComponents").directive("tgAvatar",t),angular.module("taigaComponents").directive("tgAvatarBig",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t,e;return t=function(t,e,r){return t.$watch("epics",function(e){if(e&&!e.isIterable)return t.immutable_epics=Immutable.fromJS(e)})},e=function(t,e){return e.format?"components/belong-to-epics/belong-to-epics-"+e.format+".html":"components/belong-to-epics/belong-to-epics-pill.html"},{link:t,scope:{epics:"="},templateUrl:e}},e.directive("tgBelongToEpics",t)}.call(this),function(){var t;t=function(t,e,r,n,i){return{restrict:"A",compile:function(o,s){var a,c;return a=e(s.tgBindCode),c=e(s.tgBindCode,function(t){return(t||"").toString()}),r.$$addBindingClass(o),function(e,o,s){return r.$$addBindingInfo(o,s.tgBindCode),e.$watch(c,function(){var r;return r=n.getHTML(a(e)),o.html(t.getTrustedHtml(r)||""),i.addHightlighter(o)})}}}},angular.module("taigaComponents").directive("tgBindCode",["$sce","$parse","$compile","tgWysiwygService","tgWysiwygCodeHightlighterService",t])}.call(this),function(){var t;t=function(){return{scope:{levels:"=",value:"="},templateUrl:"components/board-zoom/board-zoom.html"}},angular.module("taigaComponents").directive("tgBoardZoom",[t])}.call(this),function(){var t;t=function(){function t(){this.index=0}return t.$inject=[],t.prototype.next=function(){if(this.index++,this.index>=this.images.size)return this.index=0},t.prototype.previous=function(){if(this.index--,this.index<0)return this.index=this.images.size-1},t}(),angular.module("taigaComponents").controller("CardSlideshow",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{controller:"CardSlideshow",templateUrl:"components/card-slideshow/card-slideshow.html",bindToController:!0,controllerAs:"vm",scope:{images:"="}}},e.directive("tgCardSlideshow",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.visible=function(t){return this.zoom.indexOf(t)!==-1},t.prototype.hasTasks=function(){var t;return t=this.item.getIn(["model","tasks"]),t&&t.size>0},t.prototype.hasVisibleAttachments=function(){return this.item.get("images").size>0},t.prototype.toggleFold=function(){return this.onToggleFold({id:this.item.get("id")})},t.prototype.getClosedTasks=function(){return this.item.getIn(["model","tasks"]).filter(function(t){return t.get("is_closed")})},t.prototype.closedTasksPercent=function(){return 100*this.getClosedTasks().size/this.item.getIn(["model","tasks"]).size},t.prototype.getPermissionsKey=function(){return"task"===this.type?"modify_task":"modify_us"},t.prototype._setVisibility=function(){var t;return t={related:this.visible("related_tasks"),slides:this.visible("attachments")},_.isUndefined(this.item.get("foldStatusChanged"))||(this.visible("related_tasks")&&this.visible("attachments")?(t.related=!this.item.get("foldStatusChanged"),t.slides=!this.item.get("foldStatusChanged")):this.visible("attachments")?(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged")):this.visible("related_tasks")||this.visible("attachments")||(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged"))),this.item.getIn(["model","tasks"])&&this.item.getIn(["model","tasks"]).size||(t.related=!1),this.item.get("images")&&this.item.get("images").size||(t.slides=!1),t},t.prototype.isRelatedTasksVisible=function(){var t;return t=this._setVisibility(),t.related},t.prototype.isSlideshowVisible=function(){var t;return t=this._setVisibility(),t.slides},t.prototype.getNavKey=function(){return"task"===this.type?"project-tasks-detail":"project-userstories-detail"},t}(),angular.module("taigaComponents").controller("Card",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{link:function(t){},controller:"Card",controllerAs:"vm",bindToController:!0,templateUrl:"components/card/card.html",scope:{onToggleFold:"&",onClickAssignedTo:"&",onClickEdit:"&",project:"=",item:"=",zoom:"=",zoomLevel:"=",archived:"=",type:"@"}}},e.directive("tgCard",t)}.call(this),function(){var t;t=function(){return{link:function(t,e){return e.on("click",function(t){var r;if(!$(t.target).is("input"))return t.preventDefault(),r=e.find('input[type="file"]'),r.val(""),r.trigger("click")}),t.$on("$destroy",function(){return e.off()})}}},angular.module("taigaComponents").directive("tgClickInputFile",[t])}.call(this),function(){var t,e,r;r=this.taiga,e=r.getDefaulColorList,t=function(){function t(t){this.projectService=t,this.colorList=e(),this.checkIsColorRequired(),this.displayColorList=!1}return t.$inject=["tgProjectService"],t.prototype.userCanChangeColor=function(){return!this.requiredPerm||this.projectService.hasPermission(this.requiredPerm)},t.prototype.checkIsColorRequired=function(){if(!this.isColorRequired)return this.colorList=_.dropRight(this.colorList)},t.prototype.setColor=function(t){return this.color=t,this.customColor=t},t.prototype.resetColor=function(){if(this.isColorRequired&&!this.color)return this.color=this.initColor},t.prototype.toggleColorList=function(){return this.displayColorList=!this.displayColorList,this.customColor=this.color,this.resetColor()},t.prototype.onSelectDropdownColor=function(t){return this.color=t,this.onSelectColor({color:t}),this.toggleColorList()},t.prototype.onKeyDown=function(t){if(13===t.which)return!this.customColor&&this.isColorRequired||this.onSelectDropdownColor(this.customColor),t.preventDefault()},t}(),angular.module("taigaComponents").controller("ColorSelectorCtrl",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(t){var e;return e=function(e,r,n,i){var o,s,a;return o=null,s=function(){return t.cancel(o),o=null},a=function(){if(!o)return o=t(function(){return i.displayColorList=!1,i.resetColor()},400)},r.find(".color-selector").mouseenter(s).mouseleave(a),r.find(".color-selector-dropdown").mouseenter(s).mouseleave(a),e.$watch("vm.initColor",function(t){return i.setColor(t)})},{link:e,templateUrl:"components/color-selector/color-selector.html",controller:"ColorSelectorCtrl",controllerAs:"vm",bindToController:{isColorRequired:"=",onSelectColor:"&",initColor:"=",requiredPerm:"@"},scope:{}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgColorSelector",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){function t(t,e,r,n,i){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.navUrls=n,this.window=i,this.editMode=!1,this.loadingSubject=!1,this.originalSubject=this.item.subject}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation","$tgNavUrls","$window"],t.prototype._checkNav=function(){var t,e,r;if(null!=(null!=(e=this.item.neighbors.previous)?e.ref:void 0)&&(t={project:this.project.slug,ref:this.item.neighbors.previous.ref},this.previousUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)),null!=(null!=(r=this.item.neighbors.next)?r.ref:void 0))return t={project:this.project.slug,ref:this.item.neighbors.next.ref},this.nextUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)},t.prototype._checkPermissions=function(){return this.permissions={canEdit:_.includes(this.project.my_permissions,this.requiredPerm)}},t.prototype.editSubject=function(t){var e;if(e=this.window.getSelection(),"Range"!==e.type&&(t&&(this.editMode=!0),!t))return this.editMode=!1},t.prototype.onKeyDown=function(t){if(13===t.which&&this.saveSubject(),27===t.which)return this.item.subject=this.originalSubject,this.editSubject(!1)},t.prototype.saveSubject=function(){var t,e,r,n;return r=function(t){return function(){return t.loadingSubject=!1,t.rootScope.$broadcast("object:updated"),t.confirm.notify("success"),t.originalSubject=t.item.subject}}(this),e=function(t){return function(){return t.loadingSubject=!1,t.confirm.notify("error")}}(this),this.editMode=!1,this.loadingSubject=!0,t=this.item,n=this.modelTransform.save(function(t){return t}),n.then(r,e)},t}(),e.controller("StoryHeaderCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){var t;return this.$inject=[],t=function(t,e,r,n){return n._checkPermissions(),n._checkNav()},{link:t,controller:"StoryHeaderCtrl",bindToController:!0,scope:{item:"=",project:"=",requiredPerm:"@"},controllerAs:"vm",templateUrl:"components/detail/header/detail-header.html"}},e.directive("tgDetailHeader",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o;return o=t(n.tgFileChange),r.on("change",function(t){return e.$apply(function(){return o(e,{files:t.currentTarget.files})})}),e.$on("$destroy",function(){return r.off()})},{restrict:"A",link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgFileChange",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=taiga.generateHash,t=function(t){function n(t,e,r){this.q=t,this.urls=e,this.http=r}return r(n,t),n.$inject=["$q","$tgUrls","$tgHttp"],n.prototype.storeFilters=function(t,r,n){var i,o,s,a,c;return i=this.q.defer(),c=this.urls.resolve("user-storage"),s=t+":"+n,o=e([t,s]),_.isEmpty(r)?(a=this.http["delete"](c+"/"+o,{key:o,value:r}),a.then(function(){return i.resolve()}),a.then(null,function(){return i.reject()})):(a=this.http.put(c+"/"+o,{key:o,value:r}),a.then(function(t){return i.resolve()}),a.then(null,function(t){return function(e){var n;return n=t.http.post(""+c,{key:o,value:r}),n.then(function(){return i.resolve()}),n.then(null,function(){return i.reject()})}}(this))),i.promise},n.prototype.getFilters=function(t,r){var n,i,o,s,a;return n=this.q.defer(),a=this.urls.resolve("user-storage"),o=t+":"+r,i=e([t,o]),s=this.http.get(a+"/"+i),s.then(function(t){return n.resolve(t.data.value)}),s.then(null,function(t){return n.resolve({})}),n.promise},n}(taiga.Service),angular.module("taigaComponents").service("tgFilterRemoteStorageService",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=$("tg-filter"),t.$watch(r.ngIf,function(t){var r,n;if(t)return i.find(".filter-list").hide(),n=i.height(),r=0,i.children().each(function(){return r+=$(this).outerHeight(!0)}),$(e.context.nextSibling).css({"max-height":n-r,display:"block"})})},{priority:900,link:t}},angular.module("taigaComponents").directive("tgFilterSlideDown",[t])}.call(this),function(){var t;t=function(){function t(){this.opened=null,this.customFilterForm=!1,this.customFilterName=""}return t.$inject=[],t.prototype.toggleFilterCategory=function(t){return this.opened===t?this.opened=null:this.opened=t},t.prototype.isOpen=function(t){return this.opened===t},t.prototype.saveCustomFilter=function(){return this.onSaveCustomFilter({name:this.customFilterName}),this.customFilterForm=!1,this.opened="custom-filter",this.customFilterName=""},t.prototype.changeQ=function(){return this.onChangeQ({q:this.q})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.selectFilter=function(t,e){return e={category:t,filter:e},this.onAddFilter({filter:e})},t.prototype.removeCustomFilter=function(t){return this.onRemoveCustomFilter({filter:t})},t.prototype.selectCustomFilter=function(t){return this.onSelectCustomFilter({filter:t})},t.prototype.isFilterSelected=function(t,e){return!!_.find(this.selectedFilters,function(r){return e.id===r.id&&t.dataType===r.dataType})},t}(),angular.module("taigaComponents").controller("Filter",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=t.$watch("vm.defaultQ",function(e){return e&&!t.vm.filtersForm.$dirty?(t.vm.q=e,i()):t.vm.filtersForm.$dirty?i():void 0}),r.$observe("open",function(r){return r=t.$eval(r),r?e.addClass("open"):e.removeClass("open")})},{scope:{onChangeQ:"&",onAddFilter:"&",onSelectCustomFilter:"&",onRemoveFilter:"&",onRemoveCustomFilter:"&",onSaveCustomFilter:"&",customFilters:"<",defaultQ:"=q",filters:"<",customFilters:"<",selectedFilters:"<"},bindToController:!0,controller:"Filter",controllerAs:"vm",templateUrl:"components/filter/filter.html",link:t}},angular.module("taigaComponents").directive("tgFilter",[t])}.call(this),function(){var t,e;e=this.taiga,t=function(t,e,r,n,i){var o;return o=function(n,o,s,a){var c,u,l;return l=null,u=introJs(),u.oncomplete(function(){return $("html,body").scrollTop(0)}),u.onexit(function(){return e.disableJoyRide()}),c=function(t,e){if(e[t.joyride])return u.setOptions({exitOnEsc:!1,exitOnOverlayClick:!1,showStepNumbers:!1,nextLabel:i.instant("JOYRIDE.NAV.NEXT")+" →",prevLabel:"← "+i.instant("JOYRIDE.NAV.BACK"),skipLabel:i.instant("JOYRIDE.NAV.SKIP"),doneLabel:i.instant("JOYRIDE.NAV.DONE"),disableInteraction:!0}),u.setOption("steps",r.get(t.joyride)),u.start()},t.$on("$routeChangeSuccess",function(r,n){return n.joyride&&e.isAuthenticated()?(u.oncomplete(function(){return e.disableJoyRide(n.joyride)}),n.loader?l=t.$on("loader:end",function(){return e.loadJoyRideConfig().then(function(t){return c(n,t)}),l()}):e.loadJoyRideConfig().then(function(t){return c(n,t)})):(u.exit(),void(l&&l()))})},{scope:{},link:o}},t.$inject=["$rootScope","tgCurrentUserService","tgJoyRideService","$location","$translate"],angular.module("taigaComponents").directive("tgJoyRide",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.translate=t,this.checkPermissionsService=e}return e(r,t),r.$inject=["$translate","tgCheckPermissionsService"],r.prototype.getConfig=function(){return{dashboard:function(t){return function(){var e;return e=[{element:".project-list > section:not(.ng-hide)",position:"left",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TEXT")}},{element:".working-on-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TEXT")}},{element:".watching-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT2")]}}],$(".project-list .create-project-button").is(":hidden")||e.push({element:".project-list .create-project-button",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT2")]}}),e}}(this),backlog:function(t){return function(){var e;return e=[{element:".summary",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP1.TITLE"),text:[t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT1"),t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT2")] }},{element:".backlog-table-empty",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP2.TEXT")}},{element:".sprints",position:"left",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP3.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP3.TEXT")}}],t.checkPermissionsService.check("add_us")&&e.push({element:".new-us",position:"rigth",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP4.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP4.TEXT")}}),e}}(this),kanban:function(t){return function(){var e;return e=[{element:".kanban-table-inner",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.KANBAN.STEP1.TEXT")}},{element:".card-placeholder",position:"right",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.KANBAN.STEP2.TEXT")}}],t.checkPermissionsService.check("add_us")&&e.push({element:".add-action",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT1"),t.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT2")]}}),e}}(this)}},r.prototype.get=function(t){var e,r;return r=this.getConfig(),e=r[t].call(this),_.map(e,function(t){var e;return e="",t.joyride.title&&(e+="

    "+t.joyride.title+"

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

    "+t+"

    "}):e+="

    "+t.joyride.text+"

    ",t.intro=e,t})},r}(taiga.Service),angular.module("taigaComponents").service("tgJoyRideService",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i,o){var s,a,c;return r.zoomIndex=t.get("kanban_zoom")||2,r.levels=5,c=[["ref"],["subject"],["owner","tags","extra_info","unfold"],["attachments"],["related_tasks","empty_extra_info"]],s=function(e){return null==e&&(e=0),t.get("kanban_zoom")!==e&&t.set("kanban_zoom",e),_.reduce(c,function(t,r,n){return n<=e&&(t=t.concat(r)),t})},r.$watch("zoomIndex",function(t){var e;return e=s(t),r.onZoomChange({zoomLevel:t,zoom:e})}),a=r.$watch(function(){return e.project},function(t){if(t)return t.get("my_permissions").indexOf("view_tasks")===-1&&(r.levels=4),a()})},{scope:{onZoomChange:"&"},template:'',link:r}},angular.module("taigaComponents").directive("tgKanbanBoardZoom",["$tgStorage","tgProjectService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(t,e,r){},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){return t.open=!1},Object.defineProperties(this,{open:{get:function(){return t.open}},title:{get:function(){return t.title}},desc:{get:function(){return t.desc}}})},link:e,templateUrl:"components/live-announcement/live-announcement.html"}},t.$inject=["tgLiveAnnouncementService"],angular.module("taigaComponents").directive("tgLiveAnnouncement",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){this.open=!1,this.title="",this.desc=""}return e(r,t),r.prototype.show=function(t,e){return this.open=!0,this.title=t,this.desc=e},r}(taiga.Service),angular.module("taigaComponents").service("tgLiveAnnouncementService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.$watch("project",function(e){var n,i;if(e=Immutable.fromJS(e))return i=e.get("logo_big_url"),i?(r.attr("src",i),r.css("background","")):(n=t.getDefaultProjectLogo(e.get("slug"),e.get("id")),r.attr("src",n.src),r.css("background",n.color))})},{link:e,scope:{project:"=tgProjectLogoBigSrc"}}},t.$inject=["tgProjectLogoService"],angular.module("taigaComponents").directive("tgProjectLogoBigSrc",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.$watch("project",function(e){var n,i;if(e=Immutable.fromJS(e))return i=e.get("logo_small_url"),i?(r.attr("src",i),r.css("background","")):(n=t.getDefaultProjectLogo(e.get("slug"),e.get("id")),r.attr("src",n.src),r.css("background",n.color))})},{link:e,scope:{project:"=tgProjectLogoSmallSrc"}}},t.$inject=["tgProjectLogoService"],angular.module("taigaComponents").directive("tgProjectLogoSmallSrc",t)}.call(this),function(){var t;t=function(){function t(t,e){this.projectService=t,this.lightboxFactory=e,this.project=null,this.menu=Immutable.Map()}return t.$inject=["tgProjectService","tgLightboxFactory"],t.prototype.show=function(){return this.project=this.projectService.project,this.active=this._getActiveSection(),this._setVideoConference(),this._setMenuPermissions()},t.prototype.hide=function(){return this.project=null,this.menu={}},t.prototype.search=function(){return this.lightboxFactory.create("tg-search-box",{"class":"lightbox lightbox-search"})},t.prototype._setVideoConference=function(){var t;if(t=this._videoConferenceUrl())return this.project=this.project.set("videoconferenceUrl",t)},t.prototype._setMenuPermissions=function(){if(this.menu=Immutable.Map({epics:!1,backlog:!1,kanban:!1,issues:!1,wiki:!1}),this.project.get("is_epics_activated")&&this.project.get("my_permissions").indexOf("view_epics")!==-1&&(this.menu=this.menu.set("epics",!0)),this.project.get("is_backlog_activated")&&this.project.get("my_permissions").indexOf("view_us")!==-1&&(this.menu=this.menu.set("backlog",!0)),this.project.get("is_kanban_activated")&&this.project.get("my_permissions").indexOf("view_us")!==-1&&(this.menu=this.menu.set("kanban",!0)),this.project.get("is_issues_activated")&&this.project.get("my_permissions").indexOf("view_issues")!==-1&&(this.menu=this.menu.set("issues",!0)),this.project.get("is_wiki_activated")&&this.project.get("my_permissions").indexOf("view_wiki_pages")!==-1)return this.menu=this.menu.set("wiki",!0)},t.prototype._getActiveSection=function(){var t,e,r,n,i;return n=this.projectService.section,i=this.projectService.sectionsBreadcrumb,t=i.lastIndexOf("backlog"),e=i.lastIndexOf("kanban"),t===-1&&e===-1||(r=e===-1||t>e?"backlog":"kanban"),"backlog-kanban"===n&&("backlog"===r||"kanban"===r?n=r:this.project.get("is_backlog_activated")&&!this.project.get("is_kanban_activated")?n="backlog":!this.project.get("is_backlog_activated")&&this.project.get("is_kanban_activated")&&(n="kanban")),n},t.prototype._videoConferenceUrl=function(){var t,e;if("appear-in"===this.project.get("videoconferences"))t="https://appear.in/";else if("talky"===this.project.get("videoconferences"))t="https://talky.io/";else{if("jitsi"!==this.project.get("videoconferences"))return"custom"===this.project.get("videoconferences")?this.project.get("videoconferences_extra_data"):"";t="https://meet.jit.si/"}return e=this.project.get("videoconferences_extra_data")?this.project.get("slug")+"-"+taiga.slugify(this.project.get("videoconferences_extra_data")):this.project.get("slug"),"jitsi"===this.project.get("videoconferences")&&(e=e.replace(/-/g,"")),t+e},t}(),angular.module("taigaComponents").controller("ProjectMenu",t)}.call(this),function(){var t,e;e=this.taiga,t=function(t,e){var r;return r=function(e,r,n,i){var o;return o=function(){return t.project?i.show():i.hide()},e.$watch(function(){return t.project},o),e.vm.fixed=!1,$(window).on("scroll",function(){var t;return t=$(window).scrollTop(),t>100&&e.vm.fixed===!1?(e.vm.fixed=!0,e.$digest()):t<100&&e.vm.fixed===!0?(e.vm.fixed=!1,e.$digest()):void 0})},{scope:{},controller:"ProjectMenu",controllerAs:"vm",templateUrl:"components/project-menu/project-menu.html",link:r}},t.$inject=["tgProjectService","tgLightboxFactory"],angular.module("taigaComponents").directive("tgProjectMenu",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){var t,e,r,n;return r=function(t){var e,r,n;return t.addClass("selected"),n=t.position().top+t.outerHeight(),e=t.parent().outerHeight(),n>e?(r=n-e,t.parent().scrollTop(t.parent().scrollTop()+r)):t.position().top<0?t.parent().scrollTop(t.parent().scrollTop()+t.position().top):void 0},t=function(t,e,n){var i,o,s;if(i=t.find(".selected"),40===e){if(!i.length)return r(t.find("li:first"));if(o=i.next("li"),o.length)return i.removeClass("selected"),r(o)}else if(38===e){if(!i.length)return r(t.find("li:last"));if(s=i.prev("li"),s.length)return i.removeClass("selected"),r(s)}},n=function(){return $(document).off(".tags-keyboard-navigation")},e=function(e,r){return n(),$(r).parent().on("keydown.tags-keyboard-navigation",function(n){return function(n){var i;if(i=n.keyCode?n.keyCode:n.which,40===i||38===i)return n.preventDefault(),t(r,i,e)}}(this)),e.$on("$destroy",n)},{link:e,templateUrl:"components/tags/tag-dropdown/tag-dropdown.html",scope:{onSelectTag:"&",colorArray:"=",tag:"="}}},e.directive("tgTagsDropdown",t)}.call(this),function(){var t,e,r;r=this.taiga.trim,e=angular.module("taigaCommon"),t=function(){function t(t){this.tagLineService=t,this.disableColorSelection=!1,this.newTag={name:"",color:null},this.colorArray=[],this.addTag=!1}return t.$inject=["tgTagLineService"],t.prototype.checkPermissions=function(){return this.tagLineService.checkPermissions(this.project.my_permissions,this.permissions)},t.prototype._createColorsArray=function(t){return this.colorArray=this.tagLineService.createColorsArray(t)},t.prototype.displayTagInput=function(){return this.addTag=!0},t.prototype.addNewTag=function(t,e){if(this.newTag.name="",this.newTag.color=null,t.length)return this.disableColorSelection?t.length?this.onAddTag({name:t,color:e}):void 0:(this.project.tags_colors[t]&&(e=this.project.tags_colors[t]),this.onAddTag({name:t,color:e}))},t.prototype.selectColor=function(t){return this.newTag.color=t},t}(),e.controller("TagLineCommonCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){var t;return t=function(t,e,r,n){var i;return _.isUndefined(r.disableColorSelection)||(n.disableColorSelection=!0),i=t.$watch("vm.project",function(t){if(t&&Object.keys(t).length)return i(),n.disableColorSelection?void 0:n.colorArray=n._createColorsArray(n.project.tags_colors)}),e.on("keydown",".tag-input",function(r){var i;return 27===r.keyCode?(n.addTag=!1,n.newTag.name="",n.newTag.color="",r.stopPropagation()):13===r.keyCode&&(r.preventDefault(),e.find(".tags-dropdown .selected").length?(i=$(".tags-dropdown .selected .tags-dropdown-name").text(),n.addNewTag(i,null)):n.addNewTag(n.newTag.name,n.newTag.color)),t.$apply()})},{link:t,scope:{permissions:"@",loadingAddTag:"=",loadingRemoveTag:"=",tags:"=",project:"=",onAddTag:"&",onDeleteTag:"&"},templateUrl:"components/tags/tag-line-common/tag-line-common.html",controller:"TagLineCommonCtrl",controllerAs:"vm",bindToController:!0}},e.directive("tgTagLineCommon",t)}.call(this),function(){var t,e,r;r=this.taiga.trim,e=angular.module("taigaCommon"),t=function(){function t(t,e,r){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.loadingAddTag=!1}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation"],t.prototype.onDeleteTag=function(t){var e,n,i,o;return this.loadingRemoveTag=t[0],n=function(t){return function(e){return t.rootScope.$broadcast("object:updated"),t.loadingRemoveTag=!1,e}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.loadingRemoveTag=!1}}(this),i=r(t[0].toLowerCase()),o=this.modelTransform.save(function(t){var e;return e=_.clone(t.tags),_.remove(e,function(t){return t[0]===i}),t.tags=e,t}),o.then(n,e)},t.prototype.onAddTag=function(t,e){var n,i,o;return this.loadingAddTag=!0,i=function(t){return function(e){return t.rootScope.$broadcast("object:updated"),t.addTag=!1,t.loadingAddTag=!1,e}}(this),n=function(t){return function(){return t.loadingAddTag=!1,t.confirm.notify("error")}}(this),o=this.modelTransform.save(function(n){return function(n){var i,o;return o=r(t.toLowerCase()),i=_.clone(n.tags),i.push([t,e]),n.tags=i,n}}(this)),o.then(i,n)},t}(),e.controller("TagLineCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){return{scope:{item:"=",permissions:"@",project:"="},templateUrl:"components/tags/tag-line-detail/tag-line-detail.html",controller:"TagLineCtrl",controllerAs:"vm",bindToController:!0}},e.directive("tgTagLine",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=angular.module("taigaCommon"),t=function(t){function e(){}return r(e,t),e.$inject=[],e.prototype.checkPermissions=function(t,e){return _.includes(t,e)},e.prototype.createColorsArray=function(t){return _.map(t,function(t,e){return[e,t]})},e}(taiga.Service),e.service("tgTagLineService",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){return{templateUrl:"components/tags/tag/tag.html",scope:{tag:"<",loadingRemoveTag:"<",onDeleteTag:"&",hasPermissions:"@"}}},e.directive("tgTag",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o,s;return e.zoomIndex=t.get("taskboard_zoom")||2,e.levels=4,s=[["ref"],["subject"],["owner","tags","extra_info","unfold"],["attachments","empty_extra_info"],["related_tasks"]],o=function(e){return null==e&&(e=0),t.get("taskboard_zoom")!==e&&t.set("taskboard_zoom",e),_.reduce(s,function(t,r,n){return n<=e&&(t=t.concat(r)),t})},e.$watch("zoomIndex",function(t){var r;return r=o(t),e.onZoomChange({zoomLevel:t,zoom:r})})},{scope:{onZoomChange:"&"},template:'',link:e}},angular.module("taigaComponents").directive("tgTaskboardZoom",["$tgStorage",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.privacyPolicyUrl=t.get("privacyPolicyUrl"),e.termsOfServiceUrl=t.get("termsOfServiceUrl")},{restrict:"AE",scope:{},link:e,templateUrl:"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html"}},angular.module("taigaComponents").directive("tgTermsOfServiceAndPrivacyPolicyNotice",["$tgConfig",t])}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i){return r.vm={},r.vm.tribeHost=t.config.tribeHost,r.vm.url=e.protocol()+"://"+e.host(),"http"===e.protocol()&&80!==e.port()?r.vm.url=r.vm.url+":"+e.port():"https"===e.protocol()&&443!==e.port()?r.vm.url=r.vm.url+":"+e.port():void 0},{scope:{usId:"=",projectSlug:"="},controllerAs:"vm",templateUrl:"components/tribe-button/tribe-button.html",link:r}},t.$inject=["$tgConfig","$tgLocation"],angular.module("taigaComponents").directive("tgTribeButton",t)}.call(this),function(){var t;t=function(t){var e,r;return r=function(e,r,n){return e.vm={},e.vm.tribeHost=t.config.tribeHost,e.vm.show=function(){return e.vm.open=!0},e.vm.hide=function(t){return e.vm.open=!1}},e={templateUrl:"components/tribe-button/tribe-linked.html",scope:{gigTitle:"=",gigId:"="},link:r}},t.$inject=["$tgConfig"],angular.module("taigaComponents").directive("tgTribeLinked",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return t.$inject=["tgCurrentUserService"],t.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},t.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},t.prototype.toggleVote=function(){var t;return this.loading=!0,t=this.item.is_voter?this._downvote():this._upvote(),t["finally"](function(t){return function(){return t.loading=!1}}(this)),t},t.prototype._upvote=function(){return this.onUpvote().then(function(t){return function(){return t.showTextWhenMouseIsLeave()}}(this))},t.prototype._downvote=function(){return this.onDownvote()},t}(),angular.module("taigaComponents").controller("VoteButton",t)}.call(this),function(){var t;t=function(){return{scope:{},controller:"VoteButton",bindToController:{item:"=",onUpvote:"=",onDownvote:"="},controllerAs:"vm",templateUrl:"components/vote-button/vote-button.html"}},angular.module("taigaComponents").directive("tgVoteButton",t)}.call(this),function(){var t;t=function(){function t(t,e){this.currentUserService=t,this.rootScope=e,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return t.$inject=["tgCurrentUserService","$rootScope"],t.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},t.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},t.prototype.openWatchers=function(){return this.rootScope.$broadcast("watcher:add",this.item)},t.prototype.getPerms=function(){var t,e;return this.item?(t=this.item._name,e={userstories:"modify_us",issues:"modify_issue",tasks:"modify_task",epics:"modify_epic"},e[t]):""},t.prototype.toggleWatch=function(){var t;return this.loading=!0,t=this.item.is_watcher?this._unwatch():this._watch(),t["finally"](function(t){return function(){return t.loading=!1}}(this)),t},t.prototype._watch=function(){return this.onWatch().then(function(t){return function(){return t.showTextWhenMouseIsLeave()}}(this))},t.prototype._unwatch=function(){return this.onUnwatch()},t}(),angular.module("taigaComponents").controller("WatchButton",t)}.call(this),function(){var t;t=function(){return{scope:{},controller:"WatchButton",bindToController:{item:"=",onWatch:"=",onUnwatch:"="},controllerAs:"vm",templateUrl:function(t,e){return"components/watch-button/watch-button-"+e.environment+".html"}}},angular.module("taigaComponents").directive("tgWatchButton",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return i={epics:"epic",userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.comment.comment.id,i[e.vm.comment.comment._name],r,!0,!0).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCommentEditWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return e.editableDescription=!1,e.saveComment=function(t,r){return e.content="",e.vm.type.comment=t,e.vm.onAddComment({callback:r})},i={epics:"epic",userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.type.id,i[e.vm.type._name],r,!0,!0).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.onChange=function(t){return e.vm.type.comment=t},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCommentWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return i={userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.comment.comment.id,i[e.vm.comment.comment._name],r).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCustomFieldEditWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t,e,r,n,i){var o;return o=function(i,o,s){var a;return i.editableDescription=!1,i.saveDescription=function(n,i){var o;return o=t.save(function(t){return t.description=n,t}),o.then(function(){return r.notify("success"),e.$broadcast("object:updated")}),o.then(null,function(){return r.notify("error")}),o["finally"](i)},a=function(t,e){return n.addAttachment(i.project.id,i.item.id,s.type,t).then(function(t){return e(t.getIn(["file","name"]),t.getIn(["file","url"]))})},i.uploadFiles=function(t,e){var r,n,i,o;for(o=[],n=0,i=t.length;n\n \n \n\n \n\n \n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\n \n"}},angular.module("taigaComponents").directive("tgItemWysiwyg",["$tgQueueModelTransformation","$rootScope","$tgConfirm","tgAttachmentsFullService","$translate",t])}.call(this),function(){var t;t=function(){function t(){Prism.plugins.customClass.prefix("prism-"),Prism.plugins.customClass.map({})}return t.prototype.getLanguages=function(){return new Promise(function(t){return function(e,r){return t.languages?e(t.languages):t.loadPromise?t.loadPromise.then(function(){return e(t.languages)}):t.loadPromise=$.getJSON("/"+window._version+"/prism/prism-languages.json").then(function(r){return t.loadPromise=null,t.languages=_.map(r,function(t){return t.url="/"+window._version+"/prism/"+t.file,t}),e(t.languages)})}}(this))},t.prototype.getLanguageInClassList=function(t){var e;return e=_.find(this.languages,function(e){return!!_.find(t,function(t){return"language-"+e.name===t})}),e?e.name:null},t.prototype.loadLanguage=function(t){return new Promise(function(e){return Prism.languages[t]?e():ljs.load("/"+window._version+"/prism/prism-"+t+".min.js",e)})},t.prototype.replaceCodeBrToNl=function(t){return $(t).find("br").replaceWith("\n")},t.prototype.hightlightCode=function(t){var e;if(this.replaceCodeBrToNl(t),e=this.getLanguageInClassList(t.classList))return this.loadLanguage(e).then(function(){return Prism.highlightElement(t)})},t.prototype.addHightlighter=function(t){var e;return e=$(t).find("code"),e.each(function(t){return function(e,r){return t.hightlightCode(r)}}(this))},t}(),angular.module("taigaComponents").service("tgWysiwygCodeHightlighterService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){return e.$watch("visible",function(n){return n&&!r.hasClass("open")?(e.open=!0,t.open(r,null,e.onClose),e.$applyAsync(function(){var t;if(t=r[0].querySelector("textarea"))return t.select()})):!n&&r.hasClass("open")?(e.open=!1,t.close(r)):void 0})},{scope:{languages:"<",codeLanguage:"<",code:"<",visible:"<",onClose:"&",onSave:"&"},link:e,templateUrl:"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html"}},angular.module("taigaComponents").directive("tgWysiwygCodeLightbox",["lightboxService",t])}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.projectService=t,this.wysiwygService=e,this.navurls=r,this.rs=n,this.cancelablePromise=null}return t.$inject=["tgProjectService","tgWysiwygService","$tgNavUrls","$tgResources"],t.prototype.searchEmoji=function(t,e){var r;return r=this.wysiwygService.searchEmojiByName(t),r=r.slice(0,10),e(r)},t.prototype.searchUser=function(t,e){var r,n;return r=["username","full_name","full_name_display"],n=this.projectService.project.toJS().members.filter(function(e){return function(e){var n,i,o;for(n=0,i=r.length;n=0)return!0;if(e[o].indexOf(t)>=0)return!0}return!1}}(this)),n=n.slice(0,10).map(function(t){return function(e){return e.url=t.navurls.resolve("user-profile",{project:t.projectService.project.get("slug"),username:e.username}),e}}(this)),e(n)},t.prototype.searchItem=function(t){return new Promise(function(e){return function(r,n){var i,o,s,a;return t=taiga.slugify(t),s=["issues","tasks","userstories"],a={issues:"project-issues-detail",tasks:"project-tasks-detail",userstories:"project-userstories-detail"},o=["ref","subject"],i=function(e){var r,n,i;for(r=0,n=o.length;r=0)return!0;return!1},e.cancelablePromise&&e.cancelablePromise.abort(),e.cancelablePromise=e.rs.search["do"](e.projectService.project.get("id"),t),e.cancelablePromise.then(function(t){var n,o,c,u,l;if(t.count<1||t.count===t.wikipages.length)return r([]);for(u=[],n=0,c=s.length;n0&&(o=t[l].filter(i),o=o.map(function(t){return t.url=e.navurls.resolve(a[l],{project:e.projectService.project.get("slug"),ref:t.ref}),t}),u=u.concat(o));return u=_.sortBy(u,["ref"]),r(u.slice(0,10))})}}(this))},t.prototype.search=function(t){return new Promise(function(e){return function(r){return"#".indexOf(t[0])!==-1?e.searchItem(t.replace("#","")).then(r):"@".indexOf(t[0])!==-1?e.searchUser(t.replace("@",""),r):":".indexOf(t[0])!==-1?e.searchEmoji(t.replace(":",""),r):void 0}}(this))},t}(),angular.module("taigaComponents").service("tgWysiwygMentionService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.bindOnce,t=function(t,e,n,i,o,s,a,c,u,l){var p,h,f,d,g,m,v,y,b,S,j,k;return k=function(){if(window.getSelection){if(window.getSelection().empty)return window.getSelection().empty()}else{if(window.getSelection().removeAllRanges)return window.getSelection().removeAllRanges();if(document.selection)return document.selection.empty()}},m=function(t){return $(t.endContainer).parentsUntil(".editor","code")},v=function(t){return!!m(t).length},j=function(t,e){var r,n,i;return r=$(t).is("code")?t:$(t).closest("code")[0],i=r.parentNode,n=document.createElement("p"),n.innerText=r.innerText,i.parentNode.replaceChild(n,i),e.checkContentChanged(e.elements[0])},d=function(t,e){var r,n,i,o;return i=document.createElement("pre"),r=document.createElement("code"),t.startContainer.parentNode.nextSibling||$("
    ").insertAfter(t.startContainer.parentNode),o=t.endContainer.parentNode.nextSibling,n=t.extractContents(),r.appendChild(n),i.appendChild(r),o.parentNode.insertBefore(i,o),S(e),e.checkContentChanged(e.elements[0])},S=function(e){var r,n,i,o,s,a,c,u,l,p;if(e){for(l=e.elements[0].children,r=0,i=l.length;rRTL",this.button.title="RTL",this.on(this.button,"click",this.handleClick.bind(this))},getButton:function(){return this.button},handleClick:function(t){var e;return e=MediumEditor.selection.getSelectionRange(document),"right"===e.commonAncestorContainer.parentNode.style.textAlign?document.execCommand("justifyLeft",!1):document.execCommand("justifyRight",!1)}}),g=function(t){return'\n \n'},h=MediumEditor.extensions.button.extend({name:"code",init:function(){var t;return t=_.find(this.base.options.toolbar.buttons,function(t){return"code"===t.name}),this.button=this.document.createElement("button"),this.button.classList.add("medium-editor-action"),this.button.innerHTML=t.contentDefault||"Code",this.button.title="Code",this.on(this.button,"click",this.handleClick.bind(this))},getButton:function(){return this.button},tagNames:["code"],handleClick:function(t){var e,r;if(e=MediumEditor.selection.getSelectionRange(self.document),v(e,this.base)?j(e.endContainer,this.base):(d(e,this.base),k()),r=this.base.getExtensionByName("toolbar"))return r.hideToolbar()}}),f=MediumEditor.extensions.paste.extend({doPaste:function(t,e,r){var n;return n=MediumEditor.util.htmlEntities(e),MediumEditor.util.insertHTMLCommand(this.document,n)}}),b=MediumEditor.util.isBlockContainer,MediumEditor.util.isBlockContainer=function(t){var e;return t?(e=t.tagName?t.tagName:t.parentNode.tagName,"code"===e.toLowerCase()||b(t)):b(t)},y=function(o,d,m){var v,y,b,k,I,E,T,C,P,w,A,O,R,M,U,N,D,L,x,F,B,H,q;return M=null,C=d.find(".medium"),T=d.find(".markdown"),k=null,A=!!m.$attr.editonly,U=!!m.$attr.notPersist,o.required=!!m.$attr.required,o.editMode=A||!1,o.mode=n.get("editor-mode","html"),o.markdown="",o.codeEditorVisible=!1,o.codeLans=[],a.getLanguages().then(function(t){return o.codeLans=t}),L=function(t){return o.editMode=t},x=function(t){var e;if(e=i.getHTML(t),C.html(e),a.addHightlighter(M.elements[0]),o.editMode)return S(M)},o.saveSnippet=function(t,e){var r;return o.codeEditorVisible=!1,k.innerText=e,r=k.parentNode,"remove-formating"===t?(k.className="",r.className="",j(k,M)):_.trim(e).length?(t?(k.className="language-"+t,r.className="language-"+t):(k.className="",r.className=""),a.hightlightCode(k),M.checkContentChanged(M.elements[0])):(k.parentNode.parentNode.removeChild(k.parentNode),M.checkContentChanged(M.elements[0])),F(),null},o.setMode=function(t){return n.set("editor-mode",t),"markdown"===t?H():x(o.markdown),o.mode=t,M.trigger("editableBlur",{},C[0])},o.save=function(t){t&&t.preventDefault(),"html"===o.mode&&H(),x(o.markdown),o.required&&!o.markdown.length||(o.saving=!0,o.outdated=!1,o.onSave({text:o.markdown,cb:D}))},o.cancel=function(t){t&&t.preventDefault(),A||L(!1),U?b():"html"===o.mode&&x(o.content||null),o.markdown=o.content,E(),M.trigger("blur",{},C[0]),o.outdated=!1,S(M),o.onCancel()},b=function(){return o.markdown="",C.html("")},D=function(){return o.saving=!1,A||L(!1),U&&b(),E(),M.trigger("blur",{},C[0]),u.trackEvent("develop","save wysiwyg",o.mode,1)},q=function(t,e){return r.isImage(t)?M.pasteHTML("
    "):(t=$("
    ").text(t).html(),M.pasteHTML(""+t+"
    "))},O=function(){var t;return t=n.get(o.storageKey),!(!t||!t.version||t.version===o.version)},w=function(){var t;return t=n.get(o.storageKey), !!t},P=function(){var t;return t=n.get(o.storageKey),t?t.text:o.content},E=function(){return n.remove(o.storageKey)},v=function(){var r,n;return o.content===o.markdown?(o.cancel(),document.activeElement.blur(),document.body.click(),null):(n=t.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE"),r=t.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE"),e.ask(n,null,r).then(function(t){return o.cancel(),t.finish()}))},N=function(){var t;return t=$("
    ").html(C.html()),t.find("code br").replaceWith("\n"),t.html()},H=function(){var t;return t=N(),o.markdown=i.getMarkdown(t)},R=function(t){var e;if(o.storageKey)return e={},e.version=o.version||0,e.text=t,n.set(o.storageKey,e)},y=function(){return"html"===o.mode&&H(),R(o.markdown),o.onChange({markdown:o.markdown})},F=_.throttle(y,200),I=function(t,e){var r;return null==e&&(e=!1),t.length&&(r=i.getHTML(t),C.html(r)),M=new MediumEditor(C[0],{imageDragging:!1,placeholder:{text:o.placeholder},toolbar:{buttons:[{name:"bold",contentDefault:g("editor-bold")},{name:"italic",contentDefault:g("editor-italic")},{name:"strikethrough",contentDefault:g("editor-cross-out")},{name:"anchor",contentDefault:g("editor-link")},{name:"image",contentDefault:g("editor-image")},{name:"orderedlist",contentDefault:g("editor-list-n")},{name:"unorderedlist",contentDefault:g("editor-list-o")},{name:"h1",contentDefault:g("editor-h1")},{name:"h2",contentDefault:g("editor-h2")},{name:"h3",contentDefault:g("editor-h3")},{name:"quote",contentDefault:g("editor-quote")},{name:"removeFormat",contentDefault:g("editor-no-format")},{name:"rtl",contentDefault:g("editor-rtl")},{name:"code",contentDefault:g("editor-code")}]},extensions:{paste:new f,code:new h,autolist:new AutoList,alignright:new p,mediumMention:new MentionExtension({getItems:function(t,e){return c.search(t).then(e)}})}}),o.changeMarkdown=F,M.subscribe("editableInput",function(t){return o.$applyAsync(F)}),M.subscribe("editableClick",function(t){var e;if(e=new RegExp("^(?:[a-z]+:)?//","i"),t.target.href)return e.test(t.target.getAttribute("href"))||"_blank"===t.target.getAttribute("target")?(t.stopPropagation(),window.open(t.target.href)):l.url(t.target.href)}),M.subscribe("editableDrop",function(t){return o.onUploadFile({files:t.dataTransfer.files,cb:q})}),M.subscribe("editableKeydown",function(t){var e,r;return e=t.keyCode?t.keyCode:t.which,r=$(".medium-mention"),40!==e&&38!==e||!r.length?o.editMode&&27===e?(t.stopPropagation(),o.$applyAsync(v)):27===e?C.blur():void 0:(t.stopPropagation(),void t.preventDefault())}),L(e),o.$applyAsync(function(){return a.addHightlighter(M.elements[0]),S(M)})},$(C[0]).on("mousedown",function(t){return t.target.href?(t.preventDefault(),t.stopPropagation()):o.$applyAsync(function(){if(!o.editMode)return L(!0),S(M)})}),$(C[0]).on("dblclick","pre",function(t){return o.$applyAsync(function(){return o.codeEditorVisible=!0,k=t.currentTarget.querySelector("code"),o.currentCodeLanguage=a.getLanguageInClassList(k.classList),o.code=k.innerText})}),B=o.$watch("content",function(t){var e;if(!_.isUndefined(t)){if(o.outdated=O(),!M&&w()&&L(!0),(o.markdown.length||t.length)&&o.markdown===t)return;return t=P(),o.markdown=t,M&&M.destroy(),s.open()?e=s.onEnd(function(){return I(t,o.editMode),e()}):I(t,o.editMode),B()}}),o.$on("$destroy",function(){if(M)return C.length&&$(C[0]).off(),M.destroy()})},{templateUrl:"common/components/wysiwyg-toolbar.html",scope:{placeholder:"@",version:"<",storageKey:"<",content:"<",onCancel:"&",onSave:"&",onUploadFile:"&",onChange:"&"},link:y}},angular.module("taigaComponents").directive("tgWysiwyg",["$translate","$tgConfirm","$tgStorage","tgWysiwygService","animationFrame","tgLoader","tgWysiwygCodeHightlighterService","tgWysiwygMentionService","$tgAnalytics","$location",t])}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.wysiwygCodeHightlighterService=t,this.projectService=e,this.navurls=r,this.emojis=n}return t.$inject=["tgWysiwygCodeHightlighterService","tgProjectService","$tgNavUrls","$tgEmojis"],t.prototype.searchEmojiByName=function(t){return this.emojis.searchByName(t)},t.prototype.pipeLinks=function(t){return t.replace(/\[\[(.*?)\]\]/g,function(t,e,r,n){var i,o,s;return o=e.split("|"),i=o[0],s=o[1]||o[0],"["+s+"]("+i+")"})},t.prototype.replaceUrls=function(t){var e,r,n,i,o;for(e=document.createElement("html"),e.innerHTML=t,o=e.querySelectorAll("a"),r=0,n=o.length;r(.*?)
    <\/li>/g,"
  • $1
  • ")},t.prototype.getMarkdown=function(t){var e,r,n;return e={filter:["html","body","span","div"],replacement:function(t){return t}},r={filter:function(t){return function(t){return"PRE"===t.nodeName&&t.firstChild&&"CODE"===t.firstChild.nodeName}}(this),replacement:function(t){return function(e,r){var n;return n=t.wysiwygCodeHightlighterService.getLanguageInClassList(r.firstChild.classList),n||(n=""),"\n\n```"+n+"\n"+_.trim(r.firstChild.textContent)+"\n```\n\n"}}(this)},t=t.replace(/ (<\/.*>)/g,"$1"),t=this.emojis.replaceImgsByEmojiName(t),t=this.replaceUrls(t),t=this.removeTrailingListBr(t),n=toMarkdown(t,{gfm:!0,converters:[e,r]})},t.prototype.parseMentionMatches=function(t){var e,r,n,i,o,s,a;for(s="twitter",a=this.tagBuilder,r=[],o=/@[^\s]{1,50}[^.\s]/g,e=o.exec(t);null!==e;)n=e.index,i=t.charAt(n-1),e.index===o.lastIndex&&o.lastIndex++,e.forEach(function(t,e){return r.push(new Autolinker.match.Mention({tagBuilder:a,matchedText:t,offset:n,serviceName:s,mention:t.slice(1)}))}),e=o.exec(t);return r},t.prototype.autoLinkHTML=function(t){var e,r;return r=String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter),r.indexOf(".")===-1&&(r="@[^s]{1,50}[^.s]"),e=new Autolinker({mention:"twitter",hashtag:"twitter",replaceFn:function(t){return function(e){var r,n;return"mention"===e.getType()?(r=t.navurls.resolve("user-profile",{project:t.projectService.project.get("slug"),username:e.getMention()}),'@'+e.getMention()+""):"hashtag"===e.getType()?(n=t.navurls.resolve("project-detail-ref",{project:t.projectService.project.get("slug"),ref:e.getHashtag()}),'#'+e.getHashtag()+""):void 0}}(this)}),Autolinker.matcher.Mention.prototype.parseMatches=this.parseMentionMatches.bind(e),e.link(t)},t.prototype.getHTML=function(t){var e,r,n;return t&&t.length?(r={breaks:!0},t=this.emojis.replaceEmojiNameByImgs(t),t=this.pipeLinks(t),e=window.markdownit({breaks:!0}),e.use(window.markdownitLazyHeaders),n=e.render(t),n=this.searchWikiLinks(n),n=this.autoLinkHTML(n)):""},t}(),angular.module("taigaComponents").service("tgWysiwygService",t)}.call(this),function(){var t;t=function(){function t(t){this.translate=t,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 t.$inject=["$translate"],t.prototype.currentText=function(){return this.texts[this.currentOrderBy]},t.prototype.open=function(){return this.is_open=!0},t.prototype.close=function(){return this.is_open=!1},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.is_open=!1,this.onChange({orderBy:this.currentOrderBy})},t}(),angular.module("taigaDiscover").controller("DiscoverHomeOrderBy",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"DiscoverHomeOrderBy",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-home-order-by/discover-home-order-by.html",scope:{currentOrderBy:"=orderBy",onChange:"&"},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverHomeOrderBy",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.discoverProjectsService.projectsCount}}(this)),this.discoverProjectsService.fetchStats()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.selectFilter=function(t){return this.onChange({filter:t,q:this.q})},t.prototype.submitFilter=function(){return this.onChange({filter:this.filter,q:this.q})},t}(),angular.module("taigaDiscover").controller("DiscoverSearchBar",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{controller:"DiscoverSearchBar",controllerAs:"vm",templateUrl:"discover/components/discover-search-bar/discover-search-bar.html",bindToController:!0,scope:{q:"=",filter:"=",onChange:"&"},compile:function(t,e){if(!e.q)return e.q=""},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchBar",t)}.call(this),function(){var t;t=function(){function t(){this.like_is_open=0===this.orderBy.indexOf("-total_fans"),this.activity_is_open=0===this.orderBy.indexOf("-total_activity")}return t.$inject=[],t.prototype.openLike=function(){return this.like_is_open=!0,this.activity_is_open=!1,this.setOrderBy("-total_fans_last_week")},t.prototype.openActivity=function(){return this.activity_is_open=!0,this.like_is_open=!1,this.setOrderBy("-total_activity_last_week")},t.prototype.setOrderBy=function(t){return null==t&&(t=""),t||(this.like_is_open=!1,this.activity_is_open=!1),this.onChange({orderBy:t})},t}(),angular.module("taigaDiscover").controller("DiscoverSearchListHeader",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"DiscoverSearchListHeader",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-search-list-header/discover-search-list-header.html",scope:{onChange:"&",orderBy:"="},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchListHeader",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"featured",function(t){return function(){return t.discoverProjectsService.featured}}(this)),this.discoverProjectsService.fetchFeatured()}return t.$inject=["tgDiscoverProjectsService"],t}(),angular.module("taigaDiscover").controller("FeaturedProjects",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"FeaturedProjects",controllerAs:"vm",templateUrl:"discover/components/featured-projects/featured-projects.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgFeaturedProjects",t)}.call(this),function(){var t;t=function(){return{templateUrl:"discover/components/highlighted/highlighted.html",scope:{loading:"=",highlighted:"=",orderBy:"="}}},t.$inject=[],angular.module("taigaDiscover").directive("tgHighlighted",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"highlighted",function(t){return function(){return t.discoverProjectsService.mostActive}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostActive({order_by:this.order_by}).then(function(t){return function(){return t.loading=!1}}(this))},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.fetch()},t.prototype.getOrderBy=function(t){return"all"===this.currentOrderBy?"-total_activity":"-total_activity_last_"+this.currentOrderBy},t}(),angular.module("taigaDiscover").controller("MostActive",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"MostActive",controllerAs:"vm",templateUrl:"discover/components/most-active/most-active.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgMostActive",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"highlighted",function(t){return function(){return t.discoverProjectsService.mostLiked}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostLiked({order_by:this.order_by}).then(function(t){return function(){return t.loading=!1}}(this))},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.fetch()},t.prototype.getOrderBy=function(){return"all"===this.currentOrderBy?"-total_fans":"-total_fans_last_"+this.currentOrderBy},t}(),angular.module("taigaDiscover").controller("MostLiked",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"MostLiked",controllerAs:"vm",templateUrl:"discover/components/most-liked/most-liked.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgMostLiked",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){var i,o;this.location=t,this.navUrls=e,this.appMetaService=r,this.translate=n,o=this.translate.instant("DISCOVER.PAGE_TITLE"),i=this.translate.instant("DISCOVER.PAGE_DESCRIPTION"),this.appMetaService.setAll(o,i)}return t.$inject=["$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],t.prototype.onSubmit=function(t){var e;return e=this.navUrls.resolve("discover-search"),this.location.search("text",t).path(e)},t}(),angular.module("taigaDiscover").controller("DiscoverHome",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n,i,o,s){var a,c;this.routeParams=t,this.discoverProjectsService=e,this.route=r,this.location=n,this.analytics=i,this.appMetaService=o,this.translate=s,this.page=1,taiga.defineImmutableProperty(this,"searchResult",function(t){return function(){return t.discoverProjectsService.searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(t){return function(){return t.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,c=this.translate.instant("DISCOVER.SEARCH.PAGE_TITLE"),a=this.translate.instant("DISCOVER.SEARCH.PAGE_DESCRIPTION"),this.appMetaService.setAll(c,a),this.analytics.trackPage(this.location.url(),"Discover Search")}return t.$inject=["$routeParams","tgDiscoverProjectsService","$route","$tgLocation","$tgAnalytics","tgAppMetaService","$translate"],t.prototype.fetch=function(){return this.page=1,this.discoverProjectsService.resetSearchList(),this.search()},t.prototype.fetchByGlobalSearch=function(){if(!this.loadingGlobal)return this.loadingGlobal=!0,this.fetch().then(function(t){return function(){return t.loadingGlobal=!1}}(this))},t.prototype.fetchByOrderBy=function(){if(!this.loadingList)return this.loadingList=!0,this.fetch().then(function(t){return function(){return t.loadingList=!1}}(this))},t.prototype.showMore=function(){if(!this.loadingPagination)return this.loadingPagination=!0,this.page++,this.search().then(function(t){return function(){return t.loadingPagination=!1}}(this))},t.prototype.search=function(){var t,e;return t=this.getFilter(),e={page:this.page,q:this.q,order_by:this.orderBy},_.assign(e,t),this.discoverProjectsService.fetchSearch(e)},t.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}:{}},t.prototype.onChangeFilter=function(t,e){return this.filter=t,this.q=e,this.route.updateParams({filter:this.filter,text:this.q}),this.analytics.trackPage(this.location.url(),"Discover Search"),this.fetchByGlobalSearch()},t.prototype.onChangeOrder=function(t){return this.orderBy=t,this.route.updateParams({order_by:t}),this.analytics.trackPage(this.location.url(),"Discover Search"),this.fetchByOrderBy()},t}(),angular.module("taigaDiscover").controller("DiscoverSearch",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"DiscoverSearch",controllerAs:"vm",link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearch",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function n(t,r){this.rs=t,this.projectsService=r,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),e.defineImmutableProperty(this,"mostLiked",function(t){return function(){return t._mostLiked}}(this)),e.defineImmutableProperty(this,"mostActive",function(t){return function(){return t._mostActive}}(this)),e.defineImmutableProperty(this,"featured",function(t){return function(){return t._featured}}(this)),e.defineImmutableProperty(this,"searchResult",function(t){return function(){return t._searchResult}}(this)),e.defineImmutableProperty(this,"nextSearchPage",function(t){return function(){return t._nextSearchPage}}(this)),e.defineImmutableProperty(this,"projectsCount",function(t){return function(){return t._projectsCount}}(this))}var i;return r(n,t),n.$inject=["tgResources","tgProjectsService"],i={discover_mode:!0},n.prototype.fetchMostLiked=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,5),n=Immutable.fromJS(r),n=n.map(t.decorate),t._mostLiked=n}}(this))},n.prototype.fetchMostActive=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,5),n=Immutable.fromJS(r),n=n.map(t.decorate),t._mostActive=n}}(this))},n.prototype.fetchFeatured=function(){var t;return t=_.extend({},i),t.is_featured=!0,this.rs.projects.getProjects(t,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,4),n=Immutable.fromJS(r),n=n.map(t.decorate),t._featured=n}}(this))},n.prototype.resetSearchList=function(){return this._searchResult=Immutable.List()},n.prototype.fetchStats=function(){return this.rs.stats.discover().then(function(t){return function(e){return t._projectsCount=e.getIn(["projects","total"])}}(this))},n.prototype.fetchSearch=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e).then(function(t){return function(e){var r;return t._nextSearchPage=!!e.headers("X-Pagination-Next"),r=Immutable.fromJS(e.data),r=r.map(t.decorate),t._searchResult=t._searchResult.concat(r)}}(this))},n}(e.Service),angular.module("taigaDiscover").service("tgDiscoverProjectsService",t)}.call(this),function(){var t,e,r,n;r=this.taiga,n=r.trim,e=r.getRandomDefaultColor,t=function(){function t(t,r,n,i){this.confirm=t,this.projectService=r,this.epicsService=n,this.analytics=i,this.project=this.projectService.project.toJS(),this.newEpic={color:e(),status:this.project.default_epic_status,tags:[]},this.attachments=Immutable.List(),this.loading=!1}return t.$inject=["$tgConfirm","tgProjectService","tgEpicsService","$tgAnalytics"],t.prototype.createEpic=function(){if(this.validateForm())return this.loading=!0,this.epicsService.createEpic(this.newEpic,this.attachments).then(function(t){return function(e){return t.analytics.trackEvent("epic","create","create epic",1),t.onCreateEpic(),t.loading=!1}}(this))["catch"](function(t){return function(e){if(t.loading=!1,t.setFormErrors(e.data),e.data._error_message)return t.confirm.notify("error",e.data._error_message)}}(this))},t.prototype.selectColor=function(t){return this.newEpic.color=t},t.prototype.addTag=function(t,e){if(t=n(t.toLowerCase()),!_.find(this.newEpic.tags,function(e){return e[0]===t}))return this.newEpic.tags.push([t,e])},t.prototype.deleteTag=function(t){return _.remove(this.newEpic.tags,function(e){return e[0]===t[0]})},t.prototype.addAttachment=function(t){return this.attachments.push(t)},t}(),angular.module("taigaEpics").controller("CreateEpicCtrl",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=e.find("form").checksley(),n.validateForm=function(t){return function(){return i.validate()}}(this),n.setFormErrors=function(t){return function(t){return i.setErrors(t)}}(this)},{link:t,templateUrl:"epics/create-epic/create-epic.html",controller:"CreateEpicCtrl",controllerAs:"vm",bindToController:{onCreateEpic:"&"},scope:{}}},angular.module("taigaEpics").directive("tgCreateEpic",t)}.call(this),function(){var t;t=function(){function t(t,e,r){this.confirm=t,this.projectService=e,this.epicsService=r,this.displayUserStories=!1,this.displayAssignedTo=!1,this.displayStatusList=!1,this.loadingStatus=!1,this.project=this.projectService.project.toJS(),this._calculateProgressBar()}return t.$inject=["$tgConfirm","tgProjectService","tgEpicsService"],t.prototype._calculateProgressBar=function(){var t,e;return this.epic.getIn(["status_extra_info","is_closed"])===!0?this.percentage="100%":(t=this.epic.getIn(["user_stories_counts","progress"]),e=this.epic.getIn(["user_stories_counts","total"]),0===e?this.percentage="0%":this.percentage=100*t/e+"%")},t.prototype.canEditEpics=function(){return this.projectService.hasPermission("modify_epic")},t.prototype.toggleUserStoryList=function(){return this.displayUserStories?this.displayUserStories=!1:this.epicsService.listRelatedUserStories(this.epic).then(function(t){return function(e){return t.epicStories=e,t.displayUserStories=!0}}(this))["catch"](function(t){return function(){return t.confirm.notify("error")}}(this))},t.prototype.updateStatus=function(t){return this.displayStatusList=!1,this.loadingStatus=!0,this.epicsService.updateEpicStatus(this.epic,t)["catch"](function(t){return function(){return t.confirm.notify("error")}}(this))["finally"](function(t){return function(){return t.loadingStatus=!1}}(this))},t.prototype.updateAssignedTo=function(t){return this.assignLoader=!0,this.epicsService.updateEpicAssignedTo(this.epic,(null!=t?t.id:void 0)||null)["catch"](function(t){return function(){return t.confirm.notify("error")}}(this)).then(function(t){return function(){return t.assignLoader=!1}}(this))},t}(),angular.module("taigaEpics").controller("EpicRowCtrl",t)}.call(this),function(){var t;t=function(){return{templateUrl:"epics/dashboard/epic-row/epic-row.html",controller:"EpicRowCtrl",controllerAs:"vm",bindToController:!0,scope:{epic:"=",column:"="}}},angular.module("taigaEpics").directive("tgEpicRow",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i,o,s,a,c,u){this.params=t,this.errorHandlingService=r,this.lightboxFactory=n,this.lightboxService=i,this.confirm=o,this.projectService=s,this.epicsService=a,this.appMetaService=c,this.translate=u,this.sectionName="EPICS.SECTION_NAME",e.defineImmutableProperty(this,"project",function(t){return function(){return t.projectService.project}}(this)),e.defineImmutableProperty(this,"epics",function(t){return function(){return t.epicsService.epics}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return t.$inject=["$routeParams","tgErrorHandlingService","tgLightboxFactory","lightboxService","$tgConfirm","tgProjectService","tgEpicsService","tgAppMetaService","$translate"],t.prototype._setMeta=function(){var t;return this.project?(t={projectName:this.project.get("name"),projectDescription:this.project.get("description")},{title:this.translate.instant("EPICS.PAGE_TITLE",t),description:this.translate.instant("EPICS.PAGE_DESCRIPTION",t)}):null},t.prototype.loadInitialData=function(){return this.epicsService.clear(),this.projectService.setProjectBySlug(this.params.pslug).then(function(t){return function(){return t.projectService.isEpicsDashboardEnabled()?t.projectService.hasPermission("view_epics")?t.epicsService.fetchEpics():t.errorHandlingService.permissionDenied():t.errorHandlingService.notFound()}}(this))},t.prototype.canCreateEpics=function(){return this.projectService.hasPermission("add_epic")},t.prototype.onCreateEpic=function(){var t;return t=function(t){return function(){t.lightboxService.closeAll(),t.confirm.notify("success")}}(this),this.lightboxFactory.create("tg-create-epic",{"class":"lightbox lightbox-create-epic open","on-create-epic":"onCreateEpic()"},{onCreateEpic:t.bind(this)})},t}(),angular.module("taigaEpics").controller("EpicsDashboardCtrl",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i){var o,s,a;if(e.hasPermission("modify_epic"))return o=t(i.tgEpicsSortable),s=dragula([n[0]],{copySortSource:!1,copy:!1,mirrorContainer:n[0],moves:function(t){return $(t).is("div.epics-table-body-row")}}),s.on("dragend",function(t){var e,n,i;return n=$(t),e=n.scope().epic,i=n.index(),r.$apply(function(){return o(r,{epic:e,newIndex:i})})}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&s.dragging}}),r.$on("$destroy",function(){return n.off(),s.destroy()})},{link:r}},t.$inject=["$parse","tgProjectService"],angular.module("taigaComponents").directive("tgEpicsSortable",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.generateHash,t=function(){function t(t,n,i,o,s){this.confirm=t,this.epicsService=n,this.timeout=i,this.storage=o,this.projectService=s,this.hash=e([this.projectService.project.get("id"),"epics"]),this.displayOptions=!1,this.displayVotes=!0,this.column=this.storage.get(this.hash,{votes:!0,name:!0,project:!0,sprint:!0,assigned:!0,status:!0,progress:!0}),r.defineImmutableProperty(this,"epics",function(t){return function(){return t.epicsService.epics}}(this)),r.defineImmutableProperty(this,"disabledEpicsPagination",function(t){return function(){return t.epicsService._disablePagination}}(this)),r.defineImmutableProperty(this,"loadingEpics",function(t){return function(){return t.epicsService._loadingEpics}}(this))}return t.$inject=["$tgConfirm","tgEpicsService","$timeout","$tgStorage","tgProjectService"],t.prototype.toggleEpicTableOptions=function(){return this.displayOptions=!this.displayOptions},t.prototype.reorderEpic=function(t,e){return t.get("epics_order")===e?null:this.epicsService.reorderEpic(t,e).then(null,function(t){return function(){return t.confirm.notify("error")}}(this))},t.prototype.nextPage=function(){return this.epicsService.nextPage()},t.prototype.hoverEpicTableOption=function(){if(this.timer)return this.timeout.cancel(this.timer)},t.prototype.hideEpicTableOption=function(){return this.timer=this.timeout(function(t){return function(){return t.displayOptions=!1}}(this),400)},t.prototype.updateViewOptions=function(){return this.storage.set(this.hash,this.column)},t}(),angular.module("taigaEpics").controller("EpicsTableCtrl",t)}.call(this),function(){var t;t=function(){return{templateUrl:"epics/dashboard/epics-table/epics-table.html",controller:"EpicsTableCtrl",controllerAs:"vm",scope:{}}},angular.module("taigaEpics").directive("tgEpicsTable",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(){this._calculateProgressBar()}return t.$inject=[],t.prototype._calculateProgressBar=function(){var t,e;return this.story.get("is_closed")===!0?this.percentage="100%":(t=this.story.get("tasks").size,e=this.story.get("tasks").filter(function(t){return t.get("is_closed")}).size,0===t?this.percentage="0%":this.percentage=100*e/t+"%")},t}(),e.controller("StoryRowCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){return{templateUrl:"epics/dashboard/story-row/story-row.html",controller:"StoryRowCtrl",controllerAs:"vm",bindToController:!0,scope:{story:"=",column:"="}}},e.directive("tgStoryRow",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i){this.projectService=t,this.attachmentsService=r,this.resources=n,this.xhrError=i,this.clear(),e.defineImmutableProperty(this,"epics",function(t){return function(){return t._epics}}(this))}return t.$inject=["tgProjectService","tgAttachmentsService","tgResources","tgXhrErrorService"],t.prototype.clear=function(){return this._loadingEpics=!1,this._disablePagination=!1,this._page=1,this._epics=Immutable.List()},t.prototype.fetchEpics=function(t){return null==t&&(t=!1),this._loadingEpics=!0,this._disablePagination=!0,this.resources.epics.list(this.projectService.project.get("id"),this._page).then(function(e){return function(r){return t?(e.clear(),e._epics=r.list):e._epics=e._epics.concat(r.list),e._loadingEpics=!1,e._disablePagination=!r.headers("x-pagination-next")}}(this))["catch"](function(t){return function(e){return t.xhrError.response(e)}}(this))},t.prototype.nextPage=function(){return this._page++,this.fetchEpics()},t.prototype.listRelatedUserStories=function(t){return this.resources.userstories.listInEpic(t.get("id"))},t.prototype.createEpic=function(t,e){return t.project=this.projectService.project.get("id"),this.resources.epics.post(t).then(function(t){return function(r){var n;return n=_.map(e.toJS(),function(e){return t.attachmentsService.upload(e.file,r.get("id"),r.get("project"),"epic")}),Promise.all(n).then(t.fetchEpics.bind(t,!0))}}(this))},t.prototype.reorderEpic=function(t,e){var r,n,i,o,s,a,c,u,l;return s={},this._epics.forEach(function(t){return s[t.get("id")]=t.get("epics_order")}),l=this.epics.filter(function(e){return function(e){return e.get("id")!==t.get("id")}}(this)),n=l.slice(0,e),r=l.slice(e),a=n.last(),o=a?a.get("epics_order")+1:0,s[t.get("id")]=o,c=n.filter(function(t){return function(t){return t.get("epics_order")===a.get("epics_order")}}(this)),u=_.fromPairs(c.map(function(t){return function(t){return[t.get("id"),t.get("epics_order")]}}(this)).toJS()),r.forEach(function(t){return s[t.get("id")]=t.get("epics_order")+1}),this._epics=this._epics.map(function(t){return t.set("epics_order",s[t.get("id")])}),this._epics=this._epics.sortBy(function(t){return t.get("epics_order")}),i={epics_order:o,version:t.get("version")},this.resources.epics.reorder(t.get("id"),i,u).then(function(t){return function(e){return t._epics=t._epics.map(function(t){return t.get("id")===e.get("id")?e:t})}}(this))},t.prototype.reorderRelatedUserstory=function(t,e,r,n){var i,o,s,a,c,u,l,p,h;return h=e.filter(function(t){return function(t){return t.get("id")!==r.get("id")}}(this)),i=h.slice(0,n),c=i.last(),a=c?c.get("epic_order")+1:0,u=i.filter(function(t){return function(t){return t.get("epic_order")===c.get("epic_order")}}(this)),l=_.fromPairs(u.map(function(t){return function(t){return[t.get("id"),t.get("epic_order")]}}(this)).toJS()),o={order:a},s=t.get("id"),p=r.get("id"),this.resources.epics.reorderRelatedUserstory(s,p,o,l).then(function(e){return function(){return e.listRelatedUserStories(t)}}(this))},t.prototype.replaceEpic=function(t){return this._epics=this._epics.map(function(e){return e.get("id")===t.get("id")?t:e})},t.prototype.updateEpicStatus=function(t,e){var r;return r={status:e,version:t.get("version")},this.resources.epics.patch(t.get("id"),r).then(this.replaceEpic.bind(this))},t.prototype.updateEpicAssignedTo=function(t,e){var r;return r={assigned_to:e,version:t.get("version")},this.resources.epics.patch(t.get("id"),r).then(this.replaceEpic.bind(this))},t}(),angular.module("taigaEpics").service("tgEpicsService",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e){this.projectService=t,this.epicsService=e,this.sectionName="Epics", this.showCreateRelatedUserstoriesLightbox=!1}return t.$inject=["tgProjectService","tgEpicsService"],t.prototype.showRelatedUserStoriesSection=function(){var t;return this.projectService.hasPermission("view_epics")||(null!=(t=this.userstories)?t.length:void 0)>0},t.prototype.userCanSort=function(){return this.projectService.hasPermission("modify_epic")},t.prototype.loadRelatedUserstories=function(){return this.epicsService.listRelatedUserStories(this.epic).then(function(t){return function(e){return t.userstories=e}}(this))},t.prototype.reorderRelatedUserstory=function(t,e){return this.epicsService.reorderRelatedUserstory(this.epic,this.userstories,t,e).then(function(t){return function(e){return t.userstories=e}}(this))},t}(),e.controller("RelatedUserStoriesCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e,r,n){this.currentUserService=t,this.rs=e,this.confirm=r,this.analytics=n,this.projects=null,this.projectUserstories=Immutable.List(),this.loading=!1}return t.$inject=["tgCurrentUserService","tgResources","$tgConfirm","$tgAnalytics"],t.prototype.loadProjects=function(){if(null===this.projects)return this.projects=this.currentUserService.projects.get("all")},t.prototype.filterUss=function(t,e){var r;return r=this.rs.userstories.listInAllProjects({project:t,q:e},!0).then(function(t){return function(e){var r,n;return r=t.epicUserstories.map(function(t){return t.get("id")}),n=e.filter(function(t){return r.indexOf(t.get("id"))===-1}),t.projectUserstories=n}}(this))},t.prototype.saveRelatedUserStory=function(t,e){var r,n,i;if(this.validateExistingUserstoryForm())return this.loading=!0,n=function(t){return function(e){return t.loading=!1,t.confirm.notify("error"),t.setExistingUserstoryFormErrors(e)}}(this),i=function(t){return function(){return t.analytics.trackEvent("epic related user story","create","create related user story on epic",1),t.loading=!1,e&&e(),t.loadRelatedUserstories()}}(this),r=this.epic.get("id"),this.rs.epics.addRelatedUserstory(r,t).then(i,n)},t.prototype.bulkCreateRelatedUserStories=function(t,e,r){var n,i,o;if(this.validateNewUserstoryForm())return this.loading=!0,i=function(t){return function(e){return t.loading=!1,t.confirm.notify("error"),t.setNewUserstoryFormErrors(e)}}(this),o=function(t){return function(){return t.analytics.trackEvent("epic related user story","create","create related user story on epic",1),t.loading=!1,r&&r(),t.loadRelatedUserstories()}}(this),n=this.epic.get("id"),this.rs.epics.bulkCreateRelatedUserStories(n,t,e).then(o,i)},t}(),e.controller("RelatedUserstoriesCreateCtrl",t)}.call(this),function(){var t,e,r;r=angular.module("taigaEpics"),e=this.taiga.debounceLeading,t=function(t){var r;return this.lightboxService=t,r=function(t,r,n,i){var o,s;return s=r.find(".new-user-story-form").checksley(),o=r.find(".existing-user-story-form").checksley(),i.validateNewUserstoryForm=function(t){return function(){return s.validate()}}(this),i.setNewUserstoryFormErrors=function(t){return function(t){return s.setErrors(t)}}(this),i.validateExistingUserstoryForm=function(t){return function(){return o.validate()}}(this),i.setExistingUserstoryFormErrors=function(t){return function(t){return o.setErrors(t)}}(this),t.showLightbox=function(e){return i.loadProjects(),t.selectProject(e).then(function(t){return function(){return lightboxService.open(r.find(".lightbox-create-related-user-stories"))}}(this))},t.closeLightbox=function(){return t.selectedUserstory=null,t.searchUserstory="",t.relatedUserstoriesText="",lightboxService.close(r.find(".lightbox-create-related-user-stories"))},t.$watch("vm.project",function(e){if(null!=e)return t.selectedProject=e.get("id")}),t.selectProject=function(e){return t.selectedUserstory=null,t.searchUserstory="",i.filterUss(e,t.searchUserstory)},t.onUpdateSearchUserstory=e(300,function(){return t.selectedUserstory=null,i.filterUss(t.selectedProject,t.searchUserstory)})},{link:r,templateUrl:"epics/related-userstories/related-userstories-create/related-userstories-create.html",controller:"RelatedUserstoriesCreateCtrl",controllerAs:"vm",bindToController:!0,scope:{showCreateRelatedUserstoriesLightbox:"=",project:"=",epic:"=",epicUserstories:"=",loadRelatedUserstories:"&"}}},t.$inject=["lightboxService"],r.directive("tgRelatedUserstoriesCreate",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(t,e){var r;return r=function(r,n,i){var o,s,a;if(e.hasPermission("modify_epic"))return o=t(i.tgRelatedUserstoriesSortable),s=dragula([n[0]],{copySortSource:!1,copy:!1,mirrorContainer:n[0],moves:function(t){return $(t).is("tg-related-userstory-row")}}),s.on("dragend",function(t){var e,n,i;return e=$(t),i=e.scope().us,n=e.index(),r.$apply(function(){return o(r,{us:i,newIndex:n})})}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&s.dragging}}),r.$on("$destroy",function(){return n.off(),s.destroy()})},{link:r}},t.$inject=["$parse","tgProjectService"],e.directive("tgRelatedUserstoriesSortable",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){return{templateUrl:"epics/related-userstories/related-userstories.html",controller:"RelatedUserStoriesCtrl",controllerAs:"vm",bindToController:!0,scope:{userstories:"=",project:"=",epic:"="}}},t.$inject=[],e.directive("tgRelatedUserstories",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e,r,n){this.avatarService=t,this.translate=e,this.confirm=r,this.rs=n}return t.$inject=["tgAvatarService","$translate","$tgConfirm","tgResources"],t.prototype.setAvatarData=function(){var t;return t=this.userstory.get("assigned_to_extra_info"),this.avatar=this.avatarService.getAvatar(t)},t.prototype.getAssignedToFullNameDisplay=function(){return this.userstory.get("assigned_to")?this.userstory.getIn(["assigned_to_extra_info","full_name_display"]):this.translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},t.prototype.onDeleteRelatedUserstory=function(){var t,e;return e=this.translate.instant("EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY"),t=this.translate.instant("EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY",{subject:this.userstory.get("subject")}),this.confirm.askOnDelete(e,t).then(function(e){return function(r){var n,i,o,s;return i=function(){return t=e.translate.instant("EPIC.ERROR_UNLINK_RELATED_USERSTORY",{errorMessage:t}),e.confirm.notify("error",null,t),r.finish(!1)},o=function(){return e.loadRelatedUserstories(),r.finish()},n=e.epic.get("id"),s=e.userstory.get("id"),e.rs.epics.deleteRelatedUserstory(n,s).then(o,i)}}(this))},t}(),e.controller("RelatedUserstoryRowCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t;return t=function(t,e,r,n){return n.setAvatarData()},{link:t,templateUrl:"epics/related-userstories/related-userstory-row/related-userstory-row.html",controller:"RelatedUserstoryRowCtrl",controllerAs:"vm",bindToController:!0,scope:{userstory:"=",epic:"=",project:"=",loadRelatedUserstories:"&"}}},t.$inject=[],e.directive("tgRelatedUserstoryRow",t)}.call(this),function(){var t,e,r=function(t,e){return function(){return t.apply(e,arguments)}},n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;e=this.taiga,t=function(t){function i(t,n,i,o,s,a,c,u){var l,p;this.routeParams=t,this.externalAppsService=n,this.window=i,this.currentUserService=o,this.location=s,this.navUrls=a,this.xhrError=c,this.loader=u,this.createApplicationToken=r(this.createApplicationToken,this),this._getApplicationToken=r(this._getApplicationToken,this),this._redirect=r(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,p=encodeURIComponent(this.location.url()),l=this.navUrls.resolve("login"),this.loginWithAnotherUserUrl=l+"?next="+p,e.defineImmutableProperty(this,"user",function(t){return function(){return t._user}}(this)),e.defineImmutableProperty(this,"application",function(t){return function(){return t._application}}(this))}return n(i,t),i.$inject=["$routeParams","tgExternalAppsService","$window","tgCurrentUserService","$location","$tgNavUrls","tgXhrErrorService","tgLoader"],i.prototype._redirect=function(t){var e;return e=t.get("next_url"),this.window.open(e,"_self")},i.prototype._getApplicationToken=function(){return this.externalAppsService.getApplicationToken(this._applicationId,this._state).then(function(t){return function(e){return t._application=e.get("application"),e.get("auth_code")?t._redirect(e):t.loader.pageLoaded()}}(this))["catch"](function(t){return function(e){return t.loader.pageLoaded(),t.xhrError.response(e)}}(this))},i.prototype.cancel=function(){return this.window.history.back()},i.prototype.createApplicationToken=function(){return this.externalAppsService.authorizeApplicationToken(this._applicationId,this._state).then(function(t){return function(e){return t._redirect(e)}}(this))["catch"](function(t){return function(e){return t.xhrError.response(e)}}(this))},i}(e.Controller),angular.module("taigaExternalApps").controller("ExternalApp",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.rs=t}return e(r,t),r.$inject=["tgResources"],r.prototype.getApplicationToken=function(t,e){return this.rs.externalapps.getApplicationToken(t,e)},r.prototype.authorizeApplicationToken=function(t,e){return this.rs.externalapps.authorizeApplicationToken(t,e)},r}(taiga.Service),angular.module("taigaExternalApps").service("tgExternalAppsService",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.lightboxFactory=t}return e(r,t),r.$inject=["tgLightboxFactory"],r.prototype.sendFeedback=function(){return this.lightboxFactory.create("tg-lb-feedback",{"class":"lightbox lightbox-feedback lightbox-generic-form"})},r}(taiga.Service),angular.module("taigaFeedback").service("tgFeedbackService",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t,e,r){this.currentUserService=t,this.permissionService=e,this.lightboxFactory=r,this.hiddenDeletedComment=!0}return t.$inject=["tgCurrentUserService","tgCheckPermissionsService","tgLightboxFactory"],t.prototype.showDeletedComment=function(){return this.hiddenDeletedComment=!1},t.prototype.hideDeletedComment=function(){return this.hiddenDeletedComment=!0},t.prototype.checkCancelComment=function(t){if(27===t.keyCode)return this.onEditMode({commentId:this.comment.id})},t.prototype.canEditDeleteComment=function(){if(this.currentUserService.getUser())return this.user=this.currentUserService.getUser(),this.user.get("id")===this.comment.user.pk||this.permissionService.check("modify_project")},t.prototype.saveComment=function(t,e){return this.onEditComment({commentId:this.comment.id,commentData:t,callback:e})},t.prototype.displayCommentHistory=function(){return this.lightboxFactory.create("tg-lb-display-historic",{"class":"lightbox lightbox-display-historic",comment:"comment",name:"name",object:"object"},{comment:this.comment,name:this.name,object:this.object})},t}(),e.controller("CommentCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){return{scope:{name:"@",object:"@",comment:"<",type:"<",loading:"<",editing:"<",deleting:"<",objectId:"<",editMode:"<",onEditMode:"&",onDeleteComment:"&",onRestoreDeletedComment:"&",onEditComment:"&"},templateUrl:"history/comments/comment.html",bindToController:!0,controller:"CommentCtrl",controllerAs:"vm"}},e.directive("tgComment",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(){}return t.$inject=[],t.prototype.initializePermissions=function(){return this.canAddCommentPermission="comment_"+this.name},t}(),e.controller("CommentsCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return n.initializePermissions()},{scope:{type:"<",name:"@",object:"@",comments:"<",onEditMode:"&",onDeleteComment:"&",onRestoreDeletedComment:"&",onAddComment:"&",onEditComment:"&",editMode:"<",loading:"<",deleting:"<",editing:"<",projectId:"="},templateUrl:"history/comments/comments.html",bindToController:!0,controller:"CommentsCtrl",controllerAs:"vm",link:t}},e.directive("tgComments",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t){this.rs=t}return t.$inject=["$tgResources"],t.prototype._loadHistoric=function(){var t,e,r;return r=this.name,e=this.object,t=this.comment.id,this.rs.history.getCommentHistory(r,e,t).then(function(t){return function(e){return t.commentHistoryEntries=e}}(this))},t}(),e.controller("LightboxDisplayHistoricCtrl",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){return i._loadHistoric(),t.open(r)},{scope:{},bindToController:{name:"=",object:"=",comment:"="},templateUrl:"history/history-lightbox/comment-history-lightbox.html",controller:"LightboxDisplayHistoricCtrl",controllerAs:"vm",link:e}},t.$inject=["lightboxService"],angular.module("taigaHistory").directive("tgLbDisplayHistoric",t)}.call(this),function(){var t;t=function(){return{scope:{entry:"<"},templateUrl:"history/history-lightbox/history-entry.html"}},angular.module("taigaHistory").directive("tgHistoryEntry",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){return{templateUrl:"history/history-tabs/history-tabs.html",scope:{showCommentTab:"&",showActivityTab:"&",onActiveComments:"&",onActiveActivities:"&",onOrderComments:"&",activeTab:"<",commentsNum:"<",activitiesNum:"<",onReverse:"<"}}},e.directive("tgHistoryTabs",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t,e,r,n){this.rs=t,this.repo=e,this.storage=r,this.projectService=n,this.editing=null,this.deleting=null,this.editMode={},this.viewComments=!0,this.reverse=this.storage.get("orderComments"),this._loadHistory()}return t.$inject=["$tgResources","$tgRepo","$tgStorage","tgProjectService"],t.prototype._loadHistory=function(){return this.rs.history.get(this.name,this.id).then(function(t){return function(e){return t._getComments(e),t._getActivities(e)}}(this))},t.prototype._getComments=function(t){return this.comments=_.filter(t,function(t){return""!==t.comment}),this.reverse&&this.comments-_.reverse(this.comments),this.commentsNum=this.comments.length},t.prototype._getActivities=function(t){return this.activities=_.filter(t,function(t){return Object.keys(t.values_diff).length>0}),this.activitiesNum=this.activities.length},t.prototype.showHistorySection=function(){return this.showCommentTab()||this.showActivityTab()},t.prototype.showCommentTab=function(){return this.commentsNum>0||this.projectService.hasPermission("comment_"+this.name)},t.prototype.showActivityTab=function(){return this.activitiesNum>0},t.prototype.toggleEditMode=function(t){return this.editMode[t]=!this.editMode[t]},t.prototype.onActiveHistoryTab=function(t){return this.viewComments=t},t.prototype.deleteComment=function(t){var e,r,n;return n=this.name,r=this.id,e=t,this.deleting=t,this.rs.history.deleteComment(n,r,e).then(function(t){return function(){return t._loadHistory(),t.deleting=null}}(this))},t.prototype.editComment=function(t,e){var r,n,i;return i=this.name,n=this.id,r=t,this.editing=t,this.rs.history.editComment(i,n,r,e).then(function(e){return function(){return e._loadHistory(),e.toggleEditMode(t),e.editing=null}}(this))},t.prototype.restoreDeletedComment=function(t){var e,r,n;return n=this.name,r=this.id,e=t,this.editing=t,this.rs.history.undeleteComment(n,r,e).then(function(t){return function(){return t._loadHistory(),t.editing=null}}(this))},t.prototype.addComment=function(t){return this.repo.save(this.type).then(function(e){return function(){return e._loadHistory(),t()}}(this))},t.prototype.onOrderComments=function(){return this.reverse=!this.reverse,this.storage.set("orderComments",this.reverse),this._loadHistory()},t}(),e.controller("HistorySection",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return t.$on("object:updated",function(){return n._loadHistory(t.type,t.id)})},{link:t,templateUrl:"history/history.html",controller:"HistorySection",controllerAs:"vm",bindToController:!0,scope:{type:"=",name:"@",id:"=",projectId:"="}}},t.$inject=[],e.directive("tgHistorySection",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(){}return t.$inject=[],t.prototype.diffTags=function(){if("tags"===this.type)return this.diffRemoveTags=_.difference(this.diff[0],this.diff[1]).toString(),this.diffAddTags=_.difference(this.diff[1],this.diff[0]).toString()},t}(),e.controller("ActivitiesDiffCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return n.diffTags()},{scope:{type:"<",diff:"<"},templateUrl:"history/history/history-diff.html",controller:"ActivitiesDiffCtrl",controllerAs:"vm",bindToController:!0,link:t}},e.directive("tgHistoryDiff",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r){},{scope:{activities:"<"},templateUrl:"history/history/history.html",link:t}},e.directive("tgHistory",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return t.vm={},t.vm.duty=t.duty,t.vm.type=t.type,t.vm.getDutyType=function(){if(t.vm.duty){if("epics"===t.vm.duty.get("_name"))return e.instant("COMMON.EPIC");if("userstories"===t.vm.duty.get("_name"))return e.instant("COMMON.USER_STORY");if("tasks"===t.vm.duty.get("_name"))return e.instant("COMMON.TASK");if("issues"===t.vm.duty.get("_name"))return e.instant("COMMON.ISSUE")}}},{templateUrl:"home/duties/duty.html",scope:{duty:"=tgDuty",type:"@"},link:r}},t.$inject=["$tgNavUrls","$translate"],angular.module("taigaHome").directive("tgDuty",t)}.call(this),function(){var t;t=function(){function t(t,e,r){this.currentUserService=t,this.location=e,this.navUrls=r,this.currentUserService.getUser()||this.location.path(this.navUrls.resolve("discover"))}return t.$inject=["tgCurrentUserService","$location","$tgNavUrls"],t}(),angular.module("taigaHome").controller("Home",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga.groupBy,t=function(t){function n(t,e,r){this.navurls=t,this.rs=e,this.projectsService=r}return r(n,t),n.$inject=["$tgNavUrls","tgResources","tgProjectsService"],n.prototype._attachProjectInfoToWorkInProgress=function(t,e){var r,n,i,o,s;return r=function(t){return function(r,n){var i,o,s;return o=e.get(String(r.get("project"))),i={project:o.get("slug"),ref:r.get("ref")},s=t.navurls.resolve("project-"+n+"-detail",i),r=r.set("url",s),r=r.set("project",o),r=r.set("_name",n)}}(this),i=function(t,n){return t=t.filter(function(t){return e.get(String(t.get("project")))}),t=t.map(function(t){return r(t,n)})},o=t.get("assignedTo"),o.get("epics")&&(n=i(o.get("epics"),"epics"),o=o.set("epics",n)),o.get("userStories")&&(n=i(o.get("userStories"),"userstories"),o=o.set("userStories",n)),o.get("tasks")&&(n=i(o.get("tasks"),"tasks"),o=o.set("tasks",n)),o.get("issues")&&(n=i(o.get("issues"),"issues"),o=o.set("issues",n)),s=t.get("watching"),s.get("epics")&&(n=i(s.get("epics"),"epics"),s=s.set("epics",n)),s.get("userStories")&&(n=i(s.get("userStories"),"userstories"),s=s.set("userStories",n)),s.get("tasks")&&(n=i(s.get("tasks"),"tasks"),s=s.set("tasks",n)),s.get("issues")&&(n=i(s.get("issues"),"issues"),s=s.set("issues",n)),t=t.set("assignedTo",o),t=t.set("watching",s)},n.prototype.getWorkInProgress=function(t){var r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y;return p=Immutable.Map(),h=this.projectsService.getProjectsByUserId(t).then(function(t){return p=Immutable.fromJS(e(t.toJS(),function(t){return t.id}))}),o=Immutable.Map(),a={status__is_closed:!1,assigned_to:t},l={is_closed:!1,assigned_to:t},u={status__is_closed:!1,assigned_to:t},c={status__is_closed:!1,assigned_to:t},r=this.rs.epics.listInAllProjects(a).then(function(t){return o=o.set("epics",t)}),s=this.rs.userstories.listInAllProjects(l).then(function(t){return o=o.set("userStories",t)}),i=this.rs.tasks.listInAllProjects(u).then(function(t){return o=o.set("tasks",t)}),n=this.rs.issues.listInAllProjects(c).then(function(t){return o=o.set("issues",t)}),a={status__is_closed:!1,watchers:t},l={is_closed:!1,watchers:t},u={status__is_closed:!1,watchers:t},c={status__is_closed:!1,watchers:t},f=Immutable.Map(),d=this.rs.epics.listInAllProjects(a).then(function(t){return f=f.set("epics",t)}),v=this.rs.userstories.listInAllProjects(l).then(function(t){return f=f.set("userStories",t)}),m=this.rs.tasks.listInAllProjects(u).then(function(t){return f=f.set("tasks",t)}),g=this.rs.issues.listInAllProjects(c).then(function(t){return f=f.set("issues",t)}),y=Immutable.Map(),Promise.all([h,r,d,s,v,i,m,n,g]).then(function(t){return function(){return y=y.set("assignedTo",o),y=y.set("watching",f),y=t._attachProjectInfoToWorkInProgress(y,p)}}(this))},n}(taiga.Service),angular.module("taigaHome").service("tgHomeService",t)}.call(this),function(){var t;t=function(t){var e,r;return r=function(e,r,n,i){return e.vm={},taiga.defineImmutableProperty(e.vm,"projects",function(){return t.projects.get("recents")})},e={templateUrl:"home/projects/home-project-list.html",scope:{},link:r}},t.$inject=["tgCurrentUserService"],angular.module("taigaHome").directive("tgHomeProjectList",t)}.call(this),function(){var t;t=function(){function t(t){this.homeService=t,this.assignedTo=Immutable.Map(),this.watching=Immutable.Map()}return t.$inject=["tgHomeService"],t.prototype._setAssignedTo=function(t){var e,r,n,i;if(e=t.get("assignedTo").get("epics"),i=t.get("assignedTo").get("userStories"),n=t.get("assignedTo").get("tasks"),r=t.get("assignedTo").get("issues"),this.assignedTo=i.concat(n).concat(r).concat(e),this.assignedTo.size>0)return this.assignedTo=this.assignedTo.sortBy(function(t){return t.get("modified_date")}).reverse()},t.prototype._setWatching=function(t){var e,r,n,i;if(e=t.get("watching").get("epics"),i=t.get("watching").get("userStories"),n=t.get("watching").get("tasks"),r=t.get("watching").get("issues"),this.watching=i.concat(n).concat(r).concat(e),this.watching.size>0)return this.watching=this.watching.sortBy(function(t){return t.get("modified_date")}).reverse()},t.prototype.getWorkInProgress=function(t){return this.homeService.getWorkInProgress(t).then(function(t){return function(e){return t._setAssignedTo(e),t._setWatching(e)}}(this))},t}(),angular.module("taigaHome").controller("WorkingOn",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){var o,s;if(o=e.getUser())return s=o.get("id"),i.getWorkInProgress(s)},{controller:"WorkingOn",controllerAs:"vm",templateUrl:"home/working-on/working-on.html",scope:{},link:r}},t.$inject=["tgHomeService","tgCurrentUserService"],angular.module("taigaHome").directive("tgWorkingOn",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,e,r,n,i){this.projectService=t,this.rs=e,this.lightboxService=r,this.confirm=n,this.rootScope=i,this.project=this.projectService.project,this.roles=this.projectService.project.get("roles"),this.rolesValues={},this.loading=!1,this.defaultMaxInvites=4}return t.$inject=["tgProjectService","$tgResources","lightboxService","$tgConfirm","$rootScope"],t.prototype._areRolesValidated=function(){return Object.defineProperty(this,"areRolesValidated",{get:function(t){return function(){var e;return e=_.filter(Object.values(t.rolesValues),function(t){return t}),e.length===t.contactsToInvite.size+t.emailsToInvite.size}}(this)})},t.prototype._checkLimitMemberships=function(){var t;return null===this.project.get("max_memberships")?this.membersLimit=this.defaultMaxInvites:(t=Math.max(this.project.get("max_memberships")-this.project.get("total_memberships"),0),this.membersLimit=Math.min(t,this.defaultMaxInvites)),this.showWarningMessage=this.membersLimit\n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, pluginsModules, pluginsWithModule, taiga;\n\n this.taiga = taiga = {};\n\n taiga.emojis = window.emojis;\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, blockingIntercept, 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 projectLoaded: [\n \"$q\", \"tgProjectService\", \"$route\", function($q, projectService, $route) {\n var deferred, ref;\n deferred = $q.defer();\n projectService.setSection((ref = $route.current.$$route) != null ? ref.section : void 0);\n if ($route.current.params.pslug) {\n projectService.setProjectBySlug($route.current.params.pslug).then(deferred.resolve);\n } else {\n projectService.cleanProject();\n 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/new\", {\n title: \"PROJECT.CREATE.TITLE\",\n templateUrl: \"projects/create/create-project.html\",\n loader: true,\n controller: \"CreateProjectCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/new/scrum\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/kanban\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/duplicate\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/import/:platform?\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\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/t/:ref\", {\n loader: true,\n controller: \"DetailController\",\n template: \"\"\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/epics\", {\n section: \"epics\",\n templateUrl: \"epics/dashboard/epics-dashboard.html\",\n loader: true,\n controller: \"EpicsDashboardCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/:pslug/epic/:epicref\", {\n templateUrl: \"epic/epic-detail.html\",\n loader: true,\n section: \"epics\"\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-list\", {\n templateUrl: \"wiki/wiki-list.html\",\n loader: true,\n section: \"wiki\"\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/project-values/tags\", {\n templateUrl: \"admin/admin-project-values-tags.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/third-parties/gogs\", {\n templateUrl: \"admin/admin-third-parties-gogs.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\", {\n templateUrl: \"contrib/main.html\"\n });\n $routeProvider.when(\"/project/:pslug/transfer/:token\", {\n templateUrl: \"projects/transfer/transfer-page.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\"\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(\"/user-settings/contrib/:plugin\", {\n templateUrl: \"contrib/user-settings.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 controller: \"LoginPage\"\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(\"/blocked-project/:pslug/\", {\n templateUrl: \"projects/project/blocked-project.html\",\n loader: 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 templateUrl: \"error/not-found.html\"\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, errorHandlingService) {\n var httpResponseError;\n httpResponseError = function(response) {\n var nextUrl, search;\n if (response.status === 0 || (response.status === -1 && !response.config.cancelable)) {\n $lightboxService.closeAll();\n errorHandlingService.error();\n } else if (response.status === 401 && $location.url().indexOf('/login') === -1) {\n nextUrl = $location.url();\n search = $location.search();\n if (search.force_next) {\n $location.url($navUrls.resolve(\"login\")).search(\"force_next\", search.force_next);\n } else {\n $location.url($navUrls.resolve(\"login\")).search({\n \"unauthorized\": true,\n \"next\": nextUrl\n });\n }\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\", \"tgErrorHandlingService\", 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 blockingIntercept = function($q, errorHandlingService) {\n var redirectToBlockedPage, responseError, responseOk;\n redirectToBlockedPage = function() {\n return errorHandlingService.block();\n };\n responseOk = function(response) {\n if (response.data.blocked_code) {\n redirectToBlockedPage();\n }\n return response;\n };\n responseError = function(response) {\n if (response.status === 451) {\n redirectToBlockedPage();\n }\n return $q.reject(response);\n };\n return {\n response: responseOk,\n responseError: responseError\n };\n };\n $provide.factory(\"blockingIntercept\", [\"$q\", \"tgErrorHandlingService\", blockingIntercept]);\n $httpProvider.interceptors.push(\"blockingIntercept\");\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 if (lang !== 'en') {\n ljs.load((\"/\" + window._version + \"/locales/moment-locales/\") + lang + \".js\");\n }\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 linewidth: $translate.instant(\"COMMON.FORM_ERRORS.LINEWIDTH\"),\n pikaday: $translate.instant(\"COMMON.FORM_ERRORS.PIKADAY\")\n };\n return checksley.updateMessages('default', messages);\n };\n\n init = function($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, loaderService, navigationBarService, errorHandlingService, lightboxService) {\n var un, user, validators;\n $log.debug(\"Initialize application\");\n $rootscope.$on('$translatePartialLoaderStructureChanged', function() {\n return $translate.refresh();\n });\n validators = {\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 pikaday: function(val) {\n var prettyDate;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n return moment(val, prettyDate).isValid();\n }\n };\n checksley.updateValidators(validators);\n $rootscope.contribPlugins = this.taigaContribPlugins;\n $rootscope.adminPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"admin\"\n });\n $rootscope.userSettingsPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"userSettings\"\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 $rootscope.$on('$locationChangeStart', function(event) {\n errorHandlingService.init();\n if (lightboxService.getLightboxOpen().length) {\n event.preventDefault();\n return lightboxService.closeAll();\n }\n });\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 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 angular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 500);\n\n pluginsWithModule = _.filter(this.taigaContribPlugins, function(plugin) {\n return plugin.module;\n });\n\n pluginsModules = _.map(pluginsWithModule, function(plugin) {\n return plugin.module;\n });\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\", \"taigaHistory\", \"taigaWikiHistory\", \"taigaEpics\", \"taigaUtils\", \"templates\", \"ngSanitize\", \"ngRoute\", \"ngAnimate\", \"ngAria\", \"pascalprecht.translate\", \"infinite-scroll\", \"tgRepeat\"].concat(pluginsModules);\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\", \"tgLoader\", \"tgNavigationBarService\", \"tgErrorHandlingService\", \"lightboxService\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.errorHandlingService.notfound();\n } else if (xhr.status === 403) {\n this.errorHandlingService.permissionDenied();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 DEFAULT_COLOR_LIST, addClass, bindMethods, bindOnce, cancelTimeout, debounce, debounceLeading, defineImmutableProperty, getDefaulColorList, getMatches, getRandomDefaultColor, groupBy, isEmail, isImage, isPdf, 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 addClass = function(el, className) {\n if (el.classList) {\n return el.classList.add(className);\n } else {\n return el.className += ' ' + className;\n }\n };\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 && _.isFunction(value)) {\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 _.trim(data, char);\n };\n\n slugify = function(data) {\n return data.toString().toLowerCase().trim().replace(/\\s+/g, '-').replace(/&/g, '-and-').replace(/[^\\w\\-]+/g, '').replace(/\\-\\-+/g, '-');\n };\n\n unslugify = function(data) {\n if (data) {\n return _.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 coll.join(str);\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 _.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|svg|psd)/i) !== null;\n };\n\n isEmail = function(name) {\n return (name != null) && name.match(/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/) !== null;\n };\n\n isPdf = function(name) {\n return name.match(/\\.(pdf)/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 DEFAULT_COLOR_LIST = ['#fce94f', '#edd400', '#c4a000', '#8ae234', '#73d216', '#4e9a06', '#d3d7cf', '#fcaf3e', '#f57900', '#ce5c00', '#729fcf', '#3465a4', '#204a87', '#888a85', '#ad7fa8', '#75507b', '#5c3566', '#ef2929', '#cc0000', '#a40000', '#222222'];\n\n getRandomDefaultColor = function() {\n return _.sample(DEFAULT_COLOR_LIST);\n };\n\n getDefaulColorList = function() {\n return _.clone(DEFAULT_COLOR_LIST);\n };\n\n getMatches = function(string, regex, index) {\n var match, matches;\n index || (index = 1);\n matches = [];\n match = null;\n while (match = regex.exec(string)) {\n if (index === -1) {\n matches.push(match);\n } else {\n matches.push(match[index]);\n }\n }\n return matches;\n };\n\n taiga = this.taiga;\n\n taiga.addClass = addClass;\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.isEmail = isEmail;\n\n taiga.isPdf = isPdf;\n\n taiga.patch = patch;\n\n taiga.getRandomDefaultColor = getRandomDefaultColor;\n\n taiga.getDefaulColorList = getDefaulColorList;\n\n taiga.getMatches = getMatches;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, UsFiltersMixin, 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 _.includes(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 FiltersMixin.prototype.applyStoredFilters = function(projectSlug, key) {\n var filters;\n if (_.isEmpty(this.location.search())) {\n filters = this.getFilters(projectSlug, key);\n if (Object.keys(filters).length) {\n this.location.search(filters);\n this.location.replace();\n return true;\n }\n }\n return false;\n };\n\n FiltersMixin.prototype.storeFilters = function(projectSlug, params, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.set(hash, params);\n };\n\n FiltersMixin.prototype.getFilters = function(projectSlug, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.get(hash) || {};\n };\n\n FiltersMixin.prototype.formatSelectedFilters = function(type, list, urlIds) {\n var invalidAppliedTags, invalidTags, selectedFilters, selectedIds, validAppliedTags;\n selectedIds = urlIds.split(',');\n selectedFilters = _.filter(list, function(it) {\n return selectedIds.indexOf(_.toString(it.id)) !== -1;\n });\n invalidTags = _.filter(selectedIds, function(it) {\n return !_.find(selectedFilters, function(sit) {\n return _.toString(sit.id) === it;\n });\n });\n invalidAppliedTags = _.map(invalidTags, function(it) {\n return {\n id: it,\n key: type + \":\" + it,\n dataType: type,\n name: it\n };\n });\n validAppliedTags = _.map(selectedFilters, function(it) {\n return {\n id: it.id,\n key: type + \":\" + it.id,\n dataType: type,\n name: it.name,\n color: it.color\n };\n });\n return invalidAppliedTags.concat(validAppliedTags);\n };\n\n return FiltersMixin;\n\n })();\n\n taiga.FiltersMixin = FiltersMixin;\n\n UsFiltersMixin = (function() {\n function UsFiltersMixin() {}\n\n UsFiltersMixin.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.epic = urlfilters.epic;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n return _this.generateFilters();\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n UsFiltersMixin.prototype.generateFilters = function(milestone) {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.storeFiltersName);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.epic = urlfilters.epic;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n if (milestone) {\n loadFilters.milestone = milestone;\n }\n return this.q.all([this.rs.userstories.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, epic, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n epic = _.map(data.epics, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n it.name = \"#\" + it.ref + \" \" + it.subject;\n } else {\n it.id = \"null\";\n it.name = \"Not in an epic\";\n }\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.epic) {\n selected = _this.formatSelectedFilters(\"epic\", epic, loadFilters.epic);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.EPIC\"),\n dataType: \"epic\",\n content: epic\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n return UsFiltersMixin;\n\n })();\n\n taiga.UsFiltersMixin = UsFiltersMixin;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, LoginPage, 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 LoginPage = (function() {\n LoginPage.$inject = ['tgCurrentUserService', '$location', '$tgNavUrls', '$routeParams', '$tgAuth'];\n\n function LoginPage(currentUserService, $location, $navUrls, $routeParams, $auth) {\n var url;\n if (currentUserService.isAuthenticated()) {\n if (!$routeParams['force_login']) {\n url = $navUrls.resolve(\"home\");\n if ($routeParams['next']) {\n url = decodeURIComponent($routeParams['next']);\n $location.search('next', null);\n }\n if ($routeParams['unauthorized']) {\n $auth.clear();\n $auth.removeToken();\n } else {\n $location.url(url);\n }\n }\n }\n }\n\n return LoginPage;\n\n })();\n\n module.controller('LoginPage', LoginPage);\n\n AuthService = (function(superClass) {\n extend(AuthService, superClass);\n\n AuthService.$inject = [\"$rootScope\", \"$tgStorage\", \"$tgModel\", \"$tgResources\", \"$tgHttp\", \"$tgUrls\", \"$tgConfig\", \"$translate\", \"tgCurrentUserService\", \"tgThemeService\", \"$tgAnalytics\"];\n\n function AuthService(rootscope, storage, model, rs, http, urls, config1, translate, currentUserService1, themeService, analytics) {\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 = config1;\n this.translate = translate;\n this.currentUserService = currentUserService1;\n this.themeService = themeService;\n this.analytics = analytics;\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 this.currentUserService.setUser(this.userData);\n } else {\n this.userData = null;\n }\n return this.analytics.setUserId();\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.refresh = function() {\n var url;\n url = this.urls.resolve(\"user-me\");\n return this.http.get(url).then((function(_this) {\n return function(data, status) {\n var user;\n user = data.data;\n user.token = _this.getUser().auth_token;\n user = _this.model.make_model(\"users\", user);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:refresh\", user);\n return user;\n };\n })(this));\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 _this.rootscope.$broadcast(\"auth:login\", 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 this._setLocales();\n this.rootscope.$broadcast(\"auth:logout\");\n return this.analytics.setUserId();\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 _this.rootscope.$broadcast(\"auth:register\", 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.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['force_next']) {\n nextUrl = encodeURIComponent($routeParams['force_next']);\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, $window, $analytics) {\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 if ($routeParams['force_next']) {\n $scope.nextUrl = decodeURIComponent($routeParams['force_next']);\n }\n onSuccess = function(response) {\n $events.setupConnection();\n $analytics.trackEvent(\"auth\", \"login\", \"user login\", 1);\n if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\n };\n onError = function(response) {\n return $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"));\n };\n $scope.onKeyUp = function(event) {\n var target, value;\n target = angular.element(event.currentTarget);\n value = target.val();\n $scope.iscapsLockActivated = false;\n if (value !== value.toLowerCase()) {\n return $scope.iscapsLockActivated = true;\n }\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\", \"$window\", \"$tgAnalytics\", LoginDirective]);\n\n RegisterDirective = function($auth, $confirm, $location, $navUrls, $config, $routeParams, $analytics, $translate, $window) {\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(\"login\")) {\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 if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\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\", \"$window\", 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 message, title;\n $location.path($navUrls.resolve(\"login\"));\n title = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TITLE\");\n message = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TEXT\");\n return $confirm.success(title, message);\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, $config, $params, $navUrls, $analytics, $translate, config) {\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 $scope.invitation = invitation;\n return $scope.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\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 var data, loginFormType;\n event.preventDefault();\n if (!loginForm.validate()) {\n return;\n }\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n data = $scope.dataLogin;\n promise = $auth.login({\n username: data.username,\n password: data.password,\n invitation_token: data.token\n }, loginFormType);\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\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgConfig\", 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 $location.path($navUrls.resolve(\"home\"));\n return $location.replace();\n };\n })(this));\n } else {\n $location.path($navUrls.resolve(\"login\"));\n $location.replace();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\": \"/project/new\",\n \"create-project-scrum\": \"/project/new/scrum\",\n \"create-project-kanban\": \"/project/new/kanban\",\n \"create-project-duplicate\": \"/project/new/duplicate\",\n \"create-project-import\": \"/project/new/import\",\n \"create-project-import-platform\": \"/project/new/import/:platform\",\n \"profile\": \"/profile\",\n \"user-profile\": \"/profile/:username\",\n \"blocked-project\": \"/blocked-project/:project\",\n \"project\": \"/project/:project\",\n \"project-detail-ref\": \"/project/:project/t/:ref\",\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-epics\": \"/project/:project/epics\",\n \"project-search\": \"/project/:project/search\",\n \"project-epics-detail\": \"/project/:project/epic/:ref\",\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-list\": \"/project/:project/wiki-list\",\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-project-values-tags\": \"/project/:project/admin/project-values/tags\",\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-third-parties-gogs\": \"/project/:project/admin/third-parties/gogs\",\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 \"user-settings-contrib\": \"/user-settings/contrib/:plugin\"\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, Autofocus, Capslock, CheckPermissionDirective, ClassPermissionDirective, CtrlClickDisable, DataPickerConfig, LightboxClose, ProjectUrl, Qqueue, QueueModelTransformation, SelectedText, Svg, Template, ToggleCommentDirective, module, taiga,\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 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 if (project.toJS) {\n project = project.toJS();\n }\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 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 };\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 QueueModelTransformation = (function(superClass) {\n extend(QueueModelTransformation, superClass);\n\n QueueModelTransformation.$inject = [\"$tgQqueue\", \"$tgRepo\", \"$q\", \"$tgModel\"];\n\n function QueueModelTransformation(qqueue1, repo, q, model1) {\n this.qqueue = qqueue1;\n this.repo = repo;\n this.q = q;\n this.model = model1;\n }\n\n QueueModelTransformation.prototype.setObject = function(scope1, prop) {\n this.scope = scope1;\n this.prop = prop;\n };\n\n QueueModelTransformation.prototype.clone = function() {\n var attrs, model;\n attrs = _.cloneDeep(this.scope[this.prop]._attrs);\n model = this.model.make_model(this.scope[this.prop]._name, attrs);\n return model;\n };\n\n QueueModelTransformation.prototype.getObj = function() {\n return this.scope[this.prop];\n };\n\n QueueModelTransformation.prototype.save = function(transformation) {\n var defered;\n defered = this.q.defer();\n this.qqueue.add((function(_this) {\n return function() {\n var clone, comment, modified, obj, success;\n obj = _this.getObj();\n comment = obj.comment;\n obj.comment = '';\n clone = _this.clone();\n modified = _.omit(obj._modifiedAttrs, ['version']);\n clone = _.assign(clone, modified);\n transformation(clone);\n if (comment.length) {\n clone.comment = comment;\n }\n success = function() {\n _this.scope[_this.prop] = clone;\n return defered.resolve.apply(null, arguments);\n };\n return _this.repo.save(clone).then(success, defered.reject);\n };\n })(this));\n return defered.promise;\n };\n\n return QueueModelTransformation;\n\n })(taiga.Service);\n\n module.service(\"$tgQueueModelTransformation\", QueueModelTransformation);\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() {\n var template;\n template = \"\";\n return {\n template: template\n };\n };\n\n module.directive(\"tgCapslock\", [Capslock]);\n\n LightboxClose = function() {\n var link, template;\n template = \"\\n \\n\";\n link = function(scope, elm, attrs) {};\n return {\n scope: {\n onClose: '&'\n },\n link: link,\n template: template\n };\n };\n\n module.directive(\"tgLightboxClose\", [LightboxClose]);\n\n Svg = function() {\n var template;\n template = \"\\n \\n {{svgTitle}}\\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\\n \\n\";\n return {\n scope: {\n svgIcon: \"@\",\n svgTitle: \"@\",\n svgTitleTranslate: \"@\",\n svgTitleTranslateValues: \"=\"\n },\n template: template\n };\n };\n\n module.directive(\"tgSvg\", [Svg]);\n\n Autofocus = function($timeout, $parse, animationFrame) {\n return {\n restrict: 'A',\n link: function($scope, $element, attrs) {\n var model;\n if (attrs.ngShow) {\n model = $parse(attrs.ngShow);\n return $scope.$watch(model, function(value) {\n if (value === true) {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n });\n } else {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n }\n };\n };\n\n module.directive('tgAutofocus', ['$timeout', '$parse', \"animationFrame\", Autofocus]);\n\n module.directive('tgPreloadImage', function() {\n var preload, spinner, template;\n spinner = \"loading...\";\n template = \"
    \\n \\n
    \";\n preload = function(src, onLoad) {\n var image;\n image = new Image();\n image.onload = onLoad;\n image.src = src;\n return image;\n };\n return {\n template: template,\n transclude: true,\n replace: true,\n link: function(scope, el, attrs) {\n var image, onLoad, timeout;\n image = el.find('img:last');\n timeout = null;\n onLoad = function() {\n el.find('.loading-spinner').remove();\n image.show();\n if (timeout) {\n clearTimeout(timeout);\n return timeout = null;\n }\n };\n return attrs.$observe('preloadSrc', function(src) {\n if (timeout) {\n clearTimeout(timeout);\n }\n el.find('.loading-spinner').remove();\n timeout = setTimeout(function() {\n return el.prepend(spinner);\n }, 200);\n image.hide();\n return preload(src, onLoad);\n });\n }\n };\n });\n\n CtrlClickDisable = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", function($event) {\n if ($event.ctrlKey || $event.metaKey) {\n return $event.preventDefault();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCtrlClickDisable\", CtrlClickDisable);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/detail.coffee\n */\n\n(function() {\n var DetailController, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString;\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(\"taigaCommon\");\n\n DetailController = (function() {\n DetailController.$inject = ['$routeParams', '$tgRepo', \"tgProjectService\", \"$tgNavUrls\", \"$location\"];\n\n function DetailController(params, repo, projectService, navurls, location) {\n this.params = params;\n this.repo = repo;\n this.projectService = projectService;\n this.navurls = navurls;\n this.location = location;\n this.repo.resolve({\n pslug: this.params.pslug,\n ref: this.params.ref\n }).then((function(_this) {\n return function(result) {\n var url;\n if (result.issue) {\n url = _this.navurls.resolve('project-issues-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.task) {\n url = _this.navurls.resolve('project-tasks-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.us) {\n url = _this.navurls.resolve('project-userstories-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.epic) {\n url = _this.navurls.resolve('project-epics-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.wikipage) {\n url = _this.navurls.resolve('project-wiki-page', {\n project: _this.projectService.project.get('slug'),\n slug: _this.params.ref\n });\n }\n return _this.location.path(url);\n };\n })(this));\n }\n\n return DetailController;\n\n })();\n\n module.controller(\"DetailController\", DetailController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/epics.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaEpics\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 = _.trimStart(url, \"/\");\n url = scheme + \"//\" + loc.host + \"/\" + path;\n }\n this.error = false;\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, reconnectTryInterval;\n if (this.heartbeatInterval) {\n return;\n }\n maxMissedHeartbeats = this.config.get(\"eventsMaxMissedHeartbeats\", 5);\n heartbeatIntervalTime = this.config.get(\"eventsHeartbeatIntervalTime\", 60000);\n reconnectTryInterval = this.config.get(\"eventsReconnectTryInterval\", 10000);\n this.missedHeartbeats = 0;\n this.heartbeatInterval = setInterval((function(_this) {\n return function() {\n var e;\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.setupConnection();\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.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 this.sendMessage(message);\n this.startHeartBeatMessages();\n return this.notifications();\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 this.error = true;\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\n };\n\n EventsService.prototype.onClose = function() {\n this.log.debug(\"WebSocket closed.\");\n this.connected = false;\n this.stopHeartBeatMessages();\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $emojis) {\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 this.childScope = $scope.$new();\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 this.childScope.$destroy();\n this.childScope = $scope.$new();\n $el.off();\n $el.html($compile(templateEdit({\n task: task\n }))(childScope));\n $el.find(\".task-name input\").val(task.subject);\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\", \".save-task\", 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 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 emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n }))($scope));\n $el.on(\"click\", \".edit-task\", 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\", \"$tgEmojis\", RelatedTaskRowDirective]);\n\n RelatedTaskCreateFormDirective = function($repo, $compile, $confirm, $tgmodel, $loading, $analytics) {\n var link, newTask;\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n link = function($scope, $el, $attrs) {\n var close, createTask, render, reset;\n createTask = 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 return $scope.openNewRelatedTask = false;\n };\n reset = function() {\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n newTask[\"status\"] = $scope.project.default_task_status;\n newTask[\"project\"] = $scope.project.id;\n newTask[\"user_story\"] = $scope.us.id;\n return $scope.newTask = $tgmodel.make_model(\"tasks\", newTask);\n };\n render = function() {\n if ($scope.openNewRelatedTask) {\n return;\n }\n $scope.openNewRelatedTask = true;\n return $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return createTask(newTask).then(function() {\n reset();\n return $el.find('input').focus();\n });\n } else if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return close();\n });\n }\n });\n };\n $scope.save = function() {\n return createTask(newTask).then(function() {\n return close();\n });\n };\n taiga.bindOnce($scope, \"us\", reset);\n $scope.$on(\"related-tasks:show-form\", function() {\n return $scope.$apply(render);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n link: link,\n templateUrl: 'task/related-task-create-form.html'\n };\n };\n\n module.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", 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 _isEditable, _isVisible, 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, function(x) {\n return [x.us_order, x.ref];\n });\n return tasks;\n };\n })(this));\n };\n _isVisible = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"view_tasks\") !== -1;\n }\n return false;\n };\n _isEditable = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n }\n return false;\n };\n $scope.showRelatedTasks = function() {\n var ref;\n return _isVisible() && (_isEditable() || ((ref = $scope.tasks) != null ? ref.length : void 0));\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, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
    <%- name %>
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task, updateRelatedTask;\n updateRelatedTask = function(task) {\n var avatar, ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = $scope.usersById[task.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\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 $scope.$watch($attrs.tgRelatedTaskAssignedToInlineEdition, function() {\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n return updateRelatedTask(task);\n });\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\", \"tgAvatarService\", RelatedTaskAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 \"user-me\": \"/users/me\",\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 \"project-contact\": \"contact\",\n \"project-transfer-validate-token\": \"/projects/%s/transfer_validate_token\",\n \"project-transfer-accept\": \"/projects/%s/transfer_accept\",\n \"project-transfer-reject\": \"/projects/%s/transfer_reject\",\n \"project-transfer-request\": \"/projects/%s/transfer_request\",\n \"project-transfer-start\": \"/projects/%s/transfer_start\",\n \"epic-statuses\": \"/epic-statuses\",\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 \"epics\": \"/epics\",\n \"epic-upvote\": \"/epics/%s/upvote\",\n \"epic-downvote\": \"/epics/%s/downvote\",\n \"epic-watch\": \"/epics/%s/watch\",\n \"epic-unwatch\": \"/epics/%s/unwatch\",\n \"epic-related-userstories\": \"/epics/%s/related_userstories\",\n \"epic-related-userstories-bulk-create\": \"/epics/%s/related_userstories/bulk_create\",\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-milestone\": \"/userstories/bulk_update_milestone\",\n \"bulk-update-us-miles-order\": \"/userstories/bulk_update_sprint_order\",\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\",\n \"bulk-update-us-milestone\": \"/userstories/bulk_update_milestone\",\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 \"task-filters\": \"/tasks/filters_data\",\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/epic\": \"/history/epic\",\n \"history/us\": \"/history/userstory\",\n \"history/issue\": \"/history/issue\",\n \"history/task\": \"/history/task\",\n \"history/wiki\": \"/history/wiki/%s\",\n \"attachments/epic\": \"/epics/attachments\",\n \"attachments/us\": \"/userstories/attachments\",\n \"attachments/issue\": \"/issues/attachments\",\n \"attachments/task\": \"/tasks/attachments\",\n \"attachments/wiki_page\": \"/wiki/attachments\",\n \"custom-attributes/epic\": \"/epic-custom-attributes\",\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\",\n \"custom-attributes/task\": \"/task-custom-attributes\",\n \"custom-attributes/issue\": \"/issue-custom-attributes\",\n \"custom-attributes-values/epic\": \"/epics/custom-attributes-values\",\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\",\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\",\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\",\n \"webhooks\": \"/webhooks\",\n \"webhooks-test\": \"/webhooks/%s/test\",\n \"webhooklogs\": \"/webhooklogs\",\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\",\n \"epics-csv\": \"/epics/csv?uuid=%s\",\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 \"importers-trello-auth-url\": \"/importers/trello/auth_url\",\n \"importers-trello-authorize\": \"/importers/trello/authorize\",\n \"importers-trello-list-projects\": \"/importers/trello/list_projects\",\n \"importers-trello-list-users\": \"/importers/trello/list_users\",\n \"importers-trello-import-project\": \"/importers/trello/import_project\",\n \"importers-jira-auth-url\": \"/importers/jira/auth_url\",\n \"importers-jira-authorize\": \"/importers/jira/authorize\",\n \"importers-jira-list-projects\": \"/importers/jira/list_projects\",\n \"importers-jira-list-users\": \"/importers/jira/list_users\",\n \"importers-jira-import-project\": \"/importers/jira/import_project\",\n \"importers-github-auth-url\": \"/importers/github/auth_url\",\n \"importers-github-authorize\": \"/importers/github/authorize\",\n \"importers-github-list-projects\": \"/importers/github/list_projects\",\n \"importers-github-list-users\": \"/importers/github/list_users\",\n \"importers-github-import-project\": \"/importers/github/import_project\",\n \"importers-asana-auth-url\": \"/importers/asana/auth_url\",\n \"importers-asana-authorize\": \"/importers/asana/authorize\",\n \"importers-asana-list-projects\": \"/importers/asana/list_projects\",\n \"importers-asana-list-users\": \"/importers/asana/list_users\",\n \"importers-asana-import-project\": \"/importers/asana/import_project\"\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\", \"$tgEpicsResourcesProvider\", \"$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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function SearchController(scope1, repo, rs, params, q, location, appMetaService, navUrls, translate, errorHandlingService, projectService1) {\n var description, loadSearchData, title;\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.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.sectionName = \"Search\";\n this.loadInitialData();\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 this.appMetaService.setAll(title, description);\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 var project;\n project = this.projectService.project.toJS();\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.epicStatusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\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\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 var project;\n project = this.loadProject();\n this.scope.projectId = project.id;\n return this.fillUsersAndRoles(project.members, project.roles);\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, $analytics) {\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\", \"epics\", \"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 epics: $templatecache.get(\"search-epics\"),\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 $location.search(\"text\", searchTerm);\n }\n return $analytics.trackPage($location.url(), \"Search\");\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\", \"$tgAnalytics\", SearchDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"ec\");\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 this.initialized = true;\n return this.setUserId();\n };\n\n AnalyticsService.prototype.setUserId = function() {\n var ref, ref1;\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga('set', 'userId', (ref = this.rootscope) != null ? (ref1 = ref.user) != null ? ref1.uuid : void 0 : void 0);\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 AnalyticsService.prototype.ecViewPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'detail');\n return this.trackEvent(\"ecommerce\", \"view-product-detail\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecClickPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'click');\n return this.trackEvent(\"ecommerce\", \"click-product\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecListPlans = function(arg, page) {\n var i, len, plan, plans, position;\n plans = arg[0];\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n position = 1;\n for (i = 0, len = plans.length; i < len; i++) {\n plan = plans[i];\n this.win.ga('ec:addImpression', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'list': page,\n 'position': position\n });\n position++;\n }\n return this.trackEvent(\"ecommerce\", \"list-plans\");\n };\n\n AnalyticsService.prototype.ecAddToCart = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'add');\n return this.trackEvent('ecommerce', 'add-to-cart', 'Collect Payment Info', null);\n };\n\n AnalyticsService.prototype.ecConfirmChange = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 1\n });\n return this.trackEvent(\"ecommerce\", \"start-checkout\", \"start\", 1);\n };\n\n AnalyticsService.prototype.ecPurchase = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 2\n });\n this.trackEvent(\"ecommerce\", \"end-checkout\", \"end\", 2);\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'purchase', {\n 'id': plan_id,\n 'revenue': plan_price\n });\n return this.trackEvent('ecommerce', 'checkout', 'Plan checkout', null);\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-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, ListItemAssignedtoDirective, ListItemEpicStatusDirective, ListItemIssueStatusDirective, ListItemPriorityDirective, ListItemSeverityDirective, ListItemTaskStatusDirective, ListItemTypeDirective, ListItemUsStatusDirective, SprintProgressBarDirective, TgMainTitleDirective, TgProgressBarDirective, UserDisplayDirective, 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 });\n return $el.picker = new Pikaday(datePickerConfig);\n };\n unbind = $rootscope.$on(\"$translateChangeEnd\", (function(_this) {\n return function(ctx) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n return initialize();\n };\n })(this));\n $attrs.$observe(\"pickerValue\", function(val) {\n $el.val(val);\n if (val != null) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n initialize();\n }\n return $el.picker.setDate(val);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n unbind();\n return $el.picker.destroy();\n });\n };\n return {\n link: link\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, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.ngModel, function(model) {\n var avatar, ref;\n if (model != null) {\n avatar = avatarService.getAvatar(model.owner_extra_info);\n $scope.owner = model.owner_extra_info || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n $scope.owner.avatar = avatar.url;\n $scope.owner.bg = avatar.bg;\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\", \"tgAvatarService\", CreatedByDisplayDirective]);\n\n UserDisplayDirective = function($template, $compile, $translate, $navUrls, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var avatar, id;\n id = $attrs.tgUserId;\n $scope.user = $scope.usersById[id] || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n avatar = avatarService.getAvatar($scope.usersById[id] || null);\n $scope.user.avatar = avatar.url;\n $scope.user.bg = avatar.bg;\n $scope.url = $scope.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: $scope.user.username\n }) : \"\";\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n scope: true,\n templateUrl: \"common/components/user-display.html\"\n };\n };\n\n module.directive(\"tgUserDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", \"tgAvatarService\", UserDisplayDirective]);\n\n WatchersDirective = function($rootscope, $confirm, $repo, $modelTransform, $template, $compile, $translate) {\n var link;\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 = function(watchers) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watchers;\n return item;\n });\n transform.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 transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n deleteWatcher = function(watcherIds) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watcherIds;\n return item;\n });\n transform.then(function() {\n var item, watchers;\n item = $modelTransform.getObj();\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 transform.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n renderWatchers = function(watchers) {\n $scope.watchers = watchers;\n return $scope.isEditable = isEditable();\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 watchers = _.filter(watchers, function(it) {\n return !!it;\n });\n return renderWatchers(watchers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n templateUrl: \"common/components/watchers.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", \"$translate\", WatchersDirective]);\n\n AssignedToDirective = function($rootscope, $confirm, $repo, $loading, $modelTransform, $template, $translate, $compile, $currentUserService, avatarService) {\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 = function(userId) {\n var currentLoading, item, transform;\n item = $model.$modelValue.clone();\n item.assigned_to = userId;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(item) {\n item.assigned_to = userId;\n return item;\n });\n transform.then(function() {\n currentLoading.finish();\n renderAssignedTo($modelTransform.getObj());\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n });\n return transform;\n };\n renderAssignedTo = function(assignedObject) {\n var avatar, bg, ctx, fullName, html, isIocaine, isUnassigned;\n avatar = avatarService.getAvatar(assignedObject != null ? assignedObject.assigned_to_extra_info : void 0);\n bg = null;\n if ((assignedObject != null ? assignedObject.assigned_to : void 0) != null) {\n fullName = assignedObject.assigned_to_extra_info.full_name_display;\n isUnassigned = false;\n bg = avatar.bg;\n } else {\n fullName = $translate.instant(\"COMMON.ASSIGNED_TO.ASSIGN\");\n isUnassigned = true;\n }\n isIocaine = assignedObject != null ? assignedObject.is_iocaine : void 0;\n ctx = {\n fullName: fullName,\n avatar: avatar.url,\n bg: bg,\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\", \".remove-user\", 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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$translate\", \"$compile\", \"tgCurrentUserService\", \"tgAvatarService\", 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 ListItemEpicStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var epic;\n epic = $scope.$eval($attrs.tgListitemEpicStatus);\n return bindOnce($scope, \"epicStatusById\", function(epicStatusById) {\n return $el.html(epicStatusById[epic.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemEpicStatus\", ListItemEpicStatusDirective);\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, avatarService) {\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 avatar, ctx, item, member;\n item = $scope.$eval($attrs.tgListitemAssignedto);\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = usersById[item.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\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\", \"tgAvatarService\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 if (title) {\n el.find(\".title\").text(title);\n }\n if (subtitle) {\n el.find(\".subtitle\").text(subtitle);\n }\n if (message) {\n el.find(\".message\").text(message);\n }\n el.on(\"click.confirm-dialog\", \".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\", \".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\", \".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(\".title\").html(message);\n el.on(\"click.confirm-dialog\", \".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\", \".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, icon) {\n var defered, detailImage, el, svgContainer, useSVG;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-success\");\n el.find(\"img\").remove();\n el.find(\"svg\").remove();\n if (icon) {\n if (icon.type === \"img\") {\n detailImage = $('').addClass('lb-icon').attr('src', icon.name);\n } else if (icon.type === \"svg\") {\n detailImage = document.createElement(\"div\");\n taiga.addClass(detailImage, \"icon\");\n taiga.addClass(detailImage, icon.name);\n taiga.addClass(detailImage, \"lb-icon\");\n svgContainer = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n useSVG = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n useSVG.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + icon.name);\n detailImage.appendChild(svgContainer).appendChild(useSVG);\n }\n if (detailImage) {\n el.find('section').prepend(detailImage);\n }\n }\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n el.on(\"click.confirm-dialog\", \".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\", \".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, spin) {\n var el;\n if (spin == null) {\n spin = false;\n }\n el = angular.element(\".lightbox-generic-loading\");\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n if (spin) {\n el.find(\".spin\").removeClass(\"hidden\");\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(\".title\").html(title);\n }\n if (message) {\n el.find(\".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').one('animationend', function() {\n return $(this).removeClass('inactive');\n });\n return delete _this.tsem;\n };\n })(this));\n return el.on(\"click\", \".icon-close, .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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, 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 RICHTEXT_TYPE = \"url\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\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 key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\n }, {\n key: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\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(scope1, rootscope, repo, rs, confirm, q) {\n this.scope = scope1;\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, hash;\n $ctrl = $ctrls[0];\n $model = $ctrls[1];\n hash = collapsedHash($attrs.type);\n $scope.collapsed = $storage.get(hash) || false;\n bindOnce($scope, $attrs.ngModel, function(value) {\n $ctrl.initialize($attrs.type, value.id);\n return $ctrl.loadCustomAttributesValues();\n });\n $scope.toggleCollapse = function() {\n $scope.collapsed = !$scope.collapsed;\n return $storage.set(hash, $scope.collapsed);\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm\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, wysiwygService) {\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, scope, 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 scope = $scope.$new();\n scope.attributeHtml = wysiwygService.getHTML(value);\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 $scope.saveCustomRichText = (function(_this) {\n return function(markdown, callback) {\n attributeValue.value = markdown;\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n callback();\n return render(attributeValue, false);\n });\n };\n })(this);\n $scope.cancelCustomRichText = (function(_this) {\n return function() {\n render(attributeValue, false);\n return null;\n };\n })(this);\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, input;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n input = $el.find(\"input[name=value], textarea[name='value']\");\n attributeValue.value = input.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 }\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 if (attributeValue.value === null || attributeValue.value === void 0) {\n attributeValue.value = \"\";\n }\n $scope.customAttributeValue = attributeValue;\n render(attributeValue);\n $el.on(\"click\", \".js-value-view-mode span a\", function(event) {\n return event.stopPropagation();\n });\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\", \".js-edit-description\", 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\", \".js-save-description\", 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\", \"tgWysiwygService\", CustomAttributeValueDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 EmojisService, 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\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n EmojisService = (function(superClass) {\n extend(EmojisService, superClass);\n\n EmojisService.$inject = [];\n\n function EmojisService() {\n this.replaceEmojiNameByHtmlImgs = bind(this.replaceEmojiNameByHtmlImgs, this);\n this.replaceEmojiNameByImgs = bind(this.replaceEmojiNameByImgs, this);\n this.replaceImgsByEmojiName = bind(this.replaceImgsByEmojiName, this);\n this.getEmojiByName = bind(this.getEmojiByName, this);\n this.getEmojiById = bind(this.getEmojiById, this);\n this.searchByName = bind(this.searchByName, this);\n this.emojis = _.map(taiga.emojis, function(it) {\n it.image = (\"/\" + window._version + \"/emojis/\") + it.image;\n return it;\n });\n this.emojisById = _.keyBy(this.emojis, 'id');\n this.emojisByName = _.keyBy(this.emojis, 'name');\n }\n\n EmojisService.prototype.searchByName = function(name) {\n return _.filter(this.emojis, function(it) {\n return it.name.indexOf(name) !== -1;\n });\n };\n\n EmojisService.prototype.getEmojiById = function(id) {\n return this.emojisById[id];\n };\n\n EmojisService.prototype.getEmojiByName = function(name) {\n return this.emojisByName[name];\n };\n\n EmojisService.prototype.replaceImgsByEmojiName = function(html) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(html, /emojis\\/([^\"]+).png\"/gi);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(']+\\>', 'g');\n emoji = this.getEmojiById(emojiId);\n html = html.replace(regexImgs, ':' + emoji.name + ':');\n }\n return html;\n };\n\n EmojisService.prototype.replaceEmojiNameByImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + emojiId + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '![alt](' + emoji.image + ')');\n }\n }\n return text;\n };\n\n EmojisService.prototype.replaceEmojiNameByHtmlImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + _.escapeRegExp(emojiId) + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '');\n }\n }\n return text;\n };\n\n return EmojisService;\n\n })(taiga.Service);\n\n module.service(\"$tgEmojis\", EmojisService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, points) {\n us.points = points;\n estimationProcess.render();\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 loading: false\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, $template, $compile, $modelTransform, $confirm) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = function(points) {\n var onError, transform;\n transform = $modelTransform.save((function(_this) {\n return function(us) {\n us.points = points;\n return us;\n };\n })(this));\n onError = (function(_this) {\n return function() {\n return $confirm.notify(\"error\");\n };\n })(this);\n return transform.then(null, onError);\n };\n $scope.$watchCollection(function() {\n return $model.$modelValue && $model.$modelValue.points;\n }, function() {\n var estimationProcess, us;\n us = $model.$modelValue;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n estimationProcess.loading = roleId;\n estimationProcess.render();\n return save(points).then(function() {\n estimationProcess.loading = false;\n $rootScope.$broadcast(\"object:updated\");\n return estimationProcess.render();\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 loading: estimationProcess.loading\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\", \"$tgTemplate\", \"$compile\", \"$tgQueueModelTransformation\", \"$tgConfirm\", UsEstimationDirective]);\n\n EstimationsService = function($template, $repo, $confirm, $q, $qqueue) {\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.loading = false;\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 deferred.resolve();\n return _this.render();\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 \"?\";\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 return _this.onSelectedPointForRole(roleId, pointId, points);\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\", \"$tgRepo\", \"$tgConfirm\", \"$q\", \"$tgQqueue\", EstimationsService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 byRefFilter, darkerFilter, defaultFilter, emojify, inArray, markdownToHTML, module, momentFormat, momentFromNow, sizeFormat, taiga, toMutableFilter, 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 toMutableFilter = function() {\n var memoizedMutable, toMutable;\n toMutable = function(js) {\n return js.toJS();\n };\n memoizedMutable = _.memoize(toMutable);\n return function(input) {\n if (input instanceof Immutable.List) {\n return memoizedMutable(input);\n }\n return input;\n };\n };\n\n module.filter(\"toMutable\", toMutableFilter);\n\n byRefFilter = function($filterFilter) {\n return function(userstories, filter) {\n var cleanRef;\n if (filter != null ? filter.startsWith(\"#\") : void 0) {\n cleanRef = filter.substr(1);\n return _.filter(userstories, (function(_this) {\n return function(us) {\n return String(us.ref).startsWith(cleanRef);\n };\n })(this));\n }\n return $filterFilter(userstories, filter);\n };\n };\n\n module.filter(\"byRef\", [\"filterFilter\", byRefFilter]);\n\n darkerFilter = function() {\n return function(color, luminosity) {\n var black, c, i, j, len, newColor, ref, white;\n color = new String(color).replace(/[^0-9a-f]/gi, '');\n if (color.length < 6) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n luminosity = luminosity || 0;\n newColor = \"#\";\n c = 0;\n i = 0;\n black = 0;\n white = 255;\n ref = [0, 1, 2];\n for (j = 0, len = ref.length; j < len; j++) {\n i = ref[j];\n c = parseInt(color.substr(i * 2, 2), 16);\n c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);\n newColor += (\"00\" + c).substr(c.length);\n }\n return newColor;\n };\n };\n\n module.filter(\"darker\", darkerFilter);\n\n markdownToHTML = function(wysiwigService) {\n return function(input) {\n if (input) {\n return wysiwigService.getHTML(input);\n }\n return \"\";\n };\n };\n\n module.filter(\"markdownToHTML\", [\"tgWysiwygService\", markdownToHTML]);\n\n inArray = function($filter) {\n return function(list, arrayFilter, element) {\n var filter;\n if (arrayFilter) {\n filter = $filter(\"filter\");\n return filter(list, function(listItem) {\n return arrayFilter.indexOf(listItem[element]) !== -1;\n });\n }\n };\n };\n\n module.filter(\"inArray\", [\"$filter\", inArray]);\n\n emojify = function($emojis) {\n return function(input) {\n if (input) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(input));\n }\n return \"\";\n };\n };\n\n module.filter(\"emojify\", [\"$tgEmojis\", emojify]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, BlockLightboxDirective, BlockingMessageInputDirective, CreateBulkUserstoriesDirective, CreateEditUserstoryDirective, LightboxDirective, LightboxKeyboardNavigationService, LightboxLeaveProjectWarningDirective, LightboxService, WatchersLightboxDirective, bindOnce, debounce, module, sizeFormat, timeout, 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 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 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 trim = this.taiga.trim;\n\n LightboxService = (function(superClass) {\n extend(LightboxService, superClass);\n\n function LightboxService(animationFrame, q, rootScope) {\n this.animationFrame = animationFrame;\n this.q = q;\n this.rootScope = rootScope;\n }\n\n LightboxService.prototype.open = function($el, onClose, onEsc) {\n var defered, docEl, lightboxContent;\n this.onClose = onClose;\n if (_.isString($el)) {\n $el = $($el);\n }\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 var firstField;\n firstField = $el.find('input,textarea').first();\n if (firstField.length) {\n return $el.find('input,textarea').first().focus();\n } else if (document.activeElement) {\n return $(document.activeElement).blur();\n }\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 if (onEsc) {\n return _this.rootScope.$applyAsync(onEsc);\n } else {\n return _this.close($el);\n }\n }\n };\n })(this));\n return defered.promise;\n };\n\n LightboxService.prototype.close = function($el) {\n return new Promise((function(_this) {\n return function(resolve) {\n var docEl, scope;\n if (_.isString($el)) {\n $el = $($el);\n }\n docEl = angular.element(document);\n docEl.off(\".lightbox\");\n docEl.off(\".keyboard-navigation\");\n $el.addClass('close-started');\n _this.animationFrame.add(function() {\n $el.addClass('close');\n return $el.one(\"transitionend\", function() {\n $el.removeAttr('style');\n $el.removeClass(\"open\").removeClass('close').removeClass('close-started');\n if (_this.onClose) {\n _this.rootScope.$apply(_this.onClose);\n }\n return resolve();\n });\n });\n if ($el.hasClass(\"remove-on-close\")) {\n scope = $el.data(\"scope\");\n if (scope) {\n scope.$destroy();\n }\n return $el.remove();\n }\n };\n })(this));\n };\n\n LightboxService.prototype.getLightboxOpen = function() {\n return $(\".lightbox.open:not(.close-started)\");\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\", \"$rootScope\", 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 if (!$attrs.$attr.visible) {\n return $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\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, $modelTransform, $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 = (function(_this) {\n return function(finishCallback) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.is_blocked = false;\n item.blocked_note = \"\";\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n return finishCallback();\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return item.revert();\n });\n transform[\"finally\"](function() {\n return finishCallback();\n });\n return transform;\n };\n })(this);\n block = function() {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\".button-green\")).start();\n transform = $modelTransform.save(function(item) {\n item.is_blocked = true;\n item.blocked_note = $el.find(\".reason\").val();\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\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 return unblock(finishCallback);\n };\n })(this));\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return block();\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\", \"$tgQueueModelTransformation\", \"$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, close, createAttachments, deleteAttachments, form, resetAttachments, submit, submitButton;\n form = null;\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 attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.us.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([value, color]);\n return $scope.us.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.us.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.us.tags = itemtags;\n return _.pull($scope.us.tags, value);\n };\n $scope.$on(\"usform:new\", function(ctx, projectId, status, statusList) {\n if (form) {\n form.reset();\n }\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 subject: \"\",\n description: \"\"\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 $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\n });\n $scope.$on(\"usform:edit\", function(ctx, us, attachments) {\n if (form) {\n form.reset();\n }\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 $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\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, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n params = {\n include_attachments: true,\n include_tasks: true\n };\n if ($scope.isNew) {\n promise = $repo.create(\"userstories\", $scope.us);\n broadcastEvent = \"usform:new:success\";\n } else {\n promise = $repo.save($scope.us, true);\n broadcastEvent = \"usform:edit:success\";\n }\n promise.then(function(data) {\n return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n currentLoading.finish();\n lightboxService.close($el);\n return $rs.userstories.getByRef(data.project, data.ref, params).then(function(us) {\n return $rootScope.$broadcast(broadcastEvent, us);\n });\n };\n })(this));\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 close = (function(_this) {\n return function() {\n if (!$scope.us.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.us.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.us.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.on(\"submit\", \"form\", submit);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\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, $model) {\n var link;\n link = function($scope, $el, attrs) {\n var form, submit, submitButton;\n form = null;\n $scope.$on(\"usform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\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, 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 result = _.map(result.data, (function(_this) {\n return function(x) {\n return $model.make_model('userstories', x);\n };\n })(this));\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\", \"$tgModel\", CreateBulkUserstoriesDirective]);\n\n AssignedToLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\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 _.includes(username, text);\n };\n render = function(selected, text) {\n var ctx, html, users, visibleUsers;\n users = _.clone($scope.activeUsers, true);\n if (selected != null) {\n users = _.reject(users, {\n \"id\": selected.id\n });\n }\n users = _.sortBy(users, function(o) {\n if (o.id === $scope.user.id) {\n return 0;\n } else {\n return o.id;\n }\n });\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n return user.avatar = avatarService.getAvatar(user);\n });\n if (selected) {\n if (selected) {\n selected.avatar = avatarService.getAvatar(selected);\n }\n }\n ctx = {\n selected: selected,\n users: _.slice(users, 0, 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\", \"tgAvatarService\", AssignedToLightboxDirective]);\n\n WatchersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\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 _.includes(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, visibleUsers;\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n user.avatar = avatarService.getAvatar(user);\n return user;\n });\n ctx = {\n selected: false,\n users: visibleUsers,\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(200, 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\", \"tgAvatarService\", WatchersLightboxDirective]);\n\n LightboxLeaveProjectWarningDirective = 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-leave-project-warning.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLightboxLeaveProjectWarning\", [\"lightboxService\", LightboxLeaveProjectWarningDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 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 open: function() {\n return open;\n },\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 if (!target.hasClass('loading') && !service.settings.template) {\n service.settings.template = target.html();\n }\n timeoutId = setTimeout((function() {\n if (!target.hasClass('loading')) {\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 priority: 99999,\n link: link\n };\n };\n\n module.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 $scope.$watch($attrs.tgRelatedTaskStatus, function() {\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n return updateTaskStatus($el, task, $scope.taskStatusById);\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 ColorizeTagsBacklogDirective, LbTagLineDirective, 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 _.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 ColorizeTagsBacklogDirective = function($emojis) {\n var link, template;\n template = _.template(\"<% _.each(tags, function(tag) { %>\\n <% if (tag[1] !== null) { %>\\n \\\"\\n title=\\\"<%- tag[0] %>\\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\\n<% _.each(tags, function(tag) { %>\\n <% if (tag[1] === null) { %>\\n \\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\");\n link = function($scope, $el, $attrs, $ctrl) {\n var render;\n render = function(tags) {\n var html;\n html = template({\n tags: tags,\n emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n });\n return $el.html(html);\n };\n $scope.$watch($attrs.tgColorizeBacklogTags, 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(\"tgColorizeBacklogTags\", [\"$tgEmojis\", ColorizeTagsBacklogDirective]);\n\n LbTagLineDirective = function($rs, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, autocomplete, link, templateTags;\n ENTER_KEY = 13;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true);\n autocomplete = null;\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideSaveButton, renderTags, resetInput, saveInputTag, showSaveButton, withoutColors;\n withoutColors = _.has($attrs, \"withoutColors\");\n renderTags = function(tags, tagsColors) {\n var color, ctx, html;\n if (tagsColors == null) {\n tagsColors = [];\n }\n color = !withoutColors ? tagsColors[t] : null;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n style: color ? \"border-left: 5px solid \" + color : \"\"\n };\n })\n };\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\".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 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\", \".remove-tag\", 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 input;\n input = $el.find(\"input\");\n autocomplete = new Awesomplete(input[0], {\n list: _.keys(project.tags_colors)\n });\n return input.on(\"awesomplete-selectcomplete\", function() {\n addValue(input.val());\n return input.val(\"\");\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}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, form, getLastSprint, hasErrors, remove, resetSprint, submit, ussToAdd;\n hasErrors = false;\n createSprint = true;\n form = null;\n $scope.newSprint = {};\n ussToAdd = null;\n resetSprint = function() {\n if (form) {\n form.reset();\n }\n return $scope.newSprint = {\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, estimated_end, estimated_start, 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 broadcastEvent = null;\n estimated_start = $('.date-start').val();\n estimated_end = $('.date-end').val();\n if (createSprint) {\n newSprint = angular.copy($scope.newSprint);\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.create(\"milestones\", newSprint);\n broadcastEvent = \"sprintform:create:success\";\n } else {\n newSprint = $scope.newSprint.realClone();\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, 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 $scope.sprints = _.map($scope.sprints, function(it) {\n if (it.id === data.id) {\n return data;\n } else {\n return it;\n }\n });\n if (broadcastEvent === \"sprintform:create:success\" && ussToAdd) {\n $rootscope.$broadcast(broadcastEvent, data, ussToAdd);\n } else {\n $rootscope.$broadcast(broadcastEvent, data);\n }\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.newSprint.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.newSprint);\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove($scope.newSprint).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, uss) {\n var estimatedFinish, estimatedStart, lastSprint, lastSprintNameDom, prettyDate, text;\n ussToAdd = uss;\n resetSprint();\n form = $el.find(\"form\").checksley();\n form.reset();\n createSprint = true;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.newSprint.project = projectId;\n $scope.newSprint.name = null;\n $scope.newSprint.slug = null;\n lastSprint = getLastSprint();\n estimatedStart = moment();\n if (lastSprint) {\n estimatedStart = moment(lastSprint.estimated_finish);\n } else if ($scope.newSprint.estimated_start) {\n estimatedStart = moment($scope.newSprint.estimated_start);\n }\n $scope.newSprint.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.newSprint.estimated_finish) {\n estimatedFinish = moment($scope.newSprint.estimated_finish);\n }\n $scope.newSprint.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.newSprint = sprint.realClone();\n $scope.newSprint.estimated_start = moment($scope.newSprint.estimated_start).format(prettyDate);\n return $scope.newSprint.estimated_finish = moment($scope.newSprint.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\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n BacklogController.prototype.storeCustomFiltersName = 'backlog-custom-filters';\n\n BacklogController.prototype.storeFiltersName = 'backlog-filters';\n\n BacklogController.prototype.backlogOrder = {};\n\n BacklogController.prototype.milestonesOrder = {};\n\n function BacklogController(scope1, rootscope, repo, confirm, rs, params1, q, location, appMetaService, navUrls, events, analytics, translate, loading, rs2, modelTransform, errorHandlingService, storage, filterRemoteStorageService, projectService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n bindMethods(this);\n this.backlogOrder = {};\n this.milestonesOrder = {};\n this.page = 1;\n this.disablePagination = false;\n this.firstLoadComplete = false;\n this.scope.userstories = [];\n if (this.applyStoredFilters(this.params.pslug, \"backlog-filters\")) {\n return;\n }\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.displayVelocity = false;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n _this.firstLoadComplete = true;\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.filtersReloadContent = function() {\n return this.loadUserstories(true);\n };\n\n BacklogController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories(true);\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\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(e, data, ussToMove) {\n _this.loadSprints().then(function() {\n return _this.scope.$broadcast(\"sprintform:create:success:callback\", ussToMove);\n });\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\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(true);\n _this.loadProjectStats();\n _this.rootscope.$broadcast(\"filters:update\");\n _this.confirm.notify(\"success\");\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(true);\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(event, data) {\n var index;\n index = _.findIndex(_this.scope.userstories, function(us) {\n return us.id === data.id;\n });\n _this.scope.userstories[index] = data;\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\", (function(_this) {\n return function() {\n _this.loadSprints();\n return _this.loadProjectStats();\n };\n })(this));\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.loadAllPaginatedUserstories();\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.toggleVelocityForecasting = function() {\n this.displayVelocity = !this.displayVelocity;\n if (!this.displayVelocity) {\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n } else {\n this.scope.visibleUserStories = _.map(this.forecastedStories, function(it) {\n return it.ref;\n });\n }\n return scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n };\n })(this));\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 _this.calculateForecasting();\n return stats;\n };\n })(this));\n };\n\n BacklogController.prototype.setMilestonesOrder = function(sprints) {\n var it, j, len, results, sprint;\n results = [];\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n this.milestonesOrder[sprint.id] = {};\n results.push((function() {\n var l, len1, ref1, results1;\n ref1 = sprint.user_stories;\n results1 = [];\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n it = ref1[l];\n results1.push(this.milestonesOrder[sprint.id][it.id] = it.sprint_order);\n }\n return results1;\n }).call(this));\n }\n return results;\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.setMilestonesOrder(sprints);\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.setMilestonesOrder(sprints);\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 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.openSprints = function() {\n return _.filter(this.scope.sprints, (function(_this) {\n return function(sprint) {\n return !sprint.closed;\n };\n })(this)).reverse();\n };\n\n BacklogController.prototype.loadAllPaginatedUserstories = function() {\n var page;\n page = this.page;\n return this.loadUserstories(true, this.scope.userstories.length).then((function(_this) {\n return function() {\n return _this.page = page;\n };\n })(this));\n };\n\n BacklogController.prototype.loadUserstories = function(resetPagination, pageSize) {\n var params, promise;\n if (resetPagination == null) {\n resetPagination = false;\n }\n if (!this.scope.projectId) {\n return null;\n }\n this.loadingUserstories = true;\n this.disablePagination = true;\n params = _.clone(this.location.search());\n this.rs.userstories.storeQueryParams(this.scope.projectId, params);\n if (resetPagination) {\n this.page = 1;\n }\n params.page = this.page;\n promise = this.rs.userstories.listUnassigned(this.scope.projectId, params, pageSize);\n return promise.then((function(_this) {\n return function(result) {\n var header, it, j, len, ref1, userstories;\n userstories = result[0];\n header = result[1];\n if (resetPagination) {\n _this.scope.userstories = [];\n }\n _this.scope.userstories = _this.scope.userstories.concat(_.sortBy(userstories, \"backlog_order\"));\n _this.scope.visibleUserStories = _.map(_this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = _this.scope.userstories;\n for (j = 0, len = ref1.length; j < len; j++) {\n it = ref1[j];\n _this.backlogOrder[it.id] = it.backlog_order;\n }\n _this.loadingUserstories = false;\n if (header('x-pagination-next')) {\n _this.disablePagination = false;\n _this.page++;\n }\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()]).then(this.calculateForecasting);\n };\n\n BacklogController.prototype.calculateForecasting = function() {\n var backlog_points_sum, current_sum, j, len, ref1, results, stats, total_points, us;\n stats = this.scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n backlog_points_sum = 0;\n this.forecastedStories = [];\n ref1 = this.scope.userstories;\n results = [];\n for (j = 0, len = ref1.length; j < len; j++) {\n us = ref1[j];\n current_sum += us.total_points;\n backlog_points_sum += us.total_points;\n this.forecastedStories.push(us);\n if (stats.speed > 0 && backlog_points_sum > stats.speed) {\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n BacklogController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_backlog_activated) {\n this.errorHandlingService.permissionDenied();\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\n BacklogController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n return this.loadBacklog().then((function(_this) {\n return function() {\n var milestone;\n return _this.generateFilters(milestone = \"null\");\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.moveUs = function(ctx, usList, newUsIndex, newSprintId) {\n var afterDestination, beforeDestination, currentSprintId, data, it, j, key, l, len, len1, len2, len3, len4, len5, len6, list, m, modifiedUs, n, newSprint, o, oldSprintId, options, orderField, orderList, p, previous, previousWithTheSameOrder, project, promise, q, ref1, ref2, setOrders, setPreviousOrders, sprint, startIndex, us;\n oldSprintId = usList[0].milestone;\n project = usList[0].project;\n if (oldSprintId) {\n sprint = this.scope.sprintsById[oldSprintId] || this.scope.closedSprintsById[oldSprintId];\n }\n if (newSprintId) {\n newSprint = this.scope.sprintsById[newSprintId] || this.scope.closedSprintsById[newSprintId];\n }\n currentSprintId = newSprintId !== oldSprintId ? newSprintId : oldSprintId;\n orderList = null;\n orderField = \"\";\n if (newSprintId !== oldSprintId) {\n if (newSprintId === null) {\n for (key = j = 0, len = usList.length; j < len; key = ++j) {\n us = usList[key];\n _.remove(sprint.user_stories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n beforeDestination = _.slice(this.scope.userstories, 0, newUsIndex);\n afterDestination = _.slice(this.scope.userstories, newUsIndex);\n this.scope.userstories = this.scope.userstories.concat(usList);\n } else {\n for (l = 0, len1 = usList.length; l < len1; l++) {\n us = usList[l];\n _.remove(this.scope.userstories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[newSprint.id];\n beforeDestination = _.slice(newSprint.user_stories, 0, newUsIndex);\n afterDestination = _.slice(newSprint.user_stories, newUsIndex);\n newSprint.user_stories = newSprint.user_stories.concat(usList);\n }\n } else {\n if (oldSprintId === null) {\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n list = _.filter(this.scope.userstories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n } else {\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[sprint.id];\n list = _.filter(newSprint.user_stories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n }\n }\n previous = beforeDestination[beforeDestination.length - 1];\n setPreviousOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = orderList[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, function(it) {\n return it[orderField] === orderList[previous.id];\n });\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, function(it) {\n return {\n us_id: it.id,\n order: orderList[it.id]\n };\n });\n }\n }\n modifiedUs = [];\n for (key = m = 0, len2 = usList.length; m < len2; key = ++m) {\n us = usList[key];\n us.milestone = currentSprintId;\n us[orderField] = startIndex + key;\n orderList[us.id] = us[orderField];\n modifiedUs.push({\n us_id: us.id,\n order: us[orderField]\n });\n }\n startIndex = orderList[usList[usList.length - 1].id];\n for (key = n = 0, len3 = afterDestination.length; n < len3; key = ++n) {\n it = afterDestination[key];\n orderList[it.id] = startIndex + key + 1;\n }\n this.scope.userstories = _.sortBy(this.scope.userstories, (function(_this) {\n return function(it) {\n return _this.backlogOrder[it.id];\n };\n })(this));\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = this.scope.sprints;\n for (o = 0, len4 = ref1.length; o < len4; o++) {\n sprint = ref1[o];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n ref2 = this.scope.closedSprints;\n for (p = 0, len5 = ref2.length; p < len5; p++) {\n sprint = ref2[p];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n if (usList.length > 1 && (newSprintId !== oldSprintId)) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateMilestone(project, newSprintId, data);\n } else if (usList.length > 1) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateBacklogOrder(project, data);\n } else {\n setOrders = {};\n for (q = 0, len6 = setPreviousOrders.length; q < len6; q++) {\n it = setPreviousOrders[q];\n setOrders[it.us_id] = it.order;\n }\n options = {\n headers: {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n promise = this.repo.save(usList[0], true, {}, options, true);\n }\n promise.then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"sprint:us:moved\");\n if (_this.scope.closedSprintsById && _this.scope.closedSprintsById[oldSprintId]) {\n return _this.rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n };\n })(this));\n return promise;\n };\n\n BacklogController.prototype.updateUserStoryStatus = function() {\n return this.generateFilters().then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"filters:update\");\n _this.loadProjectStats();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.filtersReloadContent();\n }\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(\"edit-story\").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.q.all([_this.loadProjectStats(), _this.loadSprints()]);\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, taiga.UsFiltersMixin));\n\n module.controller(\"BacklogController\", BacklogController);\n\n BacklogDirective = function($repo, $rootscope, $translate, $rs) {\n var doomLineTemplate, link, linkDoomLine, linkFilters, linkToolbar, openFilterInit, 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.displayVelocity) {\n removeDoomlineDom();\n }\n if (($scope.stats != null) && ($scope.stats.total_points != null) && $scope.stats.total_points !== 0 && ($scope.displayVelocity == null)) {\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 $scope.$on(\"userstories:forecast\", removeDoomlineDom);\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 data, 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 data = _.map(selectedUss, function(us) {\n return {\n us_id: us.id,\n order: us.sprint_order\n };\n });\n $rs.userstories.bulkUpdateMilestone($scope.project.id, $scope.sprints[0].id, data).then((function(_this) {\n return function() {\n $ctrl.loadSprints();\n $ctrl.loadProjectStats();\n $ctrl.toggleVelocityForecasting();\n return $ctrl.calculateForecasting();\n };\n })(this));\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 $scope.$on(\"sprintform:create:success:callback\", function(e, ussToMove) {\n return _.partial(moveToCurrentSprint, ussToMove)();\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 $el.on(\"click\", \"#show-tags\", function(event) {\n event.preventDefault();\n $ctrl.toggleShowTags();\n return showHideTags($ctrl);\n });\n return $el.on(\"click\", \".forecasting-add-sprint\", function(event) {\n var ussToMove, ussToMoveList;\n ussToMoveList = $ctrl.forecastedStories;\n if ($scope.currentSprint) {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.milestone = $scope.currentSprint.id;\n us.order = index;\n return us;\n });\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n } else {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.order = index;\n return us;\n });\n return $rootscope.$broadcast(\"sprintform:create\", $scope.projectId, ussToMove);\n }\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 openFilterInit = function($scope, $el, $ctrl) {\n var sidebar;\n sidebar = $el.find(\"sidebar.backlog-filter\");\n sidebar.addClass(\"active\");\n return $ctrl.activeFilters = true;\n };\n showHideFilter = function($scope, $el, $ctrl) {\n var hideText, showText, sidebar, target;\n sidebar = $el.find(\"sidebar.backlog-filter\");\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 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 filters = $ctrl.location.search();\n if (filters.status || filters.tags || filters.q || filters.assigned_to || filters.owner) {\n openFilterInit($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\", \"$tgResources\", 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-down\").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\", \"$translate\", 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, points) {\n us.points = points;\n estimationProcess.render();\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\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 BacklogSortableDirective, bindOnce, deleteElement, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\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() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"project\", function(project) {\n var drake, initIsBacklog, scroll;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n initIsBacklog = false;\n drake = dragula([$el[0], $('.js-empty-backlog')[0]], {\n copySortSource: false,\n copy: false,\n isContainer: function(el) {\n return el.classList.contains('sprint-table');\n },\n moves: function(item) {\n if (!$(item).hasClass('row')) {\n return false;\n }\n return true;\n }\n });\n drake.on('drag', function(item, container) {\n var isChecked, parent;\n parent = $(item).parent();\n initIsBacklog = parent.hasClass('backlog-table-body');\n $(document.body).addClass(\"drag-active\");\n isChecked = $(item).find(\"input[type='checkbox']\").is(\":checked\");\n return window.dragMultiple.start(item, container);\n });\n drake.on('cloned', function(item) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, firstElement, index, isBacklog, parent, sameContainer, sprint, usList;\n parent = $(item).parent();\n $('.doom-line').remove();\n parent = $(item).parent();\n isBacklog = parent.hasClass('backlog-table-body') || parent.hasClass('js-empty-backlog');\n if (initIsBacklog || isBacklog) {\n sameContainer = initIsBacklog === isBacklog;\n } else {\n sameContainer = $(item).scope().sprint.id === parent.scope().sprint.id;\n }\n dragMultipleItems = window.dragMultiple.stop();\n $(document.body).removeClass(\"drag-active\");\n sprint = null;\n firstElement = dragMultipleItems.length ? dragMultipleItems[0] : item;\n if (isBacklog) {\n index = $(firstElement).index(\".backlog-table-body .row\");\n } else {\n index = $(firstElement).index();\n sprint = parent.scope().sprint.id;\n }\n if (!sameContainer) {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n if (dragMultipleItems.length) {\n _.each(dragMultipleItems, function(item) {\n return deleteElement(item);\n });\n } else {\n deleteElement(item);\n }\n } else {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n }\n return $scope.$emit(\"sprint:us:move\", usList, index, sprint);\n });\n scroll = autoScroll([window], {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSortable\", BacklogSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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(\".compact-sprint\");\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 > .compact-sprint\", function(event) {\n event.preventDefault();\n toggleSprint($el);\n return $el.find(\".sprint-table\").slideToggle(slideOptions);\n });\n $el.on(\"click\", \".edit-sprint\", 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(\"sprint\", function(sprint) {\n return render(sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\"\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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(new Date(x.day).getTime());\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, 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 bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n CreateEditTaskDirective = function($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate, $q, $confirm, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, close, createAttachments, deleteAttachments, resetAttachments, submit, submitButton, tagsToAdd;\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 attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\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 promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"task\", attachment.id);\n });\n return $q.all(promises);\n };\n tagsToAdd = [];\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.task.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.task.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.task.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.task.tags = itemtags;\n return _.pull($scope.task.tags, value);\n };\n $scope.$on(\"taskform:new\", function(ctx, sprintId, usId) {\n var create, newTask;\n $scope.task = $model.make_model('tasks', {\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 subject: \"\",\n description: \"\"\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 lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\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 lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\n });\n submitButton = $el.find(\".submit-button\");\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n params = {\n include_attachments: true,\n include_tasks: true\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 return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n return $rs.tasks.getByRef(data.project, data.ref, params).then(function(task) {\n return $rootscope.$broadcast(broadcastEvent, task);\n });\n };\n })(this));\n });\n currentLoading = $loading().target(submitButton).start();\n return promise.then(function(data) {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n close = (function(_this) {\n return function() {\n if (!$scope.task.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.task.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.task.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CreateBulkTasksDirective = function($repo, $rs, $rootscope, $loading, lightboxService, $model) {\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 result = _.map(result, (function(_this) {\n return function(x) {\n return $model.make_model('tasks', x);\n };\n })(this));\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\", \"$tgConfirm\", \"tgAttachmentsService\", CreateEditTaskDirective]);\n\n module.directive(\"tgLbCreateBulkTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$tgModel\", CreateBulkTasksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, 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\", \"tgResources\", \"$routeParams\", \"$q\", \"tgAppMetaService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"tgTaskboardTasks\", \"$tgStorage\", \"tgFilterRemoteStorageService\"];\n\n function TaskboardController(scope, rootscope, repo, confirm, rs1, rs2, params1, q1, appMetaService, location, navUrls, events, analytics, translate, errorHandlingService, taskboardTasksService, storage, filterRemoteStorageService) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\n this.params = params1;\n this.q = q1;\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 this.errorHandlingService = errorHandlingService;\n this.taskboardTasksService = taskboardTasksService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n bindMethods(this);\n this.taskboardTasksService.reset();\n this.scope.userstories = [];\n this.openFilter = false;\n if (this.applyStoredFilters(this.params.pslug, \"tasks-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"TASKBOARD.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usTasks\", (function(_this) {\n return function() {\n return _this.taskboardTasksService.usTasks;\n };\n })(this));\n }\n\n TaskboardController.prototype.firstLoad = function() {\n var promise;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n TaskboardController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n this.loadTasks().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n }\n if (this.zoomLevel === '0') {\n return this.rootscope.$broadcast(\"sprint:zoom0\");\n }\n };\n\n TaskboardController.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), \"tasks-filters\");\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.milestone = this.scope.sprintId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.tasks.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters')]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(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(event, tasks) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(tasks);\n });\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(event, task) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(task);\n });\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(event, task) {\n return _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.replaceModel(task);\n });\n };\n })(this));\n this.scope.$on(\"taskboard:task:move\", this.taskMove);\n return this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n };\n\n TaskboardController.prototype.onAssignedToChanged = function(ctx, userid, taskModel) {\n taskModel.assigned_to = userid;\n this.taskboardTasksService.replaceModel(taskModel);\n return this.repo.save(taskModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.loadTasks();\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.errorHandlingService.permissionDenied();\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._attrs;\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 _this.taskboardTasksService.setUserstories(_this.scope.userstories);\n return sprint;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTasks = function() {\n var params;\n params = {};\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n }\n params = _.merge(params, this.location.search());\n return this.rs.tasks.list(this.scope.projectId, this.scope.sprintId, null, params).then((function(_this) {\n return function(tasks) {\n _this.taskboardTasksService.init(_this.scope.project, _this.scope.usersById);\n return _this.taskboardTasksService.set(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 _this.generateFilters();\n return _this.loadTaskboard().then(function() {\n return _this.setRolePoints();\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.showPlaceHolder = function(statusId, usId) {\n if (!this.taskboardTasksService.tasksRaw.length) {\n if (this.scope.taskStatusList[0].id === statusId && (!this.scope.userstories.length || this.scope.userstories[0].id === usId)) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.editTask = function(id) {\n var task;\n task = this.taskboardTasksService.getTask(id);\n task = task.set('loading', true);\n this.taskboardTasksService.replace(task);\n return this.rs.tasks.getByRef(task.getIn(['model', 'project']), task.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingTask) {\n return _this.rs2.attachments.list(\"task\", task.get('id'), task.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"taskform:edit\", editingTask, attachments.toJS());\n task = task.set('loading', false);\n return _this.taskboardTasksService.replace(task);\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.taskMove = function(ctx, task, oldStatusId, usId, statusId, order) {\n var moveUpdateData, options, params, promise;\n task = this.taskboardTasksService.getTaskModel(task.get('id'));\n moveUpdateData = this.taskboardTasksService.move(task.id, usId, statusId, order);\n params = {\n status__is_archived: false,\n include_attachments: true\n };\n options = {\n headers: {\n \"set-orders\": JSON.stringify(moveUpdateData.set_orders)\n }\n };\n return promise = this.repo.save(task, true, params, options, true).then((function(_this) {\n return function(result) {\n var headers;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.taskboardTasksService.assignOrders(order);\n }\n _this.loadSprintStats();\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.loadTasks();\n }\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.toggleFold = function(id) {\n return this.taskboardTasksService.toggleFold(id);\n };\n\n TaskboardController.prototype.changeTaskAssignedTo = function(id) {\n var task;\n task = this.taskboardTasksService.getTaskModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", task);\n };\n\n TaskboardController.prototype.setRolePoints = function() {\n var computableRoles, getPoint, getRole, pointsByRole;\n computableRoles = _.filter(this.scope.project.roles, \"computable\");\n getRole = (function(_this) {\n return function(roleId) {\n roleId = parseInt(roleId, 10);\n return _.find(computableRoles, function(role) {\n return role.id === roleId;\n });\n };\n })(this);\n getPoint = (function(_this) {\n return function(pointId) {\n var poitnId;\n poitnId = parseInt(pointId, 10);\n return _.find(_this.scope.project.points, function(point) {\n return point.id === pointId;\n });\n };\n })(this);\n pointsByRole = _.reduce(this.scope.userstories, (function(_this) {\n return function(result, us, key) {\n _.forOwn(us.points, function(pointId, roleId) {\n var point, role;\n role = getRole(roleId);\n point = getPoint(pointId);\n if (!result[role.id]) {\n result[role.id] = role;\n result[role.id].points = 0;\n }\n return result[role.id].points += point.value;\n });\n return result;\n };\n })(this), {});\n return this.scope.pointsByRole = Object.keys(pointsByRole).map(function(key) {\n return pointsByRole[key];\n });\n };\n\n return TaskboardController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\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 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:zoom0\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$on(\"sprint:task:moved\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$watch(\"usTasks\", function() {\n if ($scope.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 });\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 if (usId) {\n tasks = $scope.usTasks.getIn([usId.toString(), statusId.toString()]).size;\n } else {\n tasks = $scope.usTasks.getIn(['null', statusId.toString()]).size;\n }\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 if ($scope.ctrl.zoomLevel === '0') {\n return column.css(\"max-width\", 148);\n } else {\n return column.css(\"max-width\", maxColumnWidth);\n }\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}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch;\n return unwatch = $scope.$watch(\"usTasks\", function(usTasks) {\n var containers, deleteElement, drake, filterError, itemEl, newParentScope, oldParentScope, scroll, tdom;\n if (!usTasks || !usTasks.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_task\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n filterError = function() {\n var text;\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\");\n return $tgConfirm.notify(\"error\", text);\n };\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n accepts: function(el, target) {\n return !$(target).hasClass('taskboard-userstory-box');\n },\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n oldParentScope = $(item).parent().scope();\n if ($el.hasClass(\"active-filters\")) {\n filterError();\n setTimeout((function() {\n return drake.cancel(true);\n }), 0);\n return false;\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemTask, newStatusId, newUsId, oldStatusId, oldUsId, parentEl;\n parentEl = $(item).parent();\n itemEl = $(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 return $scope.$apply(function() {\n return $rootscope.$broadcast(\"taskboard:task:move\", itemTask, itemTask.getIn(['model', 'status']), newUsId, newStatusId, itemIndex);\n });\n });\n scroll = autoScroll([$('.taskboard-table-body')[0]], {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$translate\", TaskboardSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 TaskboardTasksService, 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 TaskboardTasksService = (function(superClass) {\n extend(TaskboardTasksService, superClass);\n\n TaskboardTasksService.$inject = [];\n\n function TaskboardTasksService() {\n this.reset();\n }\n\n TaskboardTasksService.prototype.reset = function() {\n this.tasksRaw = [];\n this.foldStatusChanged = {};\n return this.usTasks = Immutable.Map();\n };\n\n TaskboardTasksService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n TaskboardTasksService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.toggleFold = function(taskId) {\n this.foldStatusChanged[taskId] = !this.foldStatusChanged[taskId];\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.add = function(task) {\n this.tasksRaw = this.tasksRaw.concat(task);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.set = function(tasks) {\n this.tasksRaw = tasks;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.setUserstories = function(userstories) {\n return this.userstories = userstories;\n };\n\n TaskboardTasksService.prototype.refreshRawOrder = function() {\n var i, len, ref, results, task;\n this.order = {};\n ref = this.tasksRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n task = ref[i];\n results.push(this.order[task.id] = task.taskboard_order);\n }\n return results;\n };\n\n TaskboardTasksService.prototype.assignOrders = function(order) {\n order = _.invert(order);\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.getTask = function(id) {\n var findedTask;\n findedTask = null;\n this.usTasks.forEach(function(us) {\n us.forEach(function(status) {\n findedTask = status.find(function(task) {\n return task.get('id') === id;\n });\n if (findedTask) {\n return false;\n }\n });\n if (findedTask) {\n return false;\n }\n });\n return findedTask;\n };\n\n TaskboardTasksService.prototype.replace = function(task) {\n return this.usTasks = this.usTasks.map(function(us) {\n return us.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, task);\n }\n return status;\n });\n });\n };\n\n TaskboardTasksService.prototype.getTaskModel = function(id) {\n return _.find(this.tasksRaw, function(task) {\n return task.id === id;\n });\n };\n\n TaskboardTasksService.prototype.replaceModel = function(task) {\n this.tasksRaw = _.map(this.tasksRaw, function(it) {\n if (task.id === it.id) {\n return task;\n } else {\n return it;\n }\n });\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.move = function(id, usId, statusId, index) {\n var afterDestination, beforeDestination, i, it, j, key, len, len1, previous, previousWithTheSameOrder, setOrders, taksWithoutMoved, task, taskByUsStatus;\n task = this.getTaskModel(id);\n taskByUsStatus = _.filter(this.tasksRaw, (function(_this) {\n return function(task) {\n return task.status === statusId && task.user_story === usId;\n };\n })(this));\n taskByUsStatus = _.sortBy(taskByUsStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n taksWithoutMoved = _.filter(taskByUsStatus, (function(_this) {\n return function(it) {\n return it.id !== id;\n };\n })(this));\n beforeDestination = _.slice(taksWithoutMoved, 0, index);\n afterDestination = _.slice(taksWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n if (!previous) {\n this.order[task.id] = 0;\n } else if (previous) {\n this.order[task.id] = this.order[previous.id] + 1;\n }\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[task.id] + key + 1;\n }\n task.status = statusId;\n task.user_story = usId;\n task.taskboard_order = this.order[task.id];\n this.refresh();\n return {\n \"task_id\": task.id,\n \"order\": this.order[task.id],\n \"set_orders\": setOrders\n };\n };\n\n TaskboardTasksService.prototype.refresh = function() {\n var i, j, k, len, len1, len2, model, ref, status, task, taskModel, taskStatusList, tasks, us, usTasks;\n this.tasksRaw = _.sortBy(this.tasksRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n tasks = this.tasksRaw;\n taskStatusList = _.sortBy(this.project.task_statuses, \"order\");\n usTasks = {};\n ref = _.union(this.userstories, [\n {\n id: null\n }\n ]);\n for (i = 0, len = ref.length; i < len; i++) {\n us = ref[i];\n usTasks[us.id] = {};\n for (j = 0, len1 = taskStatusList.length; j < len1; j++) {\n status = taskStatusList[j];\n usTasks[us.id][status.id] = [];\n }\n }\n for (k = 0, len2 = tasks.length; k < len2; k++) {\n taskModel = tasks[k];\n if ((usTasks[taskModel.user_story] != null) && (usTasks[taskModel.user_story][taskModel.status] != null)) {\n task = {};\n model = taskModel.getAttrs();\n task.foldStatusChanged = this.foldStatusChanged[taskModel.id];\n task.model = model;\n task.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n task.id = taskModel.id;\n task.assigned_to = this.usersById[taskModel.assigned_to];\n task.colorized_tags = _.map(task.model.tags, (function(_this) {\n return function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n };\n })(this));\n usTasks[taskModel.user_story][taskModel.status].push(task);\n }\n }\n return this.usTasks = Immutable.fromJS(usTasks);\n };\n\n return TaskboardTasksService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgTaskboardTasks\", TaskboardTasksService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: kanban-userstories.service.coffee\n */\n\n(function() {\n var KanbanUserstoriesService, 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 KanbanUserstoriesService = (function(superClass) {\n extend(KanbanUserstoriesService, superClass);\n\n KanbanUserstoriesService.$inject = [];\n\n function KanbanUserstoriesService() {\n this.reset();\n }\n\n KanbanUserstoriesService.prototype.reset = function() {\n this.userstoriesRaw = [];\n this.archivedStatus = [];\n this.statusHide = [];\n this.foldStatusChanged = {};\n return this.usByStatus = Immutable.Map();\n };\n\n KanbanUserstoriesService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n KanbanUserstoriesService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.toggleFold = function(usId) {\n this.foldStatusChanged[usId] = !this.foldStatusChanged[usId];\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.set = function(userstories) {\n this.userstoriesRaw = userstories;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.add = function(us) {\n this.userstoriesRaw = this.userstoriesRaw.concat(us);\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.addArchivedStatus = function(statusId) {\n return this.archivedStatus.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.isUsInArchivedHiddenStatus = function(usId) {\n var us;\n us = this.getUsModel(usId);\n return this.archivedStatus.indexOf(us.status) !== -1 && this.statusHide.indexOf(us.status) !== -1;\n };\n\n KanbanUserstoriesService.prototype.hideStatus = function(statusId) {\n this.deleteStatus(statusId);\n return this.statusHide.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.showStatus = function(statusId) {\n return _.remove(this.statusHide, function(it) {\n return it === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.getStatus = function(statusId) {\n return _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.deleteStatus = function(statusId) {\n var toDelete;\n toDelete = _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n toDelete = _.map(function(it) {\n return it.id;\n });\n this.archived = _.difference(this.archived, toDelete);\n this.userstoriesRaw = _.filter(this.userstoriesRaw, function(us) {\n return us.status !== statusId;\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.refreshRawOrder = function() {\n var i, it, len, ref, results;\n this.order = {};\n ref = this.userstoriesRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n it = ref[i];\n results.push(this.order[it.id] = it.kanban_order);\n }\n return results;\n };\n\n KanbanUserstoriesService.prototype.assignOrders = function(order) {\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.move = function(usList, statusId, index) {\n var afterDestination, beforeDestination, i, initialLength, it, j, k, key, len, len1, len2, modifiedUs, previous, previousWithTheSameOrder, setNextOrders, setOrders, setPreviousOrders, startIndex, us, usByStatus, usByStatusWithoutMoved;\n initialLength = usList.length;\n usByStatus = _.filter(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return it.status === statusId;\n };\n })(this));\n usByStatus = _.sortBy(usByStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n usByStatusWithoutMoved = _.filter(usByStatus, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(usByStatusWithoutMoved, 0, index);\n afterDestination = _.slice(usByStatusWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n modifiedUs = [];\n setPreviousOrders = [];\n setNextOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = this.order[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return it.kanban_order === _this.order[previous.id];\n };\n })(this));\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[previous.id] + key + initialLength + 1;\n it.kanban_order = this.order[it.id];\n }\n setNextOrders = _.map(afterDestination, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n }\n }\n for (key = k = 0, len2 = usList.length; k < len2; key = ++k) {\n us = usList[key];\n us.status = statusId;\n us.kanban_order = startIndex + key;\n this.order[us.id] = us.kanban_order;\n modifiedUs.push({\n us_id: us.id,\n order: us.kanban_order\n });\n }\n this.refresh();\n return {\n bulkOrders: modifiedUs.concat(setPreviousOrders, setNextOrders),\n usList: modifiedUs,\n set_orders: setOrders\n };\n };\n\n KanbanUserstoriesService.prototype.moveToEnd = function(id, statusId) {\n var us;\n us = this.getUsModel(id);\n this.order[us.id] = -1;\n us.status = statusId;\n us.kanban_order = this.order[us.id];\n this.refresh();\n return {\n \"us_id\": us.id,\n \"order\": -1\n };\n };\n\n KanbanUserstoriesService.prototype.replace = function(us) {\n return this.usByStatus = this.usByStatus.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, us);\n }\n return status;\n });\n };\n\n KanbanUserstoriesService.prototype.replaceModel = function(us) {\n this.userstoriesRaw = _.map(this.userstoriesRaw, function(usItem) {\n if (us.id === usItem.id) {\n return us;\n } else {\n return usItem;\n }\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.getUs = function(id) {\n var findedUs;\n findedUs = null;\n this.usByStatus.forEach(function(status) {\n findedUs = status.find(function(us) {\n return us.get('id') === id;\n });\n if (findedUs) {\n return false;\n }\n });\n return findedUs;\n };\n\n KanbanUserstoriesService.prototype.getUsModel = function(id) {\n return _.find(this.userstoriesRaw, function(us) {\n return us.id === id;\n });\n };\n\n KanbanUserstoriesService.prototype.refresh = function() {\n var usByStatus, userstories;\n this.userstoriesRaw = _.sortBy(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n userstories = this.userstoriesRaw;\n userstories = _.map(userstories, (function(_this) {\n return function(usModel) {\n var model, us;\n us = {};\n model = usModel.getAttrs();\n us.foldStatusChanged = _this.foldStatusChanged[usModel.id];\n us.model = model;\n us.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n us.id = usModel.id;\n us.assigned_to = _this.usersById[usModel.assigned_to];\n us.colorized_tags = _.map(us.model.tags, function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n });\n return us;\n };\n })(this));\n usByStatus = _.groupBy(userstories, function(us) {\n return us.model.status;\n });\n return this.usByStatus = Immutable.fromJS(usByStatus);\n };\n\n return KanbanUserstoriesService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgKanbanUserstories\", KanbanUserstoriesService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, KanbanWipLimitDirective, 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 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 KanbanController = (function(superClass) {\n extend(KanbanController, superClass);\n\n KanbanController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"$tgModel\", \"tgKanbanUserstories\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n KanbanController.prototype.storeCustomFiltersName = 'kanban-custom-filters';\n\n KanbanController.prototype.storeFiltersName = 'kanban-filters';\n\n function KanbanController(scope, rootscope, repo, confirm, rs1, rs2, params1, q, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, model, kanbanUserstoriesService1, storage, filterRemoteStorageService, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\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.errorHandlingService = errorHandlingService;\n this.model = model;\n this.kanbanUserstoriesService = kanbanUserstoriesService1;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService1;\n bindMethods(this);\n this.kanbanUserstoriesService.reset();\n this.openFilter = false;\n this.selectedUss = {};\n if (this.applyStoredFilters(this.params.pslug, \"kanban-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"KANBAN.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usByStatus\", (function(_this) {\n return function() {\n return _this.kanbanUserstoriesService.usByStatus;\n };\n })(this));\n }\n\n KanbanController.prototype.cleanSelectedUss = function() {\n var key, results;\n results = [];\n for (key in this.selectedUss) {\n results.push(this.selectedUss[key] = false);\n }\n return results;\n };\n\n KanbanController.prototype.toggleSelectedUs = function(usId) {\n return this.selectedUss[usId] = !this.selectedUss[usId];\n };\n\n KanbanController.prototype.firstLoad = function() {\n var promise;\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 return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n KanbanController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n return this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n return this.loadUserstories().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n }\n };\n\n KanbanController.prototype.filtersReloadContent = function() {\n return this.loadUserstories().then((function(_this) {\n return function() {\n var i, len, openArchived, results, statusId;\n openArchived = _.difference(_this.kanbanUserstoriesService.archivedStatus, _this.kanbanUserstoriesService.statusHide);\n if (openArchived.length) {\n results = [];\n for (i = 0, len = openArchived.length; i < len; i++) {\n statusId = openArchived[i];\n results.push(_this.loadUserStoriesForStatus({}, statusId));\n }\n return results;\n }\n };\n })(this));\n };\n\n KanbanController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function(event, us) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(us);\n });\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(event, uss) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(uss);\n });\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(event, us) {\n return _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.replaceModel(us);\n });\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.editUs = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUs(id);\n us = us.set('loading', true);\n this.kanbanUserstoriesService.replace(us);\n return this.rs.userstories.getByRef(us.getIn(['model', 'project']), us.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingUserStory) {\n return _this.rs2.attachments.list(\"us\", us.get('id'), us.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", editingUserStory, attachments.toJS());\n us = us.set('loading', false);\n return _this.kanbanUserstoriesService.replace(us);\n });\n };\n })(this));\n };\n\n KanbanController.prototype.showPlaceHolder = function(statusId) {\n if (this.scope.usStatusList[0].id === statusId && !this.kanbanUserstoriesService.userstoriesRaw.length) {\n return true;\n }\n return false;\n };\n\n KanbanController.prototype.toggleFold = function(id) {\n return this.kanbanUserstoriesService.toggleFold(id);\n };\n\n KanbanController.prototype.isUsInArchivedHiddenStatus = function(usId) {\n return this.kanbanUserstoriesService.isUsInArchivedHiddenStatus(usId);\n };\n\n KanbanController.prototype.changeUsAssignedTo = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUsModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", us);\n };\n\n KanbanController.prototype.onAssignedToChanged = function(ctx, userid, usModel) {\n usModel.assigned_to = userid;\n this.kanbanUserstoriesService.replaceModel(usModel);\n return this.repo.save(usModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.filtersReloadContent();\n }\n };\n })(this));\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._attrs;\n };\n })(this));\n };\n\n KanbanController.prototype.loadUserstories = function() {\n var params, promise;\n params = {\n status__is_archived: false\n };\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n params.include_tasks = 1;\n }\n params = _.merge(params, this.location.search());\n promise = this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.kanbanUserstoriesService.init(_this.scope.project, _this.scope.usersById);\n _this.kanbanUserstoriesService.set(userstories);\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 filteredStatus, params;\n filteredStatus = this.location.search().status;\n if (filteredStatus) {\n filteredStatus = filteredStatus.split(\",\").map(function(it) {\n return parseInt(it, 10);\n });\n if (filteredStatus.indexOf(statusId) === -1) {\n return;\n }\n }\n params = {\n status: statusId,\n include_attachments: true,\n include_tasks: true\n };\n params = _.merge(params, this.location.search());\n return this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\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 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 var project;\n project = this.projectService.project.toJS();\n if (!project.is_kanban_activated) {\n this.errorHandlingService.permissionDenied();\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.scope.$emit(\"project:loaded\", project);\n return project;\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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.loadKanban();\n return this.generateFilters();\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.moveUs = function(ctx, usList, newStatusId, index) {\n var data, promise;\n this.cleanSelectedUss();\n usList = _.map(usList, (function(_this) {\n return function(us) {\n return _this.kanbanUserstoriesService.getUsModel(us.id);\n };\n })(this));\n data = this.kanbanUserstoriesService.move(usList, newStatusId, index);\n promise = this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId, newStatusId, data.bulkOrders);\n return promise.then((function(_this) {\n return function() {\n var options, params, promises;\n options = {\n headers: {\n \"set-orders\": JSON.stringify(data.setOrders)\n }\n };\n params = {\n include_attachments: true,\n include_tasks: true\n };\n promises = _.map(usList, function(us) {\n return _this.repo.save(us, true, params, options, true);\n });\n promise = _this.q.all(promises);\n return promise.then(function(result) {\n var headers, order;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.kanbanUserstoriesService.assignOrders(order);\n }\n _this.scope.$broadcast(\"redraw:wip\");\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n _this.filtersReloadContent();\n }\n return promise;\n });\n };\n })(this));\n };\n\n return KanbanController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin, taiga.UsFiltersMixin));\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, kanbanUserstoriesService) {\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 kanbanUserstoriesService.addArchivedStatus(status.id);\n kanbanUserstoriesService.hideStatus(status.id);\n $scope[\"class\"] = \"icon-watch\";\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-watch\";\n $scope.title = showArchivedText;\n $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id);\n return kanbanUserstoriesService.hideStatus(status.id);\n } else {\n $scope[\"class\"] = \"icon-unwatch\";\n $scope.title = hideArchivedText;\n $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id);\n return kanbanUserstoriesService.showStatus(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\", \"tgKanbanUserstories\", KanbanArchivedStatusHeaderDirective]);\n\n KanbanArchivedStatusIntroDirective = function($translate, kanbanUserstoriesService) {\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(hasArchived) {\n if (hasArchived) {\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 hasArchived;\n hasArchived = !!kanbanUserstoriesService.getStatus(newStatusId).length;\n return updateIntroText(hasArchived);\n });\n $scope.$on(\"kanban:shown-userstories-for-status\", function(ctx, statusId, userStoriesLoaded) {\n var hasArchived;\n if (statusId === status.id) {\n kanbanUserstoriesService.deleteStatus(statusId);\n kanbanUserstoriesService.add(userStoriesLoaded);\n hasArchived = !!kanbanUserstoriesService.getStatus(statusId).length;\n return updateIntroText(hasArchived);\n }\n });\n $scope.$on(\"kanban:hidden-userstories-for-status\", function(ctx, statusId) {\n if (statusId === status.id) {\n return updateIntroText(false);\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\", \"tgKanbanUserstories\", KanbanArchivedStatusIntroDirective]);\n\n KanbanSquishColumnDirective = function(rs, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch, updateTableWidth;\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 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 return unwatch = $scope.$watch('usByStatus', function(usByStatus) {\n if (usByStatus.size) {\n $scope.folds = rs.kanban.getStatusColumnModes(projectService.project.get('id'));\n updateTableWidth();\n return unwatch();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", \"tgProjectService\", KanbanSquishColumnDirective]);\n\n KanbanWipLimitDirective = function($timeout) {\n var link;\n link = function($scope, $el, $attrs) {\n var redrawWipLimit, status;\n status = $scope.$eval($attrs.tgKanbanWipLimit);\n redrawWipLimit = (function(_this) {\n return function() {\n $el.find(\".kanban-wip-limit\").remove();\n return $timeout(function() {\n var element;\n element = $el.find(\"tg-card\")[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\", [\"$timeout\", KanbanWipLimitDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 var unwatch;\n return unwatch = $scope.$watch(\"usByStatus\", function(usByStatus) {\n var containers, deleteElement, drake, itemEl, newParentScope, scroll, tdom;\n if (!usByStatus || !usByStatus.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\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 containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n return window.dragMultiple.start(item, containers);\n });\n drake.on('cloned', function(item, dropTarget) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, finalUsList, firstElement, index, newStatus, newStatusId, parentEl, usList;\n parentEl = $(item).parent();\n newParentScope = parentEl.scope();\n newStatusId = newParentScope.s.id;\n dragMultipleItems = window.dragMultiple.stop();\n if (!dragMultipleItems.length) {\n dragMultipleItems = [item];\n }\n firstElement = dragMultipleItems[0];\n index = $(firstElement).index();\n newStatus = newParentScope.s.id;\n usList = _.map(dragMultipleItems, function(item) {\n return $(item).scope().us;\n });\n finalUsList = _.map(usList, function(item) {\n return {\n id: item.get('id'),\n oldStatusId: item.getIn(['model', 'status'])\n };\n });\n return $scope.$apply(function() {\n _.each(usList, (function(_this) {\n return function(item, key) {\n var oldStatus, sameContainer;\n oldStatus = item.getIn(['model', 'status']);\n sameContainer = newStatus === oldStatus;\n if (!sameContainer) {\n itemEl = $(dragMultipleItems[key]);\n return deleteElement(itemEl);\n }\n };\n })(this));\n return $rootscope.$broadcast(\"kanban:us:move\", finalUsList, newStatus, index);\n });\n });\n scroll = autoScroll(containers, {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/epics/detail.coffee\n */\n\n(function() {\n var EpicDetailController, EpicStatusButtonDirective, EpicStatusDisplayDirective, 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(\"taigaEpics\");\n\n EpicDetailController = (function(superClass) {\n extend(EpicDetailController, superClass);\n\n EpicDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function EpicDetailController(scope, rootscope, repo, confirm, rs, rs2, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\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.rs2 = rs2;\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.epicRef = this.params.epicref;\n this.scope.sectionName = this.translate.instant(\"EPIC.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 EpicDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"EPIC.PAGE_TITLE\", {\n epicRef: \"#\" + this.scope.epic.ref,\n epicSubject: this.scope.epic.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"EPIC.PAGE_DESCRIPTION\", {\n epicStatus: ((ref = this.scope.statusById[this.scope.epic.status]) != null ? ref.name : void 0) || \"--\",\n epicDescription: angular.element(this.scope.epic.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n EpicDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on epic\", 1);\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadEpic();\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 EpicDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-epics\", ctx);\n };\n\n EpicDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.immutableProject = this.projectService.project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.epic_statuses;\n this.scope.statusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n EpicDetailController.prototype.loadEpic = function() {\n return this.rs.epics.getByRef(this.scope.projectId, this.params.epicref).then((function(_this) {\n return function(epic) {\n var ctx, ref, ref1;\n _this.scope.epic = epic;\n _this.scope.immutableEpic = Immutable.fromJS(epic._attrs);\n _this.scope.epicId = epic.id;\n _this.scope.commentModel = epic;\n _this.modelTransform.setObject(_this.scope, 'epic');\n if (((ref = _this.scope.epic.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n if (((ref1 = _this.scope.epic.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadUserstories = function() {\n return this.rs2.userstories.listInEpic(this.scope.epicId).then((function(_this) {\n return function(data) {\n return _this.scope.userstories = data;\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadEpic().then((function(_this) {\n return function() {\n return _this.loadUserstories();\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 EpicDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.upvote(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.downvote(this.scope.epicId).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 EpicDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.watch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\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.epics.unwatch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onSelectColor = function(color) {\n var onSelectColorError, onSelectColorSuccess, transform;\n onSelectColorSuccess = (function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.confirm.notify('success');\n };\n })(this);\n onSelectColorError = (function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this);\n transform = this.modelTransform.save(function(epic) {\n epic.color = color;\n return epic;\n });\n return transform.then(onSelectColorSuccess, onSelectColorError);\n };\n\n return EpicDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"EpicDetailController\", EpicDetailController);\n\n EpicStatusDisplayDirective = 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(epic) {\n var html, status;\n status = $scope.statusById[epic.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(epic) {\n if (epic != null) {\n return render(epic);\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(\"tgEpicStatusDisplay\", [\"$tgTemplate\", \"$compile\", EpicStatusDisplayDirective]);\n\n EpicStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/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_epic\") !== -1;\n };\n render = (function(_this) {\n return function(epic) {\n var html, status;\n status = $scope.statusById[epic.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 = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(epic) {\n epic.status = status;\n return epic;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var epic;\n epic = $model.$modelValue;\n if (epic) {\n return render(epic);\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(\"tgEpicStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", EpicStatusButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function IssueDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\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\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 _this.modelTransform.setObject(_this.scope, '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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadIssue();\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, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/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 = function(statusId) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(issue) {\n issue.status = statusId;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective]);\n\n IssueTypeButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $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 = function(type) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.type = type;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.type : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective]);\n\n IssueSeverityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $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 = function(severity) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.severity = severity;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.severity : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective]);\n\n IssuePriorityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $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 = function(priority) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.priority = priority;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.priority : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective]);\n\n PromoteIssueToUsButtonDirective = function($rootScope, $repo, $confirm, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = (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\", \"$translate\", PromoteIssueToUsButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, 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 bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\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 form.reset();\n resetAttachments();\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createIssueOpen = false;\n });\n $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 return $scope.createIssueOpen = true;\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 attachmentsToAdd = Immutable.List();\n return $scope.attachments = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.issue.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.issue.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.issue.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.issue.tags = itemtags;\n return _.pull($scope.issue.tags, value);\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 form, submit, submitButton;\n form = null;\n $scope.$on(\"issueform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\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, 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, bindMethods, 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 bindMethods = this.taiga.bindMethods;\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\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\", \"tgUserActivityService\"];\n\n IssuesController.prototype.filtersHashSuffix = \"issues-filters\";\n\n IssuesController.prototype.myFiltersHashSuffix = \"issues-my-filters\";\n\n function IssuesController(scope, rootscope, repo, confirm, rs, urls, params1, q1, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, storage, filterRemoteStorageService, projectService) {\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.urls = urls;\n this.params = params1;\n this.q = q1;\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.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n this.loadIssues = bind(this.loadIssues, this);\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"PROJECT.SECTION.ISSUES\");\n this.voting = false;\n if (this.applyStoredFilters(this.params.pslug, this.filtersHashSuffix)) {\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.changeQ = function(q) {\n this.unselectFilter(\"page\");\n this.replaceFilter(\"q\", q);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeFilter = function(filter) {\n this.unselectFilter(\"page\");\n this.unselectFilter(filter.dataType, filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.addFilter = function(newFilter) {\n this.unselectFilter(\"page\");\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.selectCustomFilter = function(customFilter) {\n var orderBy;\n orderBy = this.location.search().order_by;\n if (orderBy) {\n customFilter.filter.order_by = orderBy;\n }\n this.unselectFilter(\"page\");\n this.replaceAllFilters(customFilter.filter);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, j, len, ref;\n ref = this.selectedFilters;\n for (j = 0, len = ref.length; j < len; j++) {\n filter = ref[j];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n IssuesController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.type = urlfilters.type;\n filters.severity = urlfilters.severity;\n filters.priority = urlfilters.priority;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.filtersHashSuffix);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.type = urlfilters.type;\n loadFilters.severity = urlfilters.severity;\n loadFilters.priority = urlfilters.priority;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.issues.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, priority, role, selected, severity, statuses, tags, tagsWithAtLeastOneElement, type;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n type = _.map(data.types, function(it) {\n it.id = it.id.toString();\n return it;\n });\n severity = _.map(data.severities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n priority = _.map(data.priorities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.type) {\n selected = _this.formatSelectedFilters(\"type\", type, loadFilters.type);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.severity) {\n selected = _this.formatSelectedFilters(\"severity\", severity, loadFilters.severity);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.priority) {\n selected = _this.formatSelectedFilters(\"priority\", priority, loadFilters.priority);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TYPE\"),\n dataType: \"type\",\n content: type\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.SEVERITY\"),\n dataType: \"severity\",\n content: severity\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.PRIORITIES\"),\n dataType: \"priority\",\n content: priority\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\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.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_issues_activated) {\n this.errorHandlingService.permissionDenied();\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\n IssuesController.prototype.loadIssuesRequests = 0;\n\n IssuesController.prototype.loadIssues = function() {\n var params, promise;\n params = this.location.search();\n promise = this.rs.issues.list(this.scope.projectId, params);\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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.generateFilters();\n return this.loadIssues();\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 IssuesController.prototype.upVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.upvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.downVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.downvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.getOrderBy = function() {\n if (_.isString(this.location.search().order_by)) {\n return this.location.search().order_by;\n } else {\n return \"created_date\";\n }\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, svg;\n currentOrder = $ctrl.getOrderBy();\n if (currentOrder) {\n icon = startswith(currentOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n colHeadElement = $el.find(\".row.title > div[data-fieldname='\" + (trim(currentOrder, \"-\")) + \"']\");\n svg = $(\"\").attr(\"svg-icon\", icon);\n colHeadElement.append(svg);\n $compile(colHeadElement.contents())($scope);\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.getOrderBy();\n newOrder = target.data(\"fieldname\");\n if (newOrder === 'total_voters' && currentOrder !== \"-total_voters\") {\n currentOrder = \"total_voters\";\n }\n finalOrder = currentOrder === newOrder ? \"-\" + newOrder : newOrder;\n return $scope.$apply(function() {\n $ctrl.replaceFilter(\"order_by\", finalOrder);\n $ctrl.storeFilters($ctrl.params.pslug, $location.search(), $ctrl.filtersHashSuffix);\n return $ctrl.loadIssues().then(function() {\n $el.find(\".row.title > div > tg-svg\").remove();\n icon = startswith(finalOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n svg = $(\"\").attr(\"svg-icon\", icon);\n target.append(svg);\n return $compile(target.contents())($scope);\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 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 target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\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 return $repo.save(issue).then(function() {\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('status')) {\n return $ctrl.loadIssues();\n }\n });\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, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
    <%- name %>
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, issue, updateIssue;\n updateIssue = function(issue) {\n var avatar, 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 avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = null;\n if (member) {\n ctx.name = member.full_name_display;\n ctx.bg = avatar.bg;\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(ctx, userId, updatedIssue) {\n if (updatedIssue.id === issue.id) {\n updatedIssue.assigned_to = userId;\n return $repo.save(issue).then(function() {\n updateIssue(updatedIssue);\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('assigned_to') || $ctrl.isFilterDataTypeSelected('role')) {\n return $ctrl.loadIssues();\n }\n });\n }\n });\n $scope.$watch($attrs.tgIssueAssignedToInlineEdition, function(val) {\n return updateIssue(val);\n });\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\", \"tgAvatarService\", IssueAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgConfig\", \"tgProjectService\", \"tgWysiwygService\"];\n\n function UserStoryDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, configService, projectService, wysiwigService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.configService = configService;\n this.projectService = projectService;\n this.wysiwigService = wysiwigService;\n bindMethods(this);\n this.scope.usRef = this.params.usref;\n this.scope.sectionName = this.translate.instant(\"US.SECTION_NAME\");\n this.scope.tribeEnabled = this.configService.config.tribeHost;\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.wysiwigService.getHTML(this.scope.us.description) || \"\").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 var project;\n project = this.projectService.project.toJS();\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\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 _this.scope.us = us;\n _this.scope.usId = us.id;\n _this.scope.commentModel = us;\n _this.modelTransform.setObject(_this.scope, 'us');\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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadUs().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadTasks()]);\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 UserStoryDetailController.prototype.onTribeInfo = function() {\n var image, publishDesc, publishTitle, text;\n publishTitle = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\");\n image = $('').attr({\n 'src': \"/\" + window._version + \"/images/monster-fight.png\",\n 'alt': this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\")\n });\n text = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TEXT\");\n publishDesc = $('
    ').append(image).append(text);\n return this.confirm.success(publishTitle, publishDesc);\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, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/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 $el.html(html);\n return $compile($el.contents())($scope);\n };\n })(this);\n save = (function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, transform;\n $el.find(\".pop-status\").popover().close();\n currentLoading = $loading().target($el.find('.js-edit-status')).start();\n transform = $modelTransform.save(function(us) {\n us.status = status;\n return us;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsStatusButtonDirective]);\n\n UsTeamRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $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 = function(team_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.team_requirement = team_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.team_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective]);\n\n UsClientRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $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 = function(client_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.client_requirement = client_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.client_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsClientRequirementButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function TaskDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, projectService) {\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 this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\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\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 _this.modelTransform.setObject(_this.scope, '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 project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadTask().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadUserStory()]);\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, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/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 = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(task) {\n task.status = status;\n return task;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective]);\n\n TaskIsIocaineButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $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 = function(is_iocaine) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find('label')).start();\n transform = $modelTransform.save(function(task) {\n task.is_iocaine = is_iocaine;\n return task;\n });\n transform.then(function() {\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\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(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.is_iocaine : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\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\", \"$tgQueueModelTransformation\", \"$compile\", \"$tgTemplate\", TaskIsIocaineButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\"];\n\n function TeamController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, auth, translate, projectService, errorHandlingService) {\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.errorHandlingService = errorHandlingService;\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 var project;\n project = this.projectService.project.toJS();\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 this.scope.owner = project.owner.id;\n return project;\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 key, max, min, singleStat, value;\n max = _.max(_.toArray(stat));\n min = _.min(_.toArray(stat));\n singleStat = Object();\n for (key in stat) {\n if (!hasProp.call(stat, key)) continue;\n value = stat[key];\n if (value === min) {\n singleStat[key] = 0.1;\n } else if (value === max) {\n singleStat[key] = 1;\n } else {\n singleStat[key] = (value * 0.5) / max;\n }\n }\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 project, userRoles;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.loadMembers();\n userRoles = _.map(this.scope.users, function(user) {\n return user.role;\n });\n this.scope.roles = _.filter(this.scope.roles, function(role) {\n return userRoles.indexOf(role.id) !== -1;\n });\n return this.loadMemberStats();\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 project: \"=project\",\n currentUser: \"=currentuser\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\",\n owner: \"=owner\"\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 owner: \"=owner\"\n }\n };\n };\n\n module.directive(\"tgTeamMembers\", TeamMembersDirective);\n\n LeaveProjectDirective = function($repo, $confirm, $location, $rs, $navurls, $translate, lightboxFactory, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var leaveConfirm;\n leaveConfirm = 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($scope.project.id);\n promise.then(function() {\n return currentUserService.loadProjects().then(function() {\n response.finish();\n $confirm.notify(\"success\");\n return $location.path($navurls.resolve(\"home\"));\n });\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 return $scope.leave = function() {\n if ($scope.project.owner.id === $scope.user.id) {\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: true,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\n }\n };\n };\n return {\n scope: {\n user: \"=\",\n project: \"=\"\n },\n templateUrl: \"team/leave-project.html\",\n link: link\n };\n };\n\n module.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\", \"tgLightboxFactory\", \"tgCurrentUserService\", 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 WikiDetailController, WikiSummaryDirective, WikiWysiwyg, bindOnce, debounce, groupBy, 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\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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiDetailController(scope, rootscope, repo, model, confirm, rs, params, q, location, filter, log, appMetaService, navUrls, analytics, translate, errorHandlingService, projectService) {\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.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.moveLink = bind(this.moveLink, this);\n this.loadWiki = bind(this.loadWiki, this);\n this.scope.$on(\"wiki:links:move\", this.moveLink);\n this.scope.$on(\"wikipage:add\", this.loadWiki);\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\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.wikiSlug,\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 var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\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 i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWiki()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiDetailController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_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.wikiSlug;\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 _this.confirm.notify(\"success\");\n return _this.loadWiki();\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 WikiDetailController.prototype.moveLink = function(ctx, item, itemIndex) {\n var r, values;\n values = this.scope.wikiLinks;\n r = values.indexOf(item);\n values.splice(r, 1);\n values.splice(itemIndex, 0, item);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\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, avatarService) {\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 avatar, 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 avatar = avatarService.getAvatar(user);\n if (user === void 0) {\n user = {\n name: \"unknown\",\n avatar: avatar\n };\n } else {\n user = {\n name: user.full_name_display,\n avatar: avatar\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\", \"tgAvatarService\", WikiSummaryDirective]);\n\n WikiWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $qqueue, $repo, $analytics, wikiHistoryService) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = $qqueue.bindAdd(function(description, cb) {\n var onError, onSuccess, promise;\n onSuccess = function(wikiPage) {\n if ($scope.item.id == null) {\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1);\n $scope.$emit(\"wikipage:add\");\n }\n wikiHistoryService.loadHistoryEntries();\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n $scope.item.content = description;\n if ($scope.item.id != null) {\n promise = $repo.save($scope.item).then(onSuccess, onError);\n } else {\n promise = $repo.create(\"wiki\", $scope.item).then(onSuccess, onError);\n }\n return promise[\"finally\"](cb);\n });\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, 'wiki_page', file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-wiki\";\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf(\"modify_wiki_page\") !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n\\n
    \\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n
    \\n
    \"\n };\n };\n\n module.directive(\"tgWikiWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$tgQqueue\", \"$tgRepo\", \"$tgAnalytics\", \"tgWikiHistoryService\", WikiWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $analytics, $loading, $template, $compile, $translate) {\n var link, linkWikiLinks, template;\n template = $template.get(\"wiki/wiki-nav.html\", true);\n linkWikiLinks = function($scope, $el, $attrs) {\n var $ctrl, addWikiLinkPermission, drake, render;\n $ctrl = $el.controller();\n if ($attrs.ngModel == null) {\n return $log.error(\"WikiNavDirective: no ng-model attr is defined\");\n }\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n drake = null;\n render = function(wikiLinks) {\n var deleteWikiLinkPermission, html, itemEl, scroll, tdom;\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 if (addWikiLinkPermission && drake) {\n drake.destroy();\n }\n $el.html(html);\n if (addWikiLinkPermission) {\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('li');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex;\n itemEl = $(item);\n item = itemEl.scope().link;\n itemIndex = itemEl.index();\n return $scope.$emit(\"wiki:links:move\", item, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\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\", \".js-delete-link\", 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_LINK_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 link = function($scope, $el, $attrs) {\n linkWikiLinks($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(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/pages-list.coffee\n */\n\n(function() {\n var WikiPagesListController, 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(\"taigaWiki\");\n\n WikiPagesListController = (function(superClass) {\n extend(WikiPagesListController, superClass);\n\n WikiPagesListController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgNavUrls\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiPagesListController(scope, rootscope, repo, model, confirm, rs, params, q, navUrls, errorHandlingService, projectService) {\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.navUrls = navUrls;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiPagesListController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WikiPagesListController.prototype.loadWikiPages = function() {\n var promise;\n return promise = this.rs.wiki.list(this.scope.projectId).then((function(_this) {\n return function(wikipages) {\n return _this.scope.wikipages = wikipages;\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWikiPages()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiPagesListController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_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 return WikiPagesListController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiPagesListController\", WikiPagesListController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 ChangeOwnerLightboxController, ChangeOwnerLightboxDirective, LbRequestOwnershipDirective, LightboxAddMembersWarningMessageDirective, TransferProjectStartSuccessDirective, debounce, module, taiga;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaKanban\");\n\n LightboxAddMembersWarningMessageDirective = function() {\n return {\n templateUrl: \"admin/memberships-warning-message.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgLightboxAddMembersWarningMessage\", [LightboxAddMembersWarningMessageDirective]);\n\n LbRequestOwnershipDirective = function(lightboxService, rs, confirmService, $translate) {\n return {\n link: function(scope, el) {\n lightboxService.open(el);\n return scope.request = function() {\n scope.loading = true;\n return rs.projects.transferRequest(scope.projectId).then(function() {\n scope.loading = false;\n lightboxService.close(el);\n return confirmService.notify(\"success\", $translate.instant(\"ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP_SUCCESS\"));\n });\n };\n },\n templateUrl: \"common/lightbox/lightbox-request-ownership.html\"\n };\n };\n\n module.directive('tgLbRequestOwnership', [\"lightboxService\", \"tgResources\", \"$tgConfirm\", \"$translate\", LbRequestOwnershipDirective]);\n\n ChangeOwnerLightboxController = (function() {\n function ChangeOwnerLightboxController(rs1, lightboxService1, confirm, translate) {\n this.rs = rs1;\n this.lightboxService = lightboxService1;\n this.confirm = confirm;\n this.translate = translate;\n this.users = [];\n this.q = \"\";\n this.commentOpen = false;\n }\n\n ChangeOwnerLightboxController.prototype.limit = 3;\n\n ChangeOwnerLightboxController.prototype.normalizeString = function(normalizedString) {\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\n ChangeOwnerLightboxController.prototype.filterUsers = function(user) {\n var text, username;\n username = user.full_name_display.toUpperCase();\n username = this.normalizeString(username);\n text = this.q.toUpperCase();\n text = this.normalizeString(text);\n return _.includes(username, text);\n };\n\n ChangeOwnerLightboxController.prototype.getUsers = function() {\n var users;\n if (!this.users.length && !this.q.length) {\n users = this.activeUsers;\n } else {\n users = this.users;\n }\n users = users.slice(0, this.limit);\n users = _.reject(users, {\n \"selected\": true\n });\n return _.reject(users, {\n \"id\": this.currentOwnerId\n });\n };\n\n ChangeOwnerLightboxController.prototype.userSearch = function() {\n this.users = this.activeUsers;\n this.selected = _.find(this.users, {\n \"selected\": true\n });\n if (this.q) {\n return this.users = _.filter(this.users, this.filterUsers.bind(this));\n }\n };\n\n ChangeOwnerLightboxController.prototype.selectUser = function(user) {\n this.activeUsers = _.map(this.activeUsers, function(user) {\n user.selected = false;\n return user;\n });\n user.selected = true;\n return this.userSearch();\n };\n\n ChangeOwnerLightboxController.prototype.submit = function() {\n this.loading = true;\n return this.rs.projects.transferStart(this.projectId, this.selected.id, this.comment).then((function(_this) {\n return function() {\n var desc, title;\n _this.loading = false;\n _this.lightboxService.closeAll();\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_TITLE\");\n desc = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_DESC\");\n return _this.confirm.success(title, desc, {\n type: \"svg\",\n name: \"icon-speak-up\"\n });\n };\n })(this));\n };\n\n return ChangeOwnerLightboxController;\n\n })();\n\n ChangeOwnerLightboxController.$inject = [\"tgResources\", \"lightboxService\", \"$tgConfirm\", \"$translate\"];\n\n module.controller('ChangeOwnerLightbox', ChangeOwnerLightboxController);\n\n ChangeOwnerLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n scope: true,\n controller: \"ChangeOwnerLightbox\",\n controllerAs: \"vm\",\n bindToController: {\n currentOwnerId: \"=\",\n projectId: \"=\",\n activeUsers: \"=\"\n },\n templateUrl: \"common/lightbox/lightbox-change-owner.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbChangeOwner\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", ChangeOwnerLightboxDirective]);\n\n TransferProjectStartSuccessDirective = function(lightboxService) {\n var link;\n link = function(scope, el) {\n scope.close = function() {\n return lightboxService.close(el);\n };\n return lightboxService.open(el);\n };\n return {\n templateUrl: \"common/lightbox/lightbox-transfer-project-start-success.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbTransferProjectStartSuccess\", [\"lightboxService\", TransferProjectStartSuccessDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, NoMoreMembershipsExplanationDirective, 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\", \"$tgAuth\", \"tgLightboxFactory\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function MembershipsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, analytics, appMetaService, translate, auth, lightboxFactory1, errorHandlingService, projectService1) {\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 this.auth = auth;\n this.lightboxFactory = lightboxFactory1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\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.loadInitialData();\n return _this.analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1);\n };\n })(this));\n }\n\n MembershipsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.canAddUsers = project.max_memberships === null || project.max_memberships > project.total_memberships;\n this.scope.$emit('project:loaded', project);\n return project;\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 this.loadProject();\n return this.q.all([this.loadMembers(), this.auth.refresh()]);\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.lightboxFactory.create('tg-lb-add-members', {\n \"class\": \"lightbox lightbox-add-member\",\n \"project\": \"project\"\n }, {\n \"project\": this.scope.project\n });\n };\n\n MembershipsController.prototype.showLimitUsersWarningMessage = function() {\n var icon, message, title;\n title = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING\");\n message = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE\", {\n members: this.scope.project.max_memberships\n });\n icon = \"/\" + window._version + \"/svg/icons/team-question.svg\";\n return this.confirm.success(title, message, {\n name: icon,\n type: \"img\"\n });\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, $compile, avatarService) {\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 avatar, ctx, html;\n avatar = avatarService.getAvatar(member);\n ctx = {\n full_name: member.full_name ? member.full_name : \"\",\n email: member.user_email ? member.user_email : member.email,\n imgurl: avatar.url,\n bg: avatar.bg,\n pending: !member.is_user_active ? pending : \"\",\n isOwner: member.is_owner\n };\n html = template(ctx);\n html = $compile(html)($scope);\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', \"$compile\", \"tgAvatarService\", 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 $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n if ($attrs.tgMembershipsRowAdminCheckbox == null) {\n return $log.error(\"MembershipsRowAdminCheckboxDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox);\n if (member.is_owner) {\n $el.find(\".js-check\").remove();\n return;\n }\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 $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_admin);\n return $confirm.notify(\"error\", data.is_admin[0]);\n };\n target = angular.element(event.currentTarget);\n member.is_admin = target.prop(\"checked\");\n return $repo.save(member).then(onSuccess, onError);\n };\n })(this));\n html = render(member);\n if (member.is_admin) {\n return $el.find(\":checkbox\").prop(\"checked\", true);\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, $location, $navUrls, lightboxFactory, projectService) {\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, leaveConfirm, 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 leaveConfirm = function() {\n var defaultMsg, message, title;\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 (member.user !== $scope.user.id) {\n if ($scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy) {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n }\n projectService.fetchProject().then(function() {\n return $ctrl.loadInitialData();\n });\n } else {\n $location.path($navUrls.resolve(\"home\"));\n }\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\", {\n message: message\n });\n return $confirm.notify(\"success\", text, null, 5000);\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\", text);\n };\n })(this);\n return $repo.remove(member).then(onSuccess, onError);\n });\n };\n $el.on(\"click\", \".delete\", function(event) {\n var isCurrentUser;\n event.preventDefault();\n if ($scope.project.owner.id === member.user) {\n isCurrentUser = $scope.user.id === member.user;\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: isCurrentUser,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\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\", \"$tgLocation\", \"$tgNavUrls\", \"tgLightboxFactory\", \"tgProjectService\", MembershipsRowActionsDirective]);\n\n NoMoreMembershipsExplanationDirective = function() {\n return {\n templateUrl: \"admin/no-more-memberships-explanation.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgNoMoreMembershipsExplanation\", [NoMoreMembershipsExplanationDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 AdminProjectChangeOwnerDirective, AdminProjectRequestOwnershipDirective, AdminProjectRestrictionsDirective, CsvEpicDirective, CsvExporterController, CsvExporterEpicsController, CsvExporterIssuesController, CsvExporterTasksController, CsvExporterUserstoriesController, CsvIssueDirective, CsvTaskDirective, CsvUsDirective, ProjectDefaultValuesDirective, ProjectExportDirective, ProjectLogoDirective, ProjectLogoModelDirective, ProjectModulesDirective, ProjectProfileController, ProjectProfileDirective, bindOnce, debounce, groupBy, joinStr, mixOf, module, scopeDefer, 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 scopeDefer = this.taiga.scopeDefer;\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\", \"$tgAuth\", \"tgCurrentUserService\", \"tgErrorHandlingService\", \"tgProjectService\", \"$tgModel\"];\n\n function ProjectProfileController(scope1, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, tgAuth, currentUserService1, errorHandlingService, projectService1, model1) {\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 = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.tgAuth = tgAuth;\n this.currentUserService = currentUserService1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.model = model1;\n this.scope.project = {};\n this.scope.projectTags = [];\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 _this.appMetaService.setAll(title, description);\n return _this.fillUsersAndRoles(_this.scope.project.members, _this.scope.project.roles);\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 var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.epicStatusList = _.sortBy(project.epic_statuses, \"order\");\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n this.scope.pointsList = _.sortBy(project.points, \"order\");\n this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n this.scope.issueTypesList = _.sortBy(project.issue_types, \"order\");\n this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n this.scope.prioritiesList = _.sortBy(project.priorities, \"order\");\n this.scope.severitiesList = _.sortBy(project.severities, \"order\");\n scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$emit('project:loaded', project);\n };\n })(this));\n this.scope.projectTags = _.map(this.scope.project.tags, (function(_this) {\n return function(it) {\n return [it, _this.scope.project.tags_colors[it]];\n };\n })(this));\n return project;\n };\n\n ProjectProfileController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.tgAuth.refresh();\n };\n\n ProjectProfileController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.project);\n };\n\n ProjectProfileController.prototype.addTag = function(name, color) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n tags.push(name);\n this.scope.projectTags.push([name, null]);\n return this.scope.project.tags = tags;\n };\n\n ProjectProfileController.prototype.deleteTag = function(tag) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n _.pull(tags, tag[0]);\n _.remove(this.scope.projectTags, (function(_this) {\n return function(it) {\n return it[0] === tag[0];\n };\n })(this));\n return this.scope.project.tags = tags;\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, $analytics) {\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, privacyChanged, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n privacyChanged = $scope.project.isAttributeModified(\"is_private\");\n promise = $repo.save($scope.project);\n promise.then(function() {\n var newUrl;\n currentLoading.finish();\n if (privacyChanged && $scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-public-to-private\", \"Change project privacy from public to private\", 1);\n } else if (privacyChanged && !$scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-private-to-public\", \"Change project privacy from private to public\", 1);\n }\n $confirm.notify(\"success\");\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n });\n $location.path(newUrl);\n projectService.fetchProject().then((function(_this) {\n return function() {\n return $ctrl.loadInitialData();\n };\n })(this));\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\", \"$tgAnalytics\", 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 form, promise;\n form = $el.find(\"form\").checksley();\n form.initializeFields();\n form.reset();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save($scope.project);\n promise.then(function() {\n $scope.$emit(\"project:loaded\", $scope.project);\n $confirm.notify(\"success\");\n return projectService.fetchProject();\n });\n return promise.then(null, function(data) {\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this);\n $el.on(\"change\", \".module-activation.module-direct-active input\", function(event) {\n event.preventDefault();\n return $scope.$applyAsync(submit);\n });\n $el.on(\"submit\", \"form\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"keydown\", \".videoconference-attributes input\", function(e) {\n return e.which !== 32;\n });\n $scope.$watch(\"project.videoconferences\", function(newVal, oldVal) {\n if ((newVal != null) && (oldVal != null) && newVal !== oldVal) {\n return $scope.project.videoconferences_extra_data = \"\";\n }\n });\n $scope.$watch(\"isVideoconferenceActivated\", function(newValue, oldValue) {\n if (newValue === false) {\n $scope.project.videoconferences = null;\n $scope.project.videoconferences_extra_data = \"\";\n if (oldValue === true) {\n return submit();\n }\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, $analytics) {\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 $analytics.trackEvent(\"exporter\", \"export-project\", \"Exported project\", 1);\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\", \"$tgAnalytics\", ProjectExportDirective]);\n\n CsvExporterController = (function(superClass) {\n extend(CsvExporterController, superClass);\n\n CsvExporterController.$inject = [\"$scope\", \"$rootScope\", \"$tgUrls\", \"$tgConfirm\", \"$tgResources\", \"$translate\"];\n\n function CsvExporterController(scope1, rootscope, urls, confirm, rs, translate) {\n this.scope = scope1;\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 CsvExporterEpicsController = (function(superClass) {\n extend(CsvExporterEpicsController, superClass);\n\n function CsvExporterEpicsController() {\n return CsvExporterEpicsController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterEpicsController.prototype.type = \"epics\";\n\n return CsvExporterEpicsController;\n\n })(CsvExporterController);\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(\"CsvExporterEpicsController\", CsvExporterEpicsController);\n\n module.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController);\n\n module.controller(\"CsvExporterTasksController\", CsvExporterTasksController);\n\n module.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController);\n\n CsvEpicDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_EPIC\";\n };\n return {\n controller: \"CsvExporterEpicsController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvEpic\", [\"$translate\", CsvEpicDirective]);\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 AdminProjectRestrictionsDirective = function() {\n return {\n scope: {\n \"project\": \"=\"\n },\n templateUrl: \"admin/admin-project-restrictions.html\"\n };\n };\n\n module.directive('tgAdminProjectRestrictions', [AdminProjectRestrictionsDirective]);\n\n AdminProjectRequestOwnershipDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.requestOwnership = function() {\n return lightboxFactory.create(\"tg-lb-request-ownership\", {\n \"class\": \"lightbox lightbox-request-ownership\"\n }, {\n projectId: scope.projectId\n });\n };\n },\n scope: {\n \"projectId\": \"=\",\n \"owner\": \"=\"\n },\n templateUrl: \"admin/admin-project-request-ownership.html\"\n };\n };\n\n module.directive('tgAdminProjectRequestOwnership', [\"tgLightboxFactory\", AdminProjectRequestOwnershipDirective]);\n\n AdminProjectChangeOwnerDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.changeOwner = function() {\n return lightboxFactory.create(\"tg-lb-change-owner\", {\n \"class\": \"lightbox lightbox-select-user\",\n \"project-id\": \"projectId\",\n \"active-users\": \"activeUsers\",\n \"current-owner-id\": \"currentOwnerId\"\n }, {\n projectId: scope.projectId,\n activeUsers: scope.activeUsers,\n currentOwnerId: scope.owner.id,\n members: scope.members\n });\n };\n },\n scope: {\n \"activeUsers\": \"=\",\n \"projectId\": \"=\",\n \"owner\": \"=\",\n \"members\": \"=\"\n },\n templateUrl: \"admin/admin-project-change-owner.html\"\n };\n };\n\n module.directive('tgAdminProjectChangeOwner', [\"tgLightboxFactory\", AdminProjectChangeOwnerDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, ProjectTagsController, ProjectTagsDirective, ProjectValuesController, ProjectValuesDirective, ProjectValuesSectionController, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, bindOnce, debounce, getDefaulColorList, 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 getDefaulColorList = this.taiga.getDefaulColorList;\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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function ProjectValuesSectionController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, errorHandlingService, projectService1) {\n var description, sectionName, title;\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.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.project = {};\n this.loadInitialData();\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 this.appMetaService.setAll(title, description);\n }\n\n ProjectValuesSectionController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\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 var unwatch;\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 unwatch = this.scope.$watch(\"resource\", (function(_this) {\n return function(resource) {\n if (resource) {\n _this.loadValues();\n return unwatch();\n }\n };\n })(this));\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 = _.maxBy(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, projectService) {\n var link, linkDragAndDrop, linkValue;\n linkDragAndDrop = function($scope, $el, $attrs) {\n var drake, itemEl, newParentScope, oldParentScope, scroll, tdom;\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemValue;\n itemEl = $(item);\n itemValue = itemEl.scope().value;\n itemIndex = itemEl.index();\n return $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\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 row.siblings(\".visualization\").removeClass('hidden');\n return projectService.fetchProject();\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\", \".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\", \"tgProjectService\", ProjectValuesDirective]);\n\n ColorSelectionDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var $ctrl;\n $scope.colorList = getDefaulColorList();\n $scope.allowEmpty = false;\n if ($attrs.tgAllowEmpty) {\n $scope.allowEmpty = true;\n }\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 $(\".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 $el.on(\"keyup\", \"input\", function(event) {\n event.stopPropagation();\n if (event.keyCode === 13) {\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n } else if (event.keyCode === 27) {\n return $el.find(\".select-color\").hide();\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(\"tgColorSelection\", ColorSelectionDirective);\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n RICHTEXT_TYPE = \"richtext\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\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: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }, {\n key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\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\", \"tgProjectService\"];\n\n function ProjectCustomAttributesController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, translate, projectService1) {\n var description, sectionName, title;\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.projectService = projectService1;\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 = this.projectService.project.toJS();\n this.scope.projectId = this.scope.project.id;\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 this.appMetaService.setAll(title, description);\n this.scope.init = (function(_this) {\n return function(type) {\n _this.scope.type = type;\n return _this.loadCustomAttributes();\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 var ref;\n _this.scope.customAttributes = customAttributes;\n _this.scope.maxOrder = (ref = _.maxBy(customAttributes, \"order\")) != null ? ref.order : void 0;\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, drake, 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 drake = dragula([sortableEl[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: sortableEl[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemAttr, itemEl, itemIndex;\n itemEl = $(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 ProjectTagsController = (function(superClass) {\n extend(ProjectTagsController, superClass);\n\n ProjectTagsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgModel\", \"tgProjectService\"];\n\n function ProjectTagsController(scope, rootscope, repo, confirm, rs, model, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.model = model;\n this.projectService = projectService1;\n this.mixingClass = bind(this.mixingClass, this);\n this.cancelMixingTags = bind(this.cancelMixingTags, this);\n this.confirmMixingTags = bind(this.confirmMixingTags, this);\n this.toggleMixingFromTags = bind(this.toggleMixingFromTags, this);\n this.startMixingTags = bind(this.startMixingTags, this);\n this.deleteTag = bind(this.deleteTag, this);\n this.editTag = bind(this.editTag, this);\n this.createTag = bind(this.createTag, this);\n this.filterAndSortTags = bind(this.filterAndSortTags, this);\n this.loadTags = bind(this.loadTags, this);\n this.loading = true;\n this.loadTags();\n }\n\n ProjectTagsController.prototype.loadTags = function() {\n var project;\n project = this.projectService.project.toJS();\n return this.rs.projects.tagsColors(project.id).then((function(_this) {\n return function(tags) {\n _this.scope.projectTagsAll = _.map(tags.getAttrs(), function(color, name) {\n return _this.model.make_model('tag', {\n name: name,\n color: color\n });\n });\n _this.filterAndSortTags();\n return _this.loading = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.filterAndSortTags = function() {\n this.scope.projectTags = _.sortBy(this.scope.projectTagsAll, function(it) {\n return it.name.toLowerCase();\n });\n return this.scope.projectTags = _.filter(this.scope.projectTags, (function(_this) {\n return function(tag) {\n return tag.name.indexOf(_this.scope.tagsFilter.name) !== -1;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.createTag = function(tag, color) {\n return this.rs.projects.createTag(this.scope.projectId, tag, color);\n };\n\n ProjectTagsController.prototype.editTag = function(from_tag, to_tag, color) {\n if (from_tag === to_tag) {\n to_tag = null;\n }\n return this.rs.projects.editTag(this.scope.projectId, from_tag, to_tag, color);\n };\n\n ProjectTagsController.prototype.deleteTag = function(tag) {\n this.scope.loadingDelete = true;\n return this.rs.projects.deleteTag(this.scope.projectId, tag)[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingDelete = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.startMixingTags = function(tag) {\n return this.scope.mixingTags.toTag = tag.name;\n };\n\n ProjectTagsController.prototype.toggleMixingFromTags = function(tag) {\n var index;\n if (tag.name !== this.scope.mixingTags.toTag) {\n index = this.scope.mixingTags.fromTags.indexOf(tag.name);\n if (index === -1) {\n return this.scope.mixingTags.fromTags.push(tag.name);\n } else {\n return this.scope.mixingTags.fromTags.splice(index, 1);\n }\n }\n };\n\n ProjectTagsController.prototype.confirmMixingTags = function() {\n var fromTags, toTag;\n toTag = this.scope.mixingTags.toTag;\n fromTags = this.scope.mixingTags.fromTags;\n this.scope.loadingMixing = true;\n return this.rs.projects.mixTags(this.scope.projectId, toTag, fromTags).then((function(_this) {\n return function() {\n _this.cancelMixingTags();\n return _this.loadTags();\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingMixing = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.cancelMixingTags = function() {\n this.scope.mixingTags.toTag = null;\n return this.scope.mixingTags.fromTags = [];\n };\n\n ProjectTagsController.prototype.mixingClass = function(tag) {\n if (this.scope.mixingTags.toTag !== null) {\n if (tag.name === this.scope.mixingTags.toTag) {\n return \"mixing-tags-to\";\n } else if (this.scope.mixingTags.fromTags.indexOf(tag.name) !== -1) {\n return \"mixing-tags-from\";\n }\n }\n };\n\n return ProjectTagsController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectTagsController\", ProjectTagsController);\n\n ProjectTagsDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, $window, cancel, goToBottomList, initializeMixingTags, initializeNewValue, initializeTagsFilter, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $window = $(window);\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"tag\": \"\",\n \"color\": \"\"\n };\n };\n initializeTagsFilter = function() {\n return $scope.tagsFilter = {\n \"name\": \"\"\n };\n };\n initializeMixingTags = function() {\n return $scope.mixingTags = {\n \"toTag\": null,\n \"fromTags\": []\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD\");\n };\n initializeNewValue();\n initializeTagsFilter();\n initializeMixingTags();\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(_this) {\n return function(target) {\n var form, formEl, originalTag, promise, tag;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n tag = formEl.scope().tag;\n originalTag = tag.clone();\n originalTag.revert();\n $scope.loadingEdit = true;\n promise = $ctrl.editTag(originalTag.name, tag.name, tag.color);\n promise.then(function() {\n return $ctrl.loadTags().then(function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n $scope.loadingEdit = false;\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingEdit = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n saveNewValue = (function(_this) {\n return function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n formEl = target;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.loadingCreate = true;\n promise = $ctrl.createTag($scope.newValue.tag, $scope.newValue.color);\n promise.then(function(data) {\n return $ctrl.loadTags().then(function() {\n $scope.loadingCreate = false;\n target.addClass(\"hidden\");\n return initializeNewValue();\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingCreate = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n cancel = function(target) {\n var formEl, row, tag;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n tag.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $scope.$watch(\"tagsFilter.name\", function(tagsFilter) {\n return $ctrl.filterAndSortTags();\n });\n $window.on(\"keyup\", function(event) {\n if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return initializeMixingTags();\n });\n }\n });\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n return $el.find(\".new-value\").removeClass('hidden');\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\", \".mix-tags\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.startMixingTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-row\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.toggleMixingFromTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-confirm\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.confirmMixingTags();\n });\n });\n $el.on(\"click\", \".mixing-cancel\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.cancelMixingTags();\n });\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\", \".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(\"keyup\", \".status-name input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === 13) {\n return saveValue(target);\n } else if (event.keyCode === 27) {\n return cancel(target);\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 $el.on(\"click\", \".delete-tag\", function(event) {\n var formEl, tag, target, title;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_TAG\");\n return $confirm.askOnDelete(title, tag.name).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadTags()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $ctrl.deleteTag(tag.name).then(onSucces, onError);\n });\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $window.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectTags\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectTagsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"$tgModel\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function RolesController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, model, appMetaService, translate, errorHandlingService, projectService) {\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.model = model;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\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\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 this.loadProject();\n return this.loadRoles();\n };\n\n RolesController.prototype.forceLoadProject = function() {\n return this.projectService.fetchProject((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this));\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.forceLoadProject();\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.forceLoadProject();\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, 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.forceLoadProject();\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 return this.confirm.ask(title, subtitle, \"\").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\", \".edit-value\", 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: _.maxBy($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.forceLoadProject();\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, epicPermissions, 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 epicPermissions = [\n {\n key: \"view_epics\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS\"\n }, {\n key: \"add_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS\"\n }, {\n key: \"modify_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS\"\n }, {\n key: \"comment_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS\"\n }, {\n key: \"delete_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME\",\n permissions: setActivePermissions(epicPermissions)\n });\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: \"comment_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_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: \"comment_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_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: \"comment_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_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 target.toggleClass(\"open-drawer\");\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.forceLoadProject();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, GogsController, GogsWebhooksDirective, 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\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WebhooksController(scope, repo, rs, params, location, navUrls, appMetaService, translate, errorHandlingService, projectService) {\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 this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WebhooksController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadWebhooks();\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(_.toPairs(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\").slideToggle();\n return updateShowHideHistoryText();\n });\n });\n } else {\n $el.find(\".webhooks-history\").toggleClass(\"open\").slideToggle();\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, $analytics) {\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 $analytics.trackEvent(\"webhooks\", \"create\", \"Create new webhook\", 1);\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 initializeNewValue();\n if ($scope.webhooks.length >= 1) {\n return formDOMNode.addClass(\"hidden\");\n }\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\", \"$tgAnalytics\", NewWebhookDirective]);\n\n GithubController = (function(superClass) {\n extend(GithubController, superClass);\n\n GithubController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GithubController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GithubController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return this.loadModules();\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\", \"tgProjectService\"];\n\n function GitlabController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GitlabController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\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\", \"tgProjectService\"];\n\n function BitbucketController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\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 var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n BitbucketController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\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, $analytics) {\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 $analytics.trackEvent(\"github-webhook\", \"created-or-changed\", \"Create or changed github webhook\", 1);\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\", \"$tgAnalytics\", GithubWebhooksDirective]);\n\n GitlabWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\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 $analytics.trackEvent(\"gitlab-webhook\", \"created-or-changed\", \"Create or changed gitlab webhook\", 1);\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\", \"$tgAnalytics\", GitlabWebhooksDirective]);\n\n BitbucketWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\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 $analytics.trackEvent(\"bitbucket-webhook\", \"created-or-changed\", \"Create or changed bitbucket webhook\", 1);\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\", \"$tgAnalytics\", 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 GogsController = (function(superClass) {\n extend(GogsController, superClass);\n\n GogsController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GogsController(scope, repo, rs, params, appMetaService, translate, projectService) {\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 this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GOGS.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.GOGS.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 GogsController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gogs\").then((function(_this) {\n return function(gogs) {\n return _this.scope.gogs = gogs;\n };\n })(this));\n };\n\n GogsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GogsController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return GogsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n GogsWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\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.gogs, \"gogs\");\n promise.then(function() {\n $analytics.trackEvent(\"gogs-webhook\", \"create-or-change\", \"Create or change gogs webhook\", 1);\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 $el.on(\"submit\", \"form\", submit);\n return $el.on(\"click\", \".submit-button\", submit);\n };\n return {\n link: link\n };\n };\n\n module.controller(\"GogsController\", GogsController);\n\n module.directive(\"tgGogsWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GogsWebhooksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 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 DeleteProjectDirective = function($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService, $analytics) {\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 $analytics.trackEvent(\"projects\", \"delete\", \"Delete project\", 1);\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\", \"$tgAnalytics\", DeleteProjectDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, ContribUserSettingsController, 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\", \"tgProjectService\"];\n\n function ContribController(rootScope, scope, params, repo, rs, confirm, projectService) {\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.projectService = projectService;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.adminPlugins, {\n \"slug\": this.params.plugin\n }));\n this.scope.projectSlug = this.params.pslug;\n this.loadInitialData();\n }\n\n ContribController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\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\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 ContribUserSettingsController = (function(superClass) {\n extend(ContribUserSettingsController, superClass);\n\n ContribUserSettingsController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\"];\n\n function ContribUserSettingsController(rootScope, scope, params) {\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.userSettingsPlugins, {\n \"slug\": this.params.plugin\n }));\n }\n\n return ContribUserSettingsController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribUserSettingsController\", ContribUserSettingsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 = _.assign({}, options.headers || {}, this.headers());\n return this.http(options);\n };\n\n HttpService.prototype.get = function(url, params, options) {\n options = _.assign({\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 = _.assign({\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 = _.assign({\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 = _.assign({\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 = _.assign({\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.realClone = function() {\n var attrs, instance;\n attrs = _.cloneDeep(this._attrs);\n instance = new Model(this._name, attrs, this._dataTypes);\n instance._modifiedAttrs = _.cloneDeep(this._modifiedAttrs);\n instance._isModified = _.cloneDeep(this._isModified);\n return instance;\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, lightboxService) {\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 $scope.$apply();\n break;\n case 2:\n window.open(fullUrl);\n }\n return lightboxService.closeAll();\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\", \"lightboxService\", NavigationUrlsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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), extraParams);\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, params, options, returnHeaders) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n if (params == null) {\n params = {};\n }\n if (returnHeaders == null) {\n returnHeaders = false;\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, params, options);\n } else {\n promise = this.http.put(url, data, params, options);\n }\n promise.success((function(_this) {\n return function(data, status, headers, response) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n if (returnHeaders) {\n return defered.resolve([model, headers()]);\n } else {\n return defered.resolve(model);\n }\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 if (options.ref != null) {\n params.ref = options.ref;\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", [_.trimEnd(this.mainUrl, \"/\"), _.trimStart(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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 epic: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/epic\");\n }\n },\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 epic: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/epic\");\n }\n },\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/epics.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 = \"epics-queryparams\";\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(\"epics\", \"by_ref\", 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.upvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-upvote\", epicId);\n return $http.post(url);\n };\n service.downvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-downvote\", epicId);\n return $http.post(url);\n };\n service.watch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-watch\", epicId);\n return $http.post(url);\n };\n service.unwatch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-unwatch\", epicId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.epics = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgEpicsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.editComment = function(type, objectId, activityId, comment) {\n var commentData, params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/edit_comment\";\n params = {\n id: activityId\n };\n commentData = {\n comment: comment\n };\n return $http.post(url, commentData, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.getCommentHistory = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/comment_versions\";\n params = {\n id: activityId\n };\n return $http.get(url, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 hashSuffix, service;\n service = {};\n hashSuffix = \"issues-queryparams\";\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 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\": \"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_epics_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_epics_csv_uuid\";\n return $http.post(url);\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_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.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.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.deleteTag = function(projectId, tag) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/delete_tag\";\n return $http.post(url, {\n tag: tag\n });\n };\n service.createTag = function(projectId, tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/create_tag\";\n data = {};\n data.tag = tag;\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.editTag = function(projectId, from_tag, to_tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/edit_tag\";\n data = {};\n data.from_tag = from_tag;\n if (to_tag) {\n data.to_tag = to_tag;\n }\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.mixTags = function(projectId, to_tag, from_tags) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/mix_tags\";\n return $http.post(url, {\n to_tag: to_tag,\n from_tags: from_tags\n });\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 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 (evt.target.getResponseHeader('Taiga-Info-Project-Is-Private')) {\n response.headers = {\n isPrivate: evt.target.getResponseHeader('Taiga-Info-Project-Is-Private') === 'True',\n memberships: parseInt(evt.target.getResponseHeader('Taiga-Info-Project-Memberships'))\n };\n }\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", taskId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"tasks\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"task-filters\", null, params);\n };\n service.list = function(projectId, sprintId, userStoryId, params) {\n if (sprintId == null) {\n sprintId = null;\n }\n if (userStoryId == null) {\n userStoryId = null;\n }\n params = _.merge(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 milestone_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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $q) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"userstories-queryparams\";\n service.get = function(projectId, usId, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"userstories\", usId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n if (extraParams == null) {\n extraParams = {};\n }\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\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, pageSize) {\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\", _.extend(params, {\n page_size: pageSize\n }), {\n enablePagination: true\n }, true);\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.bulkUpdateMilestone = function(projectId, milestoneId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-milestone\");\n params = {\n project_id: projectId,\n milestone_id: milestoneId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateKanbanOrder = function(projectId, statusId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-kanban-order\");\n params = {\n project_id: projectId,\n status_id: statusId,\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\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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.list = function(projectId) {\n return $repo.queryMany(\"wiki\", {\n project: projectId\n });\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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 form, submit, submitButton;\n form = new checksley.Form($el.find(\"form\"));\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 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, submitButton;\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 currentLoading, promise;\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.remove($scope.user);\n promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $auth.logout();\n return $location.path($navUrls.resolve(\"login\"));\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n $el.on(\"click\", \".button-red\", debounce(2000, function(event) {\n event.preventDefault();\n return submit();\n }));\n return submitButton = $el.find(\".button-red\");\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\", \"$tgLoading\", DeleteUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\"];\n\n function UserSettingsController(scope, rootscope, config, repo, confirm, rs, params, q, location, navUrls, auth, translate, errorHandlingService) {\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.errorHandlingService = errorHandlingService;\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.errorHandlingService.permissionDenied();\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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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\", \"tgErrorHandlingService\"];\n\n function UserNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, errorHandlingService) {\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.errorHandlingService = errorHandlingService;\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-2017 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-2017 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-2017 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: history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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: utils.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUtils\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaWikiHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedItemDirective;\n\n AssignedItemDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n templateUrl: \"components/assigned-to/assigned-item/assigned-item.html\",\n scope: {\n member: \"=\"\n },\n link: link\n };\n };\n\n AssignedItemDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedItem\", AssignedItemDirective);\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: assigned-to-selector.controller.coffee\n */\n\n(function() {\n var AssignedToSelectorController;\n\n AssignedToSelectorController = (function() {\n AssignedToSelectorController.$inject = [];\n\n function AssignedToSelectorController() {\n if (this.assigned) {\n this._getAssignedMember();\n }\n this._filterAssignedMember();\n }\n\n AssignedToSelectorController.prototype._getAssignedMember = function() {\n return this.assignedMember = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id === _this.assigned.get('id');\n };\n })(this));\n };\n\n AssignedToSelectorController.prototype._filterAssignedMember = function() {\n if (this.assigned) {\n return this.nonAssignedMembers = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id !== _this.assigned.get('id');\n };\n })(this));\n } else {\n return this.nonAssignedMembers = this.project.members;\n }\n };\n\n return AssignedToSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToSelectorCtrl', AssignedToSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedToSelectorDirective;\n\n AssignedToSelectorDirective = function() {\n return {\n controller: \"AssignedToSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to-selector/assigned-to-selector.html\",\n scope: {\n assigned: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToSelectorDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToSelector\", AssignedToSelectorDirective);\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: assigned-to.controller.coffee\n */\n\n(function() {\n var AssignedToController;\n\n AssignedToController = (function() {\n AssignedToController.$inject = [\"tgLightboxFactory\", \"lightboxService\"];\n\n function AssignedToController(lightboxFactory, lightboxService) {\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.has_permissions = _.includes(this.project.my_permissions, 'modify_epic');\n }\n\n AssignedToController.prototype._closeAndRemoveAssigned = function() {\n this.lightboxService.closeAll();\n return this.onRemoveAssigned();\n };\n\n AssignedToController.prototype._closeAndAssign = function(member) {\n this.lightboxService.closeAll();\n return this.onAssignTo({\n 'member': member\n });\n };\n\n AssignedToController.prototype.onSelectAssignedTo = function(assigned, project) {\n return this.lightboxFactory.create('tg-assigned-to-selector', {\n \"class\": \"lightbox lightbox-assigned-to-selector open\",\n \"assigned\": \"assigned\",\n \"project\": \"project\",\n \"on-remove-assigned\": \"onRemoveAssigned()\",\n \"on-assign-to\": \"assignTo(member)\"\n }, {\n \"assigned\": this.assignedTo,\n \"project\": this.project,\n \"onRemoveAssigned\": this._closeAndRemoveAssigned.bind(this),\n \"assignTo\": this._closeAndAssign.bind(this)\n });\n };\n\n return AssignedToController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToCtrl', AssignedToController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: assigned-to.directive.coffee\n */\n\n(function() {\n var AssignedToDirective;\n\n AssignedToDirective = function() {\n return {\n controller: \"AssignedToCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to.html\",\n scope: {\n assignedTo: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToComponent\", AssignedToDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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, attachmentsPreviewService, lightboxService) {\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 lightboxService.open($('tg-attachments-preview'));\n return attachmentsPreviewService.fileId = attachment.getIn(['file', 'id']);\n });\n } else if (taiga.isPdf(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return window.open(attachment.getIn(['file', 'url']));\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\", \"tgAttachmentsPreviewService\", \"lightboxService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentLink\", AttachmentLinkDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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\", \"tgProjectService\", \"tgAttachmentsPreviewService\"];\n\n function AttachmentsFullController(translate, confirm, config, storage, attachmentsFullService, projectService, attachmentsPreviewService) {\n this.translate = translate;\n this.confirm = confirm;\n this.config = config;\n this.storage = storage;\n this.attachmentsFullService = attachmentsFullService;\n this.projectService = projectService;\n this.attachmentsPreviewService = attachmentsPreviewService;\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 this.attachmentsPreviewService.fileId = null;\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 AttachmentsFullController.prototype._isEditable = function() {\n if (this.projectService.project) {\n return this.projectService.hasPermission(this.editPermission);\n }\n return false;\n };\n\n AttachmentsFullController.prototype.showAttachments = function() {\n return this._isEditable() || this.attachmentsFullService.attachments.size;\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 editPermission: \"@\"\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-2017 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, comment) {\n if (editable == null) {\n editable = true;\n }\n if (comment == null) {\n comment = false;\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, comment);\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 from_comment: comment\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(new Error(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-preview.controller.coffee\n */\n\n(function() {\n var AttachmentsPreviewController;\n\n AttachmentsPreviewController = (function() {\n AttachmentsPreviewController.$inject = [\"tgAttachmentsPreviewService\"];\n\n function AttachmentsPreviewController(attachmentsPreviewService) {\n this.attachmentsPreviewService = attachmentsPreviewService;\n taiga.defineImmutableProperty(this, \"current\", (function(_this) {\n return function() {\n if (!_this.attachmentsPreviewService.fileId) {\n return null;\n }\n return _this.getCurrent();\n };\n })(this));\n }\n\n AttachmentsPreviewController.prototype.hasPagination = function() {\n var images;\n images = this.attachments.filter((function(_this) {\n return function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n };\n })(this));\n return images.size > 1;\n };\n\n AttachmentsPreviewController.prototype.getCurrent = function() {\n var attachment, file;\n attachment = this.attachments.find((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n file = attachment.get('file');\n return file;\n };\n\n AttachmentsPreviewController.prototype.getIndex = function() {\n return this.attachments.findIndex((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n };\n\n AttachmentsPreviewController.prototype.next = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(attachmentIndex + 1).find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n AttachmentsPreviewController.prototype.previous = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(0, attachmentIndex).findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n return AttachmentsPreviewController;\n\n })();\n\n angular.module('taigaComponents').controller('AttachmentsPreview', AttachmentsPreviewController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-preview.directive.coffee\n */\n\n(function() {\n var AttachmentPreviewLightboxDirective;\n\n AttachmentPreviewLightboxDirective = function(lightboxService, attachmentsPreviewService) {\n var link;\n link = function($scope, el, attrs, ctrl) {\n $(document.body).on(\"keydown.image-preview\", function(e) {\n if (attachmentsPreviewService.fileId) {\n if (e.keyCode === 39) {\n ctrl.next();\n } else if (e.keyCode === 37) {\n ctrl.previous();\n }\n }\n return $scope.$digest();\n });\n return $scope.$on('$destroy', function() {\n return $(document.body).off('.image-preview');\n });\n };\n return {\n scope: {},\n controller: 'AttachmentsPreview',\n templateUrl: 'components/attachments-preview/attachments-preview.html',\n link: link,\n controllerAs: \"vm\",\n bindToController: {\n attachments: \"=\"\n }\n };\n };\n\n angular.module('taigaComponents').directive(\"tgAttachmentsPreview\", [\"lightboxService\", \"tgAttachmentsPreviewService\", AttachmentPreviewLightboxDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-preview.service.coffee\n */\n\n(function() {\n var AttachmentsPreviewService,\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 AttachmentsPreviewService = (function(superClass) {\n extend(AttachmentsPreviewService, superClass);\n\n AttachmentsPreviewService.$inject = [];\n\n function AttachmentsPreviewService() {}\n\n return AttachmentsPreviewService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsPreviewService\", AttachmentsPreviewService);\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-2017 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, drake, scroll;\n callback = $parse(attrs.tgAttachmentsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var attachment, newIndex;\n item = $(item);\n attachment = item.scope().attachment;\n newIndex = item.index();\n return scope.$apply(function() {\n return callback(scope, {\n attachment: attachment,\n index: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\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-2017 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-2017 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: avatar.directive.coffee\n */\n\n(function() {\n var AvatarDirective;\n\n AvatarDirective = function(avatarService) {\n var link;\n link = function(scope, el, attrs) {\n var attributeName;\n if (attrs.tgAvatarBig) {\n attributeName = 'avatarBig';\n } else {\n attributeName = 'avatar';\n }\n return scope.$watch(attributeName, function(user) {\n var avatar;\n avatar = avatarService.getAvatar(user, attributeName);\n el.attr('src', avatar.url);\n return el.css('background', avatar.bg || \"\");\n });\n };\n return {\n link: link,\n scope: {\n avatar: \"=tgAvatar\",\n avatarBig: \"=tgAvatarBig\"\n }\n };\n };\n\n AvatarDirective.$inject = ['tgAvatarService'];\n\n angular.module(\"taigaComponents\").directive(\"tgAvatar\", AvatarDirective);\n\n angular.module(\"taigaComponents\").directive(\"tgAvatarBig\", AvatarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: belong-to-epics.directive.coffee\n */\n\n(function() {\n var BelongToEpicsDirective, module;\n\n module = angular.module('taigaEpics');\n\n BelongToEpicsDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs) {\n return scope.$watch('epics', function(epics) {\n if (epics && !epics.isIterable) {\n return scope.immutable_epics = Immutable.fromJS(epics);\n }\n });\n };\n templateUrl = function(el, attrs) {\n if (attrs.format) {\n return \"components/belong-to-epics/belong-to-epics-\" + attrs.format + \".html\";\n }\n return \"components/belong-to-epics/belong-to-epics-pill.html\";\n };\n return {\n link: link,\n scope: {\n epics: '='\n },\n templateUrl: templateUrl\n };\n };\n\n module.directive(\"tgBelongToEpics\", BelongToEpicsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/bind-code.directive.coffee\n */\n\n(function() {\n var BindCode;\n\n BindCode = function($sce, $parse, $compile, wysiwygService, wysiwygCodeHightlighterService) {\n return {\n restrict: 'A',\n compile: function(tElement, tAttrs) {\n var tgBindCodeGetter, tgBindCodeWatch;\n tgBindCodeGetter = $parse(tAttrs.tgBindCode);\n tgBindCodeWatch = $parse(tAttrs.tgBindCode, function(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n return function(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.tgBindCode);\n return scope.$watch(tgBindCodeWatch, function() {\n var html;\n html = wysiwygService.getHTML(tgBindCodeGetter(scope));\n element.html($sce.getTrustedHtml(html) || '');\n return wysiwygCodeHightlighterService.addHightlighter(element);\n });\n };\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgBindCode\", [\"$sce\", \"$parse\", \"$compile\", \"tgWysiwygService\", \"tgWysiwygCodeHightlighterService\", BindCode]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: board-zoom.directive.coffee\n */\n\n(function() {\n var BoardZoomDirective;\n\n BoardZoomDirective = function() {\n return {\n scope: {\n levels: \"=\",\n value: \"=\"\n },\n templateUrl: 'components/board-zoom/board-zoom.html'\n };\n };\n\n angular.module('taigaComponents').directive(\"tgBoardZoom\", [BoardZoomDirective]);\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: card-slideshow.controller.coffee\n */\n\n(function() {\n var CardSlideshowController;\n\n CardSlideshowController = (function() {\n CardSlideshowController.$inject = [];\n\n function CardSlideshowController() {\n this.index = 0;\n }\n\n CardSlideshowController.prototype.next = function() {\n this.index++;\n if (this.index >= this.images.size) {\n return this.index = 0;\n }\n };\n\n CardSlideshowController.prototype.previous = function() {\n this.index--;\n if (this.index < 0) {\n return this.index = this.images.size - 1;\n }\n };\n\n return CardSlideshowController;\n\n })();\n\n angular.module('taigaComponents').controller('CardSlideshow', CardSlideshowController);\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: card.directive.coffee\n */\n\n(function() {\n var cardSlideshowDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardSlideshowDirective = function() {\n return {\n controller: \"CardSlideshow\",\n templateUrl: \"components/card-slideshow/card-slideshow.html\",\n bindToController: true,\n controllerAs: \"vm\",\n scope: {\n images: \"=\"\n }\n };\n };\n\n module.directive('tgCardSlideshow', cardSlideshowDirective);\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: card.controller.coffee\n */\n\n(function() {\n var CardController;\n\n CardController = (function() {\n function CardController() {}\n\n CardController.$inject = [];\n\n CardController.prototype.visible = function(name) {\n return this.zoom.indexOf(name) !== -1;\n };\n\n CardController.prototype.hasTasks = function() {\n var tasks;\n tasks = this.item.getIn(['model', 'tasks']);\n return tasks && tasks.size > 0;\n };\n\n CardController.prototype.hasVisibleAttachments = function() {\n return this.item.get('images').size > 0;\n };\n\n CardController.prototype.toggleFold = function() {\n return this.onToggleFold({\n id: this.item.get('id')\n });\n };\n\n CardController.prototype.getClosedTasks = function() {\n return this.item.getIn(['model', 'tasks']).filter(function(task) {\n return task.get('is_closed');\n });\n };\n\n CardController.prototype.closedTasksPercent = function() {\n return this.getClosedTasks().size * 100 / this.item.getIn(['model', 'tasks']).size;\n };\n\n CardController.prototype.getPermissionsKey = function() {\n if (this.type === 'task') {\n return 'modify_task';\n } else {\n return 'modify_us';\n }\n };\n\n CardController.prototype._setVisibility = function() {\n var visibility;\n visibility = {\n related: this.visible('related_tasks'),\n slides: this.visible('attachments')\n };\n if (!_.isUndefined(this.item.get('foldStatusChanged'))) {\n if (this.visible('related_tasks') && this.visible('attachments')) {\n visibility.related = !this.item.get('foldStatusChanged');\n visibility.slides = !this.item.get('foldStatusChanged');\n } else if (this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n } else if (!this.visible('related_tasks') && !this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n }\n }\n if (!this.item.getIn(['model', 'tasks']) || !this.item.getIn(['model', 'tasks']).size) {\n visibility.related = false;\n }\n if (!this.item.get('images') || !this.item.get('images').size) {\n visibility.slides = false;\n }\n return visibility;\n };\n\n CardController.prototype.isRelatedTasksVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.related;\n };\n\n CardController.prototype.isSlideshowVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.slides;\n };\n\n CardController.prototype.getNavKey = function() {\n if (this.type === 'task') {\n return 'project-tasks-detail';\n } else {\n return 'project-userstories-detail';\n }\n };\n\n return CardController;\n\n })();\n\n angular.module('taigaComponents').controller('Card', CardController);\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: card.directive.coffee\n */\n\n(function() {\n var cardDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardDirective = function() {\n return {\n link: function(scope) {},\n controller: \"Card\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/card/card.html\",\n scope: {\n onToggleFold: \"&\",\n onClickAssignedTo: \"&\",\n onClickEdit: \"&\",\n project: \"=\",\n item: \"=\",\n zoom: \"=\",\n zoomLevel: \"=\",\n archived: \"=\",\n type: \"@\"\n }\n };\n };\n\n module.directive('tgCard', cardDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/click-input-file.directive.coffee\n */\n\n(function() {\n var ClickInputFile;\n\n ClickInputFile = function() {\n return {\n link: function(scope, el) {\n el.on('click', function(e) {\n var inputFile;\n if (!$(e.target).is('input')) {\n e.preventDefault();\n inputFile = el.find('input[type=\"file\"]');\n inputFile.val('');\n return inputFile.trigger('click');\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgClickInputFile\", [ClickInputFile]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: color-selector.controller.coffee\n */\n\n(function() {\n var ColorSelectorController, getDefaulColorList, taiga;\n\n taiga = this.taiga;\n\n getDefaulColorList = taiga.getDefaulColorList;\n\n ColorSelectorController = (function() {\n ColorSelectorController.$inject = [\"tgProjectService\"];\n\n function ColorSelectorController(projectService) {\n this.projectService = projectService;\n this.colorList = getDefaulColorList();\n this.checkIsColorRequired();\n this.displayColorList = false;\n }\n\n ColorSelectorController.prototype.userCanChangeColor = function() {\n if (!this.requiredPerm) {\n return true;\n }\n return this.projectService.hasPermission(this.requiredPerm);\n };\n\n ColorSelectorController.prototype.checkIsColorRequired = function() {\n if (!this.isColorRequired) {\n return this.colorList = _.dropRight(this.colorList);\n }\n };\n\n ColorSelectorController.prototype.setColor = function(color) {\n this.color = color;\n return this.customColor = color;\n };\n\n ColorSelectorController.prototype.resetColor = function() {\n if (this.isColorRequired && !this.color) {\n return this.color = this.initColor;\n }\n };\n\n ColorSelectorController.prototype.toggleColorList = function() {\n this.displayColorList = !this.displayColorList;\n this.customColor = this.color;\n return this.resetColor();\n };\n\n ColorSelectorController.prototype.onSelectDropdownColor = function(color) {\n this.color = color;\n this.onSelectColor({\n color: color\n });\n return this.toggleColorList();\n };\n\n ColorSelectorController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n if (this.customColor || !this.isColorRequired) {\n this.onSelectDropdownColor(this.customColor);\n }\n return event.preventDefault();\n }\n };\n\n return ColorSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller(\"ColorSelectorCtrl\", ColorSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: color-selector.directive.coffee\n */\n\n(function() {\n var ColorSelectorDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n ColorSelectorDirective = function($timeout) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var _timeout, cancel, close;\n _timeout = null;\n cancel = function() {\n $timeout.cancel(_timeout);\n return _timeout = null;\n };\n close = function() {\n if (_timeout) {\n return;\n }\n return _timeout = $timeout((function() {\n ctrl.displayColorList = false;\n return ctrl.resetColor();\n }), 400);\n };\n el.find('.color-selector').mouseenter(cancel).mouseleave(close);\n el.find('.color-selector-dropdown').mouseenter(cancel).mouseleave(close);\n return scope.$watch('vm.initColor', function(color) {\n return ctrl.setColor(color);\n });\n };\n return {\n link: link,\n templateUrl: \"components/color-selector/color-selector.html\",\n controller: \"ColorSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n isColorRequired: \"=\",\n onSelectColor: \"&\",\n initColor: \"=\",\n requiredPerm: \"@\"\n },\n scope: {}\n };\n };\n\n ColorSelectorDirective.$inject = [\"$timeout\"];\n\n angular.module('taigaComponents').directive(\"tgColorSelector\", ColorSelectorDirective);\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: story-header.controller.coffee\n */\n\n(function() {\n var StoryHeaderController, module;\n\n module = angular.module(\"taigaUserStories\");\n\n StoryHeaderController = (function() {\n StoryHeaderController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\", \"$tgNavUrls\", \"$window\"];\n\n function StoryHeaderController(rootScope, confirm, modelTransform, navUrls, window) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.navUrls = navUrls;\n this.window = window;\n this.editMode = false;\n this.loadingSubject = false;\n this.originalSubject = this.item.subject;\n }\n\n StoryHeaderController.prototype._checkNav = function() {\n var ctx, ref, ref1;\n if (((ref = this.item.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.previous.ref\n };\n this.previousUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n if (((ref1 = this.item.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.next.ref\n };\n return this.nextUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n };\n\n StoryHeaderController.prototype._checkPermissions = function() {\n return this.permissions = {\n canEdit: _.includes(this.project.my_permissions, this.requiredPerm)\n };\n };\n\n StoryHeaderController.prototype.editSubject = function(value) {\n var selection;\n selection = this.window.getSelection();\n if (selection.type !== \"Range\") {\n if (value) {\n this.editMode = true;\n }\n if (!value) {\n return this.editMode = false;\n }\n }\n };\n\n StoryHeaderController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n this.saveSubject();\n }\n if (event.which === 27) {\n this.item.subject = this.originalSubject;\n return this.editSubject(false);\n }\n };\n\n StoryHeaderController.prototype.saveSubject = function() {\n var item, onEditSubjectError, onEditSubjectSuccess, transform;\n onEditSubjectSuccess = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n _this.rootScope.$broadcast(\"object:updated\");\n _this.confirm.notify('success');\n return _this.originalSubject = _this.item.subject;\n };\n })(this);\n onEditSubjectError = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n return _this.confirm.notify('error');\n };\n })(this);\n this.editMode = false;\n this.loadingSubject = true;\n item = this.item;\n transform = this.modelTransform.save(function(item) {\n return item;\n });\n return transform.then(onEditSubjectSuccess, onEditSubjectError);\n };\n\n return StoryHeaderController;\n\n })();\n\n module.controller(\"StoryHeaderCtrl\", StoryHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: story-header.directive.coffee\n */\n\n(function() {\n var DetailHeaderDirective, module;\n\n module = angular.module('taigaUserStories');\n\n DetailHeaderDirective = function() {\n var link;\n this.$inject = [];\n link = function(scope, el, attrs, ctrl) {\n ctrl._checkPermissions();\n return ctrl._checkNav();\n };\n return {\n link: link,\n controller: \"StoryHeaderCtrl\",\n bindToController: true,\n scope: {\n item: \"=\",\n project: \"=\",\n requiredPerm: \"@\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/detail/header/detail-header.html\"\n };\n };\n\n module.directive(\"tgDetailHeader\", DetailHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 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-2017 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: filter-utils.service.coffee\n */\n\n(function() {\n var FilterRemoteStorageService, generateHash,\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 generateHash = taiga.generateHash;\n\n FilterRemoteStorageService = (function(superClass) {\n extend(FilterRemoteStorageService, superClass);\n\n FilterRemoteStorageService.$inject = [\"$q\", \"$tgUrls\", \"$tgHttp\"];\n\n function FilterRemoteStorageService(q, urls, http) {\n this.q = q;\n this.urls = urls;\n this.http = http;\n }\n\n FilterRemoteStorageService.prototype.storeFilters = function(projectId, myFilters, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n if (_.isEmpty(myFilters)) {\n promise = this.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 = this.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(_this) {\n return function(data) {\n var innerPromise;\n innerPromise = _this.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 })(this));\n }\n return deferred.promise;\n };\n\n FilterRemoteStorageService.prototype.getFilters = function(projectId, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n promise = this.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\n return FilterRemoteStorageService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgFilterRemoteStorageService\", FilterRemoteStorageService);\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: filter.-slide-down.controller.coffee\n */\n\n(function() {\n var FilterSlideDownDirective;\n\n FilterSlideDownDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var filter;\n filter = $('tg-filter');\n return scope.$watch(attrs.ngIf, function(value) {\n var contentHeight, wrapperHeight;\n if (value) {\n filter.find('.filter-list').hide();\n wrapperHeight = filter.height();\n contentHeight = 0;\n filter.children().each(function() {\n return contentHeight += $(this).outerHeight(true);\n });\n return $(el.context.nextSibling).css({\n \"max-height\": wrapperHeight - contentHeight,\n \"display\": \"block\"\n });\n }\n });\n };\n return {\n priority: 900,\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilterSlideDown\", [FilterSlideDownDirective]);\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: filter.controller.coffee\n */\n\n(function() {\n var FilterController;\n\n FilterController = (function() {\n FilterController.$inject = [];\n\n function FilterController() {\n this.opened = null;\n this.customFilterForm = false;\n this.customFilterName = '';\n }\n\n FilterController.prototype.toggleFilterCategory = function(filterName) {\n if (this.opened === filterName) {\n return this.opened = null;\n } else {\n return this.opened = filterName;\n }\n };\n\n FilterController.prototype.isOpen = function(filterName) {\n return this.opened === filterName;\n };\n\n FilterController.prototype.saveCustomFilter = function() {\n this.onSaveCustomFilter({\n name: this.customFilterName\n });\n this.customFilterForm = false;\n this.opened = 'custom-filter';\n return this.customFilterName = '';\n };\n\n FilterController.prototype.changeQ = function() {\n return this.onChangeQ({\n q: this.q\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectFilter = function(filterCategory, filter) {\n filter = {\n category: filterCategory,\n filter: filter\n };\n return this.onAddFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.removeCustomFilter = function(filter) {\n return this.onRemoveCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectCustomFilter = function(filter) {\n return this.onSelectCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.isFilterSelected = function(filterCategory, filter) {\n return !!_.find(this.selectedFilters, function(it) {\n return filter.id === it.id && filterCategory.dataType === it.dataType;\n });\n };\n\n return FilterController;\n\n })();\n\n angular.module('taigaComponents').controller('Filter', FilterController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: filter.directive.coffee\n */\n\n(function() {\n var FilterDirective;\n\n FilterDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var unwatch;\n unwatch = scope.$watch(\"vm.defaultQ\", function(q) {\n if (q && !scope.vm.filtersForm.$dirty) {\n scope.vm.q = q;\n return unwatch();\n } else if (scope.vm.filtersForm.$dirty) {\n return unwatch();\n }\n });\n return attrs.$observe(\"open\", function(open) {\n open = scope.$eval(open);\n if (open) {\n return el.addClass('open');\n } else {\n return el.removeClass('open');\n }\n });\n };\n return {\n scope: {\n onChangeQ: \"&\",\n onAddFilter: \"&\",\n onSelectCustomFilter: \"&\",\n onRemoveFilter: \"&\",\n onRemoveCustomFilter: \"&\",\n onSaveCustomFilter: \"&\",\n customFilters: \"<\",\n defaultQ: \"=q\",\n filters: \"<\",\n customFilters: \"<\",\n selectedFilters: \"<\"\n },\n bindToController: true,\n controller: \"Filter\",\n controllerAs: \"vm\",\n templateUrl: 'components/filter/filter.html',\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilter\", [FilterDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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: '.add-action',\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-2017 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: kanban-board-zoom.directive.coffee\n */\n\n(function() {\n var KanbanBoardZoomDirective;\n\n KanbanBoardZoomDirective = function(storage, projectService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, unwatch, zooms;\n scope.zoomIndex = storage.get(\"kanban_zoom\") || 2;\n scope.levels = 5;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\"], [\"related_tasks\", \"empty_extra_info\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"kanban_zoom\") !== zoomIndex) {\n storage.set(\"kanban_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n return unwatch = scope.$watch(function() {\n return projectService.project;\n }, function(project) {\n if (project) {\n if (project.get('my_permissions').indexOf(\"view_tasks\") === -1) {\n scope.levels = 4;\n }\n return unwatch();\n }\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgKanbanBoardZoom\", [\"$tgStorage\", \"tgProjectService\", KanbanBoardZoomDirective]);\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-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 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-big-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoBigSrcDirective;\n\n ProjectLogoBigSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return 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 = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoBigSrc\"\n }\n };\n };\n\n ProjectLogoBigSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoBigSrc\", ProjectLogoBigSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-small-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoSmallSrcDirective;\n\n ProjectLogoSmallSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return 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 = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoSmallSrc\"\n }\n };\n };\n\n ProjectLogoSmallSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoSmallSrc\", ProjectLogoSmallSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 epics: false,\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n });\n if (this.project.get(\"is_epics_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_epics\") !== -1) {\n this.menu = this.menu.set(\"epics\", true);\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 } 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\") + \"-\" + taiga.slugify(this.project.get(\"videoconferences_extra_data\"));\n } else {\n url = this.project.get(\"slug\");\n }\n if (this.project.get(\"videoconferences\") === \"jitsi\") {\n url = url.replace(/-/g, \"\");\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-2017 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-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagOptionDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagOptionDirective = function() {\n var dispatch, link, select, stop;\n select = function(selected) {\n var containerHeight, diff, selectedPosition;\n selected.addClass('selected');\n selectedPosition = selected.position().top + selected.outerHeight();\n containerHeight = selected.parent().outerHeight();\n if (selectedPosition > containerHeight) {\n diff = selectedPosition - containerHeight;\n return selected.parent().scrollTop(selected.parent().scrollTop() + diff);\n } else if (selected.position().top < 0) {\n return selected.parent().scrollTop(selected.parent().scrollTop() + selected.position().top);\n }\n };\n dispatch = function(el, code, scope) {\n var activeElement, next, prev;\n activeElement = el.find(\".selected\");\n if (code === 40) {\n if (!activeElement.length) {\n return select(el.find('li:first'));\n } else {\n next = activeElement.next('li');\n if (next.length) {\n activeElement.removeClass('selected');\n return select(next);\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return select(el.find('li:last'));\n } else {\n prev = activeElement.prev('li');\n if (prev.length) {\n activeElement.removeClass('selected');\n return select(prev);\n }\n }\n }\n };\n stop = function() {\n return $(document).off(\".tags-keyboard-navigation\");\n };\n link = function(scope, el) {\n stop();\n $(el).parent().on(\"keydown.tags-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) {\n event.preventDefault();\n return dispatch(el, code, scope);\n }\n };\n })(this));\n return scope.$on(\"$destroy\", stop);\n };\n return {\n link: link,\n templateUrl: \"components/tags/tag-dropdown/tag-dropdown.html\",\n scope: {\n onSelectTag: \"&\",\n colorArray: \"=\",\n tag: \"=\"\n }\n };\n };\n\n module.directive(\"tgTagsDropdown\", TagOptionDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineCommonController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonController = (function() {\n TagLineCommonController.$inject = [\"tgTagLineService\"];\n\n function TagLineCommonController(tagLineService) {\n this.tagLineService = tagLineService;\n this.disableColorSelection = false;\n this.newTag = {\n name: \"\",\n color: null\n };\n this.colorArray = [];\n this.addTag = false;\n }\n\n TagLineCommonController.prototype.checkPermissions = function() {\n return this.tagLineService.checkPermissions(this.project.my_permissions, this.permissions);\n };\n\n TagLineCommonController.prototype._createColorsArray = function(projectTagColors) {\n return this.colorArray = this.tagLineService.createColorsArray(projectTagColors);\n };\n\n TagLineCommonController.prototype.displayTagInput = function() {\n return this.addTag = true;\n };\n\n TagLineCommonController.prototype.addNewTag = function(name, color) {\n this.newTag.name = \"\";\n this.newTag.color = null;\n if (!name.length) {\n return;\n }\n if (this.disableColorSelection) {\n if (name.length) {\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n } else {\n if (this.project.tags_colors[name]) {\n color = this.project.tags_colors[name];\n }\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n };\n\n TagLineCommonController.prototype.selectColor = function(color) {\n return this.newTag.color = color;\n };\n\n return TagLineCommonController;\n\n })();\n\n module.controller(\"TagLineCommonCtrl\", TagLineCommonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineCommonDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n var unwatch;\n if (!_.isUndefined(attr.disableColorSelection)) {\n ctrl.disableColorSelection = true;\n }\n unwatch = scope.$watch(\"vm.project\", function(project) {\n if (!project || !Object.keys(project).length) {\n return;\n }\n unwatch();\n if (!ctrl.disableColorSelection) {\n return ctrl.colorArray = ctrl._createColorsArray(ctrl.project.tags_colors);\n }\n });\n return el.on(\"keydown\", \".tag-input\", function(event) {\n var tagName;\n if (event.keyCode === 27) {\n ctrl.addTag = false;\n ctrl.newTag.name = \"\";\n ctrl.newTag.color = \"\";\n event.stopPropagation();\n } else if (event.keyCode === 13) {\n event.preventDefault();\n if (el.find('.tags-dropdown .selected').length) {\n tagName = $('.tags-dropdown .selected .tags-dropdown-name').text();\n ctrl.addNewTag(tagName, null);\n } else {\n ctrl.addNewTag(ctrl.newTag.name, ctrl.newTag.color);\n }\n }\n return scope.$apply();\n });\n };\n return {\n link: link,\n scope: {\n permissions: \"@\",\n loadingAddTag: \"=\",\n loadingRemoveTag: \"=\",\n tags: \"=\",\n project: \"=\",\n onAddTag: \"&\",\n onDeleteTag: \"&\"\n },\n templateUrl: \"components/tags/tag-line-common/tag-line-common.html\",\n controller: \"TagLineCommonCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLineCommon\", TagLineCommonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineController = (function() {\n TagLineController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\"];\n\n function TagLineController(rootScope, confirm, modelTransform) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.loadingAddTag = false;\n }\n\n TagLineController.prototype.onDeleteTag = function(tag) {\n var onDeleteTagError, onDeleteTagSuccess, tagName, transform;\n this.loadingRemoveTag = tag[0];\n onDeleteTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.loadingRemoveTag = false;\n return item;\n };\n })(this);\n onDeleteTagError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.loadingRemoveTag = false;\n };\n })(this);\n tagName = trim(tag[0].toLowerCase());\n transform = this.modelTransform.save(function(item) {\n var itemtags;\n itemtags = _.clone(item.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === tagName;\n });\n item.tags = itemtags;\n return item;\n });\n return transform.then(onDeleteTagSuccess, onDeleteTagError);\n };\n\n TagLineController.prototype.onAddTag = function(tag, color) {\n var onAddTagError, onAddTagSuccess, transform;\n this.loadingAddTag = true;\n onAddTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.addTag = false;\n _this.loadingAddTag = false;\n return item;\n };\n })(this);\n onAddTagError = (function(_this) {\n return function() {\n _this.loadingAddTag = false;\n return _this.confirm.notify(\"error\");\n };\n })(this);\n transform = this.modelTransform.save((function(_this) {\n return function(item) {\n var itemtags, value;\n value = trim(tag.toLowerCase());\n itemtags = _.clone(item.tags);\n itemtags.push([tag, color]);\n item.tags = itemtags;\n return item;\n };\n })(this));\n return transform.then(onAddTagSuccess, onAddTagError);\n };\n\n return TagLineController;\n\n })();\n\n module.controller(\"TagLineCtrl\", TagLineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineDirective = function() {\n return {\n scope: {\n item: \"=\",\n permissions: \"@\",\n project: \"=\"\n },\n templateUrl: \"components/tags/tag-line-detail/tag-line-detail.html\",\n controller: \"TagLineCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLine\", TagLineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.service.coffee\n */\n\n(function() {\n var TagLineService, 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('taigaCommon');\n\n TagLineService = (function(superClass) {\n extend(TagLineService, superClass);\n\n TagLineService.$inject = [];\n\n function TagLineService() {}\n\n TagLineService.prototype.checkPermissions = function(myPermissions, projectPermissions) {\n return _.includes(myPermissions, projectPermissions);\n };\n\n TagLineService.prototype.createColorsArray = function(projectTagColors) {\n return _.map(projectTagColors, function(index, value) {\n return [value, index];\n });\n };\n\n return TagLineService;\n\n })(taiga.Service);\n\n module.service(\"tgTagLineService\", TagLineService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: tag-line.directive.coffee\n */\n\n(function() {\n var TagDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagDirective = function() {\n return {\n templateUrl: \"components/tags/tag/tag.html\",\n scope: {\n tag: \"<\",\n loadingRemoveTag: \"<\",\n onDeleteTag: \"&\",\n hasPermissions: \"@\"\n }\n };\n };\n\n module.directive(\"tgTag\", TagDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: taskboard-zoom.directive.coffee\n */\n\n(function() {\n var TaskboardZoomDirective;\n\n TaskboardZoomDirective = function(storage) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, zooms;\n scope.zoomIndex = storage.get(\"taskboard_zoom\") || 2;\n scope.levels = 4;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\", \"empty_extra_info\"], [\"related_tasks\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"taskboard_zoom\") !== zoomIndex) {\n storage.set(\"taskboard_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n return scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgTaskboardZoom\", [\"$tgStorage\", TaskboardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-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: tribe-button.directive.coffee\n */\n\n(function() {\n var TribeButtonDirective;\n\n TribeButtonDirective = function(configService, locationService) {\n var link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.url = (locationService.protocol()) + \"://\" + (locationService.host());\n if (locationService.protocol() === \"http\" && locationService.port() !== 80) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n } else if (locationService.protocol() === \"https\" && locationService.port() !== 443) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n }\n };\n return {\n scope: {\n usId: \"=\",\n projectSlug: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/tribe-button/tribe-button.html\",\n link: link\n };\n };\n\n TribeButtonDirective.$inject = [\"$tgConfig\", \"$tgLocation\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeButton\", TribeButtonDirective);\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: tribe-linked.directive.coffee\n */\n\n(function() {\n var TribeLinkedDirective;\n\n TribeLinkedDirective = function(configService) {\n var directive, link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.show = function() {\n return scope.vm.open = true;\n };\n return scope.vm.hide = function(event) {\n return scope.vm.open = false;\n };\n };\n directive = {\n templateUrl: \"components/tribe-button/tribe-linked.html\",\n scope: {\n gigTitle: \"=\",\n gigId: \"=\"\n },\n link: link\n };\n return directive;\n };\n\n TribeLinkedDirective.$inject = [\"$tgConfig\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeLinked\", TribeLinkedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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 epics: 'modify_epic'\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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentEditWysiwyg;\n\n CommentEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentEditWysiwyg\", [\"tgAttachmentsFullService\", CommentEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/comment-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentWysiwyg;\n\n CommentWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n $scope.editableDescription = false;\n $scope.saveComment = function(description, cb) {\n $scope.content = '';\n $scope.vm.type.comment = description;\n return $scope.vm.onAddComment({\n callback: cb\n });\n };\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.type.id, types[$scope.vm.type._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.onChange = function(markdown) {\n return $scope.vm.type.comment = markdown;\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.content = '';\n return $scope.$watch(\"vm.type\", function(value) {\n if (!value) {\n return;\n }\n return $scope.storageKey = \"comment-\" + value.project + \"-\" + value.id + \"-\" + value._name;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentWysiwyg\", [\"tgAttachmentsFullService\", CommentWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CustomFieldEditWysiwyg;\n\n CustomFieldEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCustomFieldEditWysiwyg\", [\"tgAttachmentsFullService\", CustomFieldEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/item-wysiwyg.directive.coffee\n */\n\n(function() {\n var ItemWysiwyg;\n\n ItemWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = function(description, cb) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.description = description;\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](cb);\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, $attrs.type, file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-\" + $attrs.type;\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n\\n
    \\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n \\n\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgItemWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$translate\", ItemWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg-code-hightlighter.service.coffee\n */\n\n(function() {\n var WysiwygCodeHightlighterService;\n\n WysiwygCodeHightlighterService = (function() {\n function WysiwygCodeHightlighterService() {\n Prism.plugins.customClass.prefix('prism-');\n Prism.plugins.customClass.map({});\n }\n\n WysiwygCodeHightlighterService.prototype.getLanguages = function() {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (_this.languages) {\n return resolve(_this.languages);\n } else if (_this.loadPromise) {\n return _this.loadPromise.then(function() {\n return resolve(_this.languages);\n });\n } else {\n return _this.loadPromise = $.getJSON(\"/\" + window._version + \"/prism/prism-languages.json\").then(function(_languages_) {\n _this.loadPromise = null;\n _this.languages = _.map(_languages_, function(it) {\n it.url = (\"/\" + window._version + \"/prism/\") + it.file;\n return it;\n });\n return resolve(_this.languages);\n });\n }\n };\n })(this));\n };\n\n WysiwygCodeHightlighterService.prototype.getLanguageInClassList = function(classes) {\n var lan;\n lan = _.find(this.languages, function(it) {\n return !!_.find(classes, function(className) {\n return 'language-' + it.name === className;\n });\n });\n if (lan) {\n return lan.name;\n } else {\n return null;\n }\n };\n\n WysiwygCodeHightlighterService.prototype.loadLanguage = function(lan) {\n return new Promise(function(resolve) {\n if (!Prism.languages[lan]) {\n return ljs.load(\"/\" + window._version + \"/prism/prism-\" + lan + \".min.js\", resolve);\n } else {\n return resolve();\n }\n });\n };\n\n WysiwygCodeHightlighterService.prototype.replaceCodeBrToNl = function(code) {\n return $(code).find('br').replaceWith('\\n');\n };\n\n WysiwygCodeHightlighterService.prototype.hightlightCode = function(code) {\n var lan;\n this.replaceCodeBrToNl(code);\n lan = this.getLanguageInClassList(code.classList);\n if (lan) {\n return this.loadLanguage(lan).then(function() {\n return Prism.highlightElement(code);\n });\n }\n };\n\n WysiwygCodeHightlighterService.prototype.addHightlighter = function(element) {\n var codes;\n codes = $(element).find('code');\n return codes.each((function(_this) {\n return function(index, code) {\n return _this.hightlightCode(code);\n };\n })(this));\n };\n\n return WysiwygCodeHightlighterService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygCodeHightlighterService\", WysiwygCodeHightlighterService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.directive.coffee\n */\n\n(function() {\n var WysiwygCodeLightbox;\n\n WysiwygCodeLightbox = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n scope.open = true;\n lightboxService.open(el, null, scope.onClose);\n return scope.$applyAsync(function() {\n var textarea;\n textarea = el[0].querySelector('textarea');\n if (textarea) {\n return textarea.select();\n }\n });\n } else if (!visible && el.hasClass('open')) {\n scope.open = false;\n return lightboxService.close(el);\n }\n });\n };\n return {\n scope: {\n languages: '<',\n codeLanguage: '<',\n code: '<',\n visible: '<',\n onClose: '&',\n onSave: '&'\n },\n link: link,\n templateUrl: \"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwygCodeLightbox\", [\"lightboxService\", WysiwygCodeLightbox]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg-mention.service.coffee\n */\n\n(function() {\n var WysiwygMentionService;\n\n WysiwygMentionService = (function() {\n WysiwygMentionService.$inject = [\"tgProjectService\", \"tgWysiwygService\", \"$tgNavUrls\", \"$tgResources\"];\n\n function WysiwygMentionService(projectService, wysiwygService, navurls, rs) {\n this.projectService = projectService;\n this.wysiwygService = wysiwygService;\n this.navurls = navurls;\n this.rs = rs;\n this.cancelablePromise = null;\n }\n\n WysiwygMentionService.prototype.searchEmoji = function(name, cb) {\n var filteredEmojis;\n filteredEmojis = this.wysiwygService.searchEmojiByName(name);\n filteredEmojis = filteredEmojis.slice(0, 10);\n return cb(filteredEmojis);\n };\n\n WysiwygMentionService.prototype.searchUser = function(term, cb) {\n var searchProps, users;\n searchProps = ['username', 'full_name', 'full_name_display'];\n users = this.projectService.project.toJS().members.filter((function(_this) {\n return function(user) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(user[prop]).indexOf(term) >= 0) {\n return true;\n } else if (user[prop].indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this));\n users = users.slice(0, 10).map((function(_this) {\n return function(it) {\n it.url = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: it.username\n });\n return it;\n };\n })(this));\n return cb(users);\n };\n\n WysiwygMentionService.prototype.searchItem = function(term) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var filter, searchProps, searchTypes, urls;\n term = taiga.slugify(term);\n searchTypes = ['issues', 'tasks', 'userstories'];\n urls = {\n issues: \"project-issues-detail\",\n tasks: \"project-tasks-detail\",\n userstories: \"project-userstories-detail\"\n };\n searchProps = ['ref', 'subject'];\n filter = function(item) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(item[prop]).indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n if (_this.cancelablePromise) {\n _this.cancelablePromise.abort();\n }\n _this.cancelablePromise = _this.rs.search[\"do\"](_this.projectService.project.get('id'), term);\n return _this.cancelablePromise.then(function(res) {\n var i, items, len, result, type;\n if (res.count < 1 || res.count === res.wikipages.length) {\n return resolve([]);\n } else {\n result = [];\n for (i = 0, len = searchTypes.length; i < len; i++) {\n type = searchTypes[i];\n if (res[type] && res[type].length > 0) {\n items = res[type].filter(filter);\n items = items.map(function(it) {\n it.url = _this.navurls.resolve(urls[type], {\n project: _this.projectService.project.get('slug'),\n ref: it.ref\n });\n return it;\n });\n result = result.concat(items);\n }\n }\n result = _.sortBy(result, [\"ref\"]);\n return resolve(result.slice(0, 10));\n }\n });\n };\n })(this));\n };\n\n WysiwygMentionService.prototype.search = function(mention) {\n return new Promise((function(_this) {\n return function(resolve) {\n if ('#'.indexOf(mention[0]) !== -1) {\n return _this.searchItem(mention.replace('#', '')).then(resolve);\n } else if ('@'.indexOf(mention[0]) !== -1) {\n return _this.searchUser(mention.replace('@', ''), resolve);\n } else if (':'.indexOf(mention[0]) !== -1) {\n return _this.searchEmoji(mention.replace(':', ''), resolve);\n }\n };\n })(this));\n };\n\n return WysiwygMentionService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygMentionService\", WysiwygMentionService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg.directive.coffee\n */\n\n(function() {\n var Medium, bindOnce, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n Medium = function($translate, $confirm, $storage, wysiwygService, animationFrame, tgLoader, wysiwygCodeHightlighterService, wysiwygMentionService, analytics, $location) {\n var AlignRightButton, CodeButton, CustomPasteHandler, addCodeBlockAndHightlight, getIcon, getRangeCodeBlock, isCodeBlockSelected, link, oldIsBlockContainer, refreshCodeBlocks, removeCodeBlockAndHightlight, removeSelections;\n removeSelections = function() {\n if (window.getSelection) {\n if (window.getSelection().empty) {\n return window.getSelection().empty();\n }\n } else if (window.getSelection().removeAllRanges) {\n return window.getSelection().removeAllRanges();\n } else if (document.selection) {\n return document.selection.empty();\n }\n };\n getRangeCodeBlock = function(range) {\n return $(range.endContainer).parentsUntil('.editor', 'code');\n };\n isCodeBlockSelected = function(range) {\n return !!getRangeCodeBlock(range).length;\n };\n removeCodeBlockAndHightlight = function(selection, mediumInstance) {\n var code, p, pre;\n if ($(selection).is('code')) {\n code = selection;\n } else {\n code = $(selection).closest('code')[0];\n }\n pre = code.parentNode;\n p = document.createElement('p');\n p.innerText = code.innerText;\n pre.parentNode.replaceChild(p, pre);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n addCodeBlockAndHightlight = function(range, mediumInstance) {\n var code, extract, pre, start;\n pre = document.createElement('pre');\n code = document.createElement('code');\n if (!range.startContainer.parentNode.nextSibling) {\n $('
    ').insertAfter(range.startContainer.parentNode);\n }\n start = range.endContainer.parentNode.nextSibling;\n extract = range.extractContents();\n code.appendChild(extract);\n pre.appendChild(code);\n start.parentNode.insertBefore(pre, start);\n refreshCodeBlocks(mediumInstance);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n refreshCodeBlocks = function(mediumInstance) {\n var i, j, len, len1, mainChildren, p, pre, preList, ref, results;\n if (!mediumInstance) {\n return;\n }\n ref = mediumInstance.elements[0].children;\n for (i = 0, len = ref.length; i < len; i++) {\n mainChildren = ref[i];\n if (mainChildren && mainChildren.tagName.toLowerCase() === 'p' && !mainChildren.innerHTML.trim().length) {\n mainChildren.parentNode.removeChild(mainChildren);\n }\n }\n preList = mediumInstance.elements[0].querySelectorAll('pre');\n results = [];\n for (j = 0, len1 = preList.length; j < len1; j++) {\n pre = preList[j];\n pre.setAttribute('contenteditable', false);\n pre.setAttribute('title', $translate.instant(\"COMMON.WYSIWYG.DB_CLICK\"));\n pre.addEventListener('mousedown', function(e) {\n return e.preventDefault();\n });\n if (pre.nextElementSibling && pre.nextElementSibling.nodeName.toLowerCase() === 'p' && !pre.nextElementSibling.children.length) {\n results.push(pre.nextElementSibling.appendChild(document.createElement('br')));\n } else if (!pre.nextElementSibling || ['p', 'ul', 'h1', 'h2', 'h3'].indexOf(pre.nextElementSibling.nodeName.toLowerCase()) === -1) {\n p = document.createElement('p');\n p.appendChild(document.createElement('br'));\n results.push(pre.parentNode.insertBefore(p, pre.nextSibling));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n AlignRightButton = MediumEditor.extensions.button.extend({\n name: 'rtl',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'rtl';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'RTL';\n this.button.title = 'RTL';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n handleClick: function(event) {\n var range;\n range = MediumEditor.selection.getSelectionRange(document);\n if (range.commonAncestorContainer.parentNode.style.textAlign === 'right') {\n return document.execCommand('justifyLeft', false);\n } else {\n return document.execCommand('justifyRight', false);\n }\n }\n });\n getIcon = function(icon) {\n return \"\\n \\n\";\n };\n CodeButton = MediumEditor.extensions.button.extend({\n name: 'code',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'code';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'Code';\n this.button.title = 'Code';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n tagNames: ['code'],\n handleClick: function(event) {\n var range, toolbar;\n range = MediumEditor.selection.getSelectionRange(self.document);\n if (isCodeBlockSelected(range, this.base)) {\n removeCodeBlockAndHightlight(range.endContainer, this.base);\n } else {\n addCodeBlockAndHightlight(range, this.base);\n removeSelections();\n }\n toolbar = this.base.getExtensionByName('toolbar');\n if (toolbar) {\n return toolbar.hideToolbar();\n }\n }\n });\n CustomPasteHandler = MediumEditor.extensions.paste.extend({\n doPaste: function(pastedHTML, pastedPlain, editable) {\n var html;\n html = MediumEditor.util.htmlEntities(pastedPlain);\n return MediumEditor.util.insertHTMLCommand(this.document, html);\n }\n });\n oldIsBlockContainer = MediumEditor.util.isBlockContainer;\n MediumEditor.util.isBlockContainer = function(element) {\n var tagName;\n if (!element) {\n return oldIsBlockContainer(element);\n }\n if (element.tagName) {\n tagName = element.tagName;\n } else {\n tagName = element.parentNode.tagName;\n }\n if (tagName.toLowerCase() === 'code') {\n return true;\n }\n return oldIsBlockContainer(element);\n };\n link = function($scope, $el, $attrs) {\n var cancelWithConfirmation, change, clean, codeBlockSelected, create, discardLocalStorage, editorMarkdown, editorMedium, getCurrentContent, isDraft, isEditOnly, isOutdated, localSave, mediumInstance, notPersist, replaceCodeBrToNl, saveEnd, setEditMode, setHtmlMedium, throttleChange, unwatch, updateMarkdownWithCurrentHtml, uploadEnd;\n mediumInstance = null;\n editorMedium = $el.find('.medium');\n editorMarkdown = $el.find('.markdown');\n codeBlockSelected = null;\n isEditOnly = !!$attrs.$attr.editonly;\n notPersist = !!$attrs.$attr.notPersist;\n $scope.required = !!$attrs.$attr.required;\n $scope.editMode = isEditOnly || false;\n $scope.mode = $storage.get('editor-mode', 'html');\n $scope.markdown = '';\n $scope.codeEditorVisible = false;\n $scope.codeLans = [];\n wysiwygCodeHightlighterService.getLanguages().then(function(codeLans) {\n return $scope.codeLans = codeLans;\n });\n setEditMode = function(editMode) {\n return $scope.editMode = editMode;\n };\n setHtmlMedium = function(markdown) {\n var html;\n html = wysiwygService.getHTML(markdown);\n editorMedium.html(html);\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n if ($scope.editMode) {\n return refreshCodeBlocks(mediumInstance);\n }\n };\n $scope.saveSnippet = function(lan, code) {\n var codePre;\n $scope.codeEditorVisible = false;\n codeBlockSelected.innerText = code;\n codePre = codeBlockSelected.parentNode;\n if (lan === 'remove-formating') {\n codeBlockSelected.className = '';\n codePre.className = '';\n removeCodeBlockAndHightlight(codeBlockSelected, mediumInstance);\n } else if (_.trim(code).length) {\n if (lan) {\n codeBlockSelected.className = 'language-' + lan;\n codePre.className = 'language-' + lan;\n } else {\n codeBlockSelected.className = '';\n codePre.className = '';\n }\n wysiwygCodeHightlighterService.hightlightCode(codeBlockSelected);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n } else {\n codeBlockSelected.parentNode.parentNode.removeChild(codeBlockSelected.parentNode);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n }\n throttleChange();\n return null;\n };\n $scope.setMode = function(mode) {\n $storage.set('editor-mode', mode);\n if (mode === 'markdown') {\n updateMarkdownWithCurrentHtml();\n } else {\n setHtmlMedium($scope.markdown);\n }\n $scope.mode = mode;\n return mediumInstance.trigger('editableBlur', {}, editorMedium[0]);\n };\n $scope.save = function(e) {\n if (e) {\n e.preventDefault();\n }\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n setHtmlMedium($scope.markdown);\n if ($scope.required && !$scope.markdown.length) {\n return;\n }\n $scope.saving = true;\n $scope.outdated = false;\n $scope.onSave({\n text: $scope.markdown,\n cb: saveEnd\n });\n };\n $scope.cancel = function(e) {\n if (e) {\n e.preventDefault();\n }\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n } else if ($scope.mode === 'html') {\n setHtmlMedium($scope.content || null);\n }\n $scope.markdown = $scope.content;\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n $scope.outdated = false;\n refreshCodeBlocks(mediumInstance);\n $scope.onCancel();\n };\n clean = function() {\n $scope.markdown = '';\n return editorMedium.html('');\n };\n saveEnd = function() {\n $scope.saving = false;\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n }\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n return analytics.trackEvent('develop', 'save wysiwyg', $scope.mode, 1);\n };\n uploadEnd = function(name, url) {\n if (taiga.isImage(name)) {\n return mediumInstance.pasteHTML(\"
    \");\n } else {\n name = $('
    ').text(name).html();\n return mediumInstance.pasteHTML(\"\" + name + \"
    \");\n }\n };\n isOutdated = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store && store.version && store.version !== $scope.version) {\n return true;\n }\n return false;\n };\n isDraft = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return true;\n }\n return false;\n };\n getCurrentContent = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return store.text;\n }\n return $scope.content;\n };\n discardLocalStorage = function() {\n return $storage.remove($scope.storageKey);\n };\n cancelWithConfirmation = function() {\n var message, title;\n if ($scope.content === $scope.markdown) {\n $scope.cancel();\n document.activeElement.blur();\n document.body.click();\n return null;\n }\n title = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE\");\n message = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE\");\n return $confirm.ask(title, null, message).then(function(askResponse) {\n $scope.cancel();\n return askResponse.finish();\n });\n };\n replaceCodeBrToNl = function() {\n var html;\n html = $('
    ').html(editorMedium.html());\n html.find('code br').replaceWith('\\n');\n return html.html();\n };\n updateMarkdownWithCurrentHtml = function() {\n var html;\n html = replaceCodeBrToNl();\n return $scope.markdown = wysiwygService.getMarkdown(html);\n };\n localSave = function(markdown) {\n var store;\n if ($scope.storageKey) {\n store = {};\n store.version = $scope.version || 0;\n store.text = markdown;\n return $storage.set($scope.storageKey, store);\n }\n };\n change = function() {\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n localSave($scope.markdown);\n return $scope.onChange({\n markdown: $scope.markdown\n });\n };\n throttleChange = _.throttle(change, 200);\n create = function(text, editMode) {\n var html;\n if (editMode == null) {\n editMode = false;\n }\n if (text.length) {\n html = wysiwygService.getHTML(text);\n editorMedium.html(html);\n }\n mediumInstance = new MediumEditor(editorMedium[0], {\n imageDragging: false,\n placeholder: {\n text: $scope.placeholder\n },\n toolbar: {\n buttons: [\n {\n name: 'bold',\n contentDefault: getIcon('editor-bold')\n }, {\n name: 'italic',\n contentDefault: getIcon('editor-italic')\n }, {\n name: 'strikethrough',\n contentDefault: getIcon('editor-cross-out')\n }, {\n name: 'anchor',\n contentDefault: getIcon('editor-link')\n }, {\n name: 'image',\n contentDefault: getIcon('editor-image')\n }, {\n name: 'orderedlist',\n contentDefault: getIcon('editor-list-n')\n }, {\n name: 'unorderedlist',\n contentDefault: getIcon('editor-list-o')\n }, {\n name: 'h1',\n contentDefault: getIcon('editor-h1')\n }, {\n name: 'h2',\n contentDefault: getIcon('editor-h2')\n }, {\n name: 'h3',\n contentDefault: getIcon('editor-h3')\n }, {\n name: 'quote',\n contentDefault: getIcon('editor-quote')\n }, {\n name: 'removeFormat',\n contentDefault: getIcon('editor-no-format')\n }, {\n name: 'rtl',\n contentDefault: getIcon('editor-rtl')\n }, {\n name: 'code',\n contentDefault: getIcon('editor-code')\n }\n ]\n },\n extensions: {\n paste: new CustomPasteHandler(),\n code: new CodeButton(),\n autolist: new AutoList(),\n alignright: new AlignRightButton(),\n mediumMention: new MentionExtension({\n getItems: function(mention, mentionCb) {\n return wysiwygMentionService.search(mention).then(mentionCb);\n }\n })\n }\n });\n $scope.changeMarkdown = throttleChange;\n mediumInstance.subscribe('editableInput', function(e) {\n return $scope.$applyAsync(throttleChange);\n });\n mediumInstance.subscribe(\"editableClick\", function(e) {\n var r;\n r = new RegExp('^(?:[a-z]+:)?//', 'i');\n if (e.target.href) {\n if (r.test(e.target.getAttribute('href')) || e.target.getAttribute('target') === '_blank') {\n e.stopPropagation();\n return window.open(e.target.href);\n } else {\n return $location.url(e.target.href);\n }\n }\n });\n mediumInstance.subscribe('editableDrop', function(event) {\n return $scope.onUploadFile({\n files: event.dataTransfer.files,\n cb: uploadEnd\n });\n });\n mediumInstance.subscribe('editableKeydown', function(e) {\n var code, mention;\n code = e.keyCode ? e.keyCode : e.which;\n mention = $('.medium-mention');\n if ((code === 40 || code === 38) && mention.length) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n if ($scope.editMode && code === 27) {\n e.stopPropagation();\n return $scope.$applyAsync(cancelWithConfirmation);\n } else if (code === 27) {\n return editorMedium.blur();\n }\n });\n setEditMode(editMode);\n return $scope.$applyAsync(function() {\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n return refreshCodeBlocks(mediumInstance);\n });\n };\n $(editorMedium[0]).on('mousedown', function(e) {\n if (e.target.href) {\n e.preventDefault();\n return e.stopPropagation();\n } else {\n return $scope.$applyAsync(function() {\n if (!$scope.editMode) {\n setEditMode(true);\n return refreshCodeBlocks(mediumInstance);\n }\n });\n }\n });\n $(editorMedium[0]).on('dblclick', 'pre', function(e) {\n return $scope.$applyAsync(function() {\n $scope.codeEditorVisible = true;\n codeBlockSelected = e.currentTarget.querySelector('code');\n $scope.currentCodeLanguage = wysiwygCodeHightlighterService.getLanguageInClassList(codeBlockSelected.classList);\n return $scope.code = codeBlockSelected.innerText;\n });\n });\n unwatch = $scope.$watch('content', function(content) {\n var unwatchLoader;\n if (!_.isUndefined(content)) {\n $scope.outdated = isOutdated();\n if (!mediumInstance && isDraft()) {\n setEditMode(true);\n }\n if (($scope.markdown.length || content.length) && $scope.markdown === content) {\n return;\n }\n content = getCurrentContent();\n $scope.markdown = content;\n if (mediumInstance) {\n mediumInstance.destroy();\n }\n if (tgLoader.open()) {\n unwatchLoader = tgLoader.onEnd(function() {\n create(content, $scope.editMode);\n return unwatchLoader();\n });\n } else {\n create(content, $scope.editMode);\n }\n return unwatch();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n if (mediumInstance) {\n if (editorMedium.length) {\n $(editorMedium[0]).off();\n }\n return mediumInstance.destroy();\n }\n });\n };\n return {\n templateUrl: \"common/components/wysiwyg-toolbar.html\",\n scope: {\n placeholder: '@',\n version: '<',\n storageKey: '<',\n content: '<',\n onCancel: '&',\n onSave: '&',\n onUploadFile: '&',\n onChange: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwyg\", [\"$translate\", \"$tgConfirm\", \"$tgStorage\", \"tgWysiwygService\", \"animationFrame\", \"tgLoader\", \"tgWysiwygCodeHightlighterService\", \"tgWysiwygMentionService\", \"$tgAnalytics\", \"$location\", Medium]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/wysiwyg/wysiwyg.service.coffee\n */\n\n(function() {\n var WysiwygService;\n\n WysiwygService = (function() {\n WysiwygService.$inject = [\"tgWysiwygCodeHightlighterService\", \"tgProjectService\", \"$tgNavUrls\", \"$tgEmojis\"];\n\n function WysiwygService(wysiwygCodeHightlighterService, projectService, navurls, emojis) {\n this.wysiwygCodeHightlighterService = wysiwygCodeHightlighterService;\n this.projectService = projectService;\n this.navurls = navurls;\n this.emojis = emojis;\n }\n\n WysiwygService.prototype.searchEmojiByName = function(name) {\n return this.emojis.searchByName(name);\n };\n\n WysiwygService.prototype.pipeLinks = function(text) {\n return text.replace(/\\[\\[(.*?)\\]\\]/g, function(match, p1, offset, str) {\n var link, linkParams, title;\n linkParams = p1.split('|');\n link = linkParams[0];\n title = linkParams[1] || linkParams[0];\n return '[' + title + '](' + link + ')';\n });\n };\n\n WysiwygService.prototype.replaceUrls = function(html) {\n var el, i, len, link, links;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/profile/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n } else if (link.getAttribute('href').indexOf('/t/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.searchWikiLinks = function(html) {\n var el, i, len, link, links, url;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/') === -1) {\n url = this.navurls.resolve('project-wiki-page', {\n project: this.projectService.project.get('slug'),\n slug: link.getAttribute('href')\n });\n link.setAttribute('href', url);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.removeTrailingListBr = function(text) {\n return text.replace(/
  • (.*?)
    <\\/li>/g, '
  • $1
  • ');\n };\n\n WysiwygService.prototype.getMarkdown = function(html) {\n var cleanIssueConverter, codeLanguageConverter, markdown;\n cleanIssueConverter = {\n filter: ['html', 'body', 'span', 'div'],\n replacement: function(innerHTML) {\n return innerHTML;\n }\n };\n codeLanguageConverter = {\n filter: (function(_this) {\n return function(node) {\n return node.nodeName === 'PRE' && node.firstChild && node.firstChild.nodeName === 'CODE';\n };\n })(this),\n replacement: (function(_this) {\n return function(content, node) {\n var lan;\n lan = _this.wysiwygCodeHightlighterService.getLanguageInClassList(node.firstChild.classList);\n if (!lan) {\n lan = '';\n }\n return '\\n\\n```' + lan + '\\n' + _.trim(node.firstChild.textContent) + '\\n```\\n\\n';\n };\n })(this)\n };\n html = html.replace(/ (<\\/.*>)/g, \"$1\");\n html = this.emojis.replaceImgsByEmojiName(html);\n html = this.replaceUrls(html);\n html = this.removeTrailingListBr(html);\n markdown = toMarkdown(html, {\n gfm: true,\n converters: [cleanIssueConverter, codeLanguageConverter]\n });\n return markdown;\n };\n\n WysiwygService.prototype.parseMentionMatches = function(text) {\n var m, matches, offset, prevChar, regex, serviceName, tagBuilder;\n serviceName = 'twitter';\n tagBuilder = this.tagBuilder;\n matches = [];\n regex = /@[^\\s]{1,50}[^.\\s]/g;\n m = regex.exec(text);\n while (m !== null) {\n offset = m.index;\n prevChar = text.charAt(offset - 1);\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n m.forEach(function(match, groupIndex) {\n return matches.push(new Autolinker.match.Mention({\n tagBuilder: tagBuilder,\n matchedText: match,\n offset: offset,\n serviceName: serviceName,\n mention: match.slice(1)\n }));\n });\n m = regex.exec(text);\n }\n return matches;\n };\n\n WysiwygService.prototype.autoLinkHTML = function(html) {\n var autolinker, matchRegexStr;\n matchRegexStr = String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter);\n if (matchRegexStr.indexOf('.') === -1) {\n matchRegexStr = '@[^\\s]{1,50}[^.\\s]';\n }\n autolinker = new Autolinker({\n mention: 'twitter',\n hashtag: 'twitter',\n replaceFn: (function(_this) {\n return function(match) {\n var profileUrl, url;\n if (match.getType() === 'mention') {\n profileUrl = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: match.getMention()\n });\n return '@' + match.getMention() + '';\n } else if (match.getType() === 'hashtag') {\n url = _this.navurls.resolve('project-detail-ref', {\n project: _this.projectService.project.get('slug'),\n ref: match.getHashtag()\n });\n return '#' + match.getHashtag() + '';\n }\n };\n })(this)\n });\n Autolinker.matcher.Mention.prototype.parseMatches = this.parseMentionMatches.bind(autolinker);\n return autolinker.link(html);\n };\n\n WysiwygService.prototype.getHTML = function(text) {\n var md, options, result;\n if (!text || !text.length) {\n return \"\";\n }\n options = {\n breaks: true\n };\n text = this.emojis.replaceEmojiNameByImgs(text);\n text = this.pipeLinks(text);\n md = window.markdownit({\n breaks: true\n });\n md.use(window.markdownitLazyHeaders);\n result = md.render(text);\n result = this.searchWikiLinks(result);\n result = this.autoLinkHTML(result);\n return result;\n };\n\n return WysiwygService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygService\", WysiwygService);\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 compile: function(element, attrs) {\n if (!attrs.q) {\n return attrs.q = '';\n }\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', '$tgLocation', '$tgAnalytics', 'tgAppMetaService', '$translate'];\n\n function DiscoverSearchController(routeParams, discoverProjectsService, route, location, analytics, appMetaService, translate) {\n var description, title;\n this.routeParams = routeParams;\n this.discoverProjectsService = discoverProjectsService;\n this.route = route;\n this.location = location;\n this.analytics = analytics;\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 this.analytics.trackPage(this.location.url(), \"Discover Search\");\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 this.analytics.trackPage(this.location.url(), \"Discover Search\");\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 this.analytics.trackPage(this.location.url(), \"Discover Search\");\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-2017 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 var _discoverParams;\n\n extend(DiscoverProjectsService, superClass);\n\n DiscoverProjectsService.$inject = [\"tgResources\", \"tgProjectsService\"];\n\n _discoverParams = {\n discover_mode: true\n };\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 var _params;\n _params = _.extend({}, _discoverParams, 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 var _params;\n _params = _.extend({}, _discoverParams, 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 = _.extend({}, _discoverParams);\n _params.is_featured = true;\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 var _params;\n _params = _.extend({}, _discoverParams, 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-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: create-epic.controller.coffee\n */\n\n(function() {\n var CreateEpicController, getRandomDefaultColor, taiga, trim;\n\n taiga = this.taiga;\n\n trim = taiga.trim;\n\n getRandomDefaultColor = taiga.getRandomDefaultColor;\n\n CreateEpicController = (function() {\n CreateEpicController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"$tgAnalytics\"];\n\n function CreateEpicController(confirm, projectService, epicsService, analytics) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.analytics = analytics;\n this.project = this.projectService.project.toJS();\n this.newEpic = {\n color: getRandomDefaultColor(),\n status: this.project.default_epic_status,\n tags: []\n };\n this.attachments = Immutable.List();\n this.loading = false;\n }\n\n CreateEpicController.prototype.createEpic = function() {\n if (!this.validateForm()) {\n return;\n }\n this.loading = true;\n return this.epicsService.createEpic(this.newEpic, this.attachments).then((function(_this) {\n return function(response) {\n _this.analytics.trackEvent(\"epic\", \"create\", \"create epic\", 1);\n _this.onCreateEpic();\n return _this.loading = false;\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n _this.setFormErrors(response.data);\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n CreateEpicController.prototype.selectColor = function(color) {\n return this.newEpic.color = color;\n };\n\n CreateEpicController.prototype.addTag = function(name, color) {\n name = trim(name.toLowerCase());\n if (!_.find(this.newEpic.tags, function(it) {\n return it[0] === name;\n })) {\n return this.newEpic.tags.push([name, color]);\n }\n };\n\n CreateEpicController.prototype.deleteTag = function(tag) {\n return _.remove(this.newEpic.tags, function(it) {\n return it[0] === tag[0];\n });\n };\n\n CreateEpicController.prototype.addAttachment = function(attachment) {\n return this.attachments.push(attachment);\n };\n\n return CreateEpicController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"CreateEpicCtrl\", CreateEpicController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: create-epic.directive.coffee\n */\n\n(function() {\n var CreateEpicDirective;\n\n CreateEpicDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var form;\n form = el.find(\"form\").checksley();\n ctrl.validateForm = (function(_this) {\n return function() {\n return form.validate();\n };\n })(this);\n return ctrl.setFormErrors = (function(_this) {\n return function(errors) {\n return form.setErrors(errors);\n };\n })(this);\n };\n return {\n link: link,\n templateUrl: \"epics/create-epic/create-epic.html\",\n controller: \"CreateEpicCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n onCreateEpic: '&'\n },\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgCreateEpic\", CreateEpicDirective);\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: epics-table.controller.coffee\n */\n\n(function() {\n var EpicRowController;\n\n EpicRowController = (function() {\n EpicRowController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\"];\n\n function EpicRowController(confirm, projectService, epicsService) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.displayUserStories = false;\n this.displayAssignedTo = false;\n this.displayStatusList = false;\n this.loadingStatus = false;\n this.project = this.projectService.project.toJS();\n this._calculateProgressBar();\n }\n\n EpicRowController.prototype._calculateProgressBar = function() {\n var progress, total;\n if (this.epic.getIn(['status_extra_info', 'is_closed']) === true) {\n return this.percentage = \"100%\";\n } else {\n progress = this.epic.getIn(['user_stories_counts', 'progress']);\n total = this.epic.getIn(['user_stories_counts', 'total']);\n if (total === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (progress * 100 / total) + \"%\";\n }\n }\n };\n\n EpicRowController.prototype.canEditEpics = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n EpicRowController.prototype.toggleUserStoryList = function() {\n if (!this.displayUserStories) {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userStories) {\n _this.epicStories = userStories;\n return _this.displayUserStories = true;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this));\n } else {\n return this.displayUserStories = false;\n }\n };\n\n EpicRowController.prototype.updateStatus = function(statusId) {\n this.displayStatusList = false;\n this.loadingStatus = true;\n return this.epicsService.updateEpicStatus(this.epic, statusId)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loadingStatus = false;\n };\n })(this));\n };\n\n EpicRowController.prototype.updateAssignedTo = function(member) {\n this.assignLoader = true;\n return this.epicsService.updateEpicAssignedTo(this.epic, (member != null ? member.id : void 0) || null)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.assignLoader = false;\n };\n })(this));\n };\n\n return EpicRowController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicRowCtrl\", EpicRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-table.directive.coffee\n */\n\n(function() {\n var EpicRowDirective;\n\n EpicRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epic-row/epic-row.html\",\n controller: \"EpicRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n epic: '=',\n column: '='\n }\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicRow\", EpicRowDirective);\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: epics.dashboard.controller.coffee\n */\n\n(function() {\n var EpicsDashboardController, taiga;\n\n taiga = this.taiga;\n\n EpicsDashboardController = (function() {\n EpicsDashboardController.$inject = [\"$routeParams\", \"tgErrorHandlingService\", \"tgLightboxFactory\", \"lightboxService\", \"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"tgAppMetaService\", \"$translate\"];\n\n function EpicsDashboardController(params, errorHandlingService, lightboxFactory, lightboxService, confirm, projectService, epicsService, appMetaService, translate) {\n this.params = params;\n this.errorHandlingService = errorHandlingService;\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.sectionName = \"EPICS.SECTION_NAME\";\n taiga.defineImmutableProperty(this, 'project', (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n EpicsDashboardController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\"),\n projectDescription: this.project.get(\"description\")\n };\n return {\n title: this.translate.instant(\"EPICS.PAGE_TITLE\", ctx),\n description: this.translate.instant(\"EPICS.PAGE_DESCRIPTION\", ctx)\n };\n };\n\n EpicsDashboardController.prototype.loadInitialData = function() {\n this.epicsService.clear();\n return this.projectService.setProjectBySlug(this.params.pslug).then((function(_this) {\n return function() {\n if (!_this.projectService.isEpicsDashboardEnabled()) {\n return _this.errorHandlingService.notFound();\n }\n if (!_this.projectService.hasPermission(\"view_epics\")) {\n return _this.errorHandlingService.permissionDenied();\n }\n return _this.epicsService.fetchEpics();\n };\n })(this));\n };\n\n EpicsDashboardController.prototype.canCreateEpics = function() {\n return this.projectService.hasPermission(\"add_epic\");\n };\n\n EpicsDashboardController.prototype.onCreateEpic = function() {\n var onCreateEpic;\n onCreateEpic = (function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.confirm.notify(\"success\");\n };\n })(this);\n return this.lightboxFactory.create('tg-create-epic', {\n \"class\": \"lightbox lightbox-create-epic open\",\n \"on-create-epic\": \"onCreateEpic()\"\n }, {\n \"onCreateEpic\": onCreateEpic.bind(this)\n });\n };\n\n return EpicsDashboardController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsDashboardCtrl\", EpicsDashboardController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-sortable.directive.coffee\n */\n\n(function() {\n var EpicsSortableDirective;\n\n EpicsSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgEpicsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div.epics-table-body-row');\n }\n });\n drake.on('dragend', function(item) {\n var epic, itemEl, newIndex;\n itemEl = $(item);\n epic = itemEl.scope().epic;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n epic: epic,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n EpicsSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgEpicsSortable\", EpicsSortableDirective);\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: epics-table.controller.coffee\n */\n\n(function() {\n var EpicsTableController, generateHash, taiga;\n\n taiga = this.taiga;\n\n generateHash = this.taiga.generateHash;\n\n EpicsTableController = (function() {\n EpicsTableController.$inject = [\"$tgConfirm\", \"tgEpicsService\", \"$timeout\", \"$tgStorage\", \"tgProjectService\"];\n\n function EpicsTableController(confirm, epicsService, timeout, storage, projectService) {\n this.confirm = confirm;\n this.epicsService = epicsService;\n this.timeout = timeout;\n this.storage = storage;\n this.projectService = projectService;\n this.hash = generateHash([this.projectService.project.get('id'), 'epics']);\n this.displayOptions = false;\n this.displayVotes = true;\n this.column = this.storage.get(this.hash, {\n votes: true,\n name: true,\n project: true,\n sprint: true,\n assigned: true,\n status: true,\n progress: true\n });\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'disabledEpicsPagination', (function(_this) {\n return function() {\n return _this.epicsService._disablePagination;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'loadingEpics', (function(_this) {\n return function() {\n return _this.epicsService._loadingEpics;\n };\n })(this));\n }\n\n EpicsTableController.prototype.toggleEpicTableOptions = function() {\n return this.displayOptions = !this.displayOptions;\n };\n\n EpicsTableController.prototype.reorderEpic = function(epic, newIndex) {\n if (epic.get('epics_order') === newIndex) {\n return null;\n }\n return this.epicsService.reorderEpic(epic, newIndex).then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n EpicsTableController.prototype.nextPage = function() {\n return this.epicsService.nextPage();\n };\n\n EpicsTableController.prototype.hoverEpicTableOption = function() {\n if (this.timer) {\n return this.timeout.cancel(this.timer);\n }\n };\n\n EpicsTableController.prototype.hideEpicTableOption = function() {\n return this.timer = this.timeout(((function(_this) {\n return function() {\n return _this.displayOptions = false;\n };\n })(this)), 400);\n };\n\n EpicsTableController.prototype.updateViewOptions = function() {\n return this.storage.set(this.hash, this.column);\n };\n\n return EpicsTableController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsTableCtrl\", EpicsTableController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-table.directive.coffee\n */\n\n(function() {\n var EpicsTableDirective;\n\n EpicsTableDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epics-table/epics-table.html\",\n controller: \"EpicsTableCtrl\",\n controllerAs: \"vm\",\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicsTable\", EpicsTableDirective);\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: epics-table.controller.coffee\n */\n\n(function() {\n var StoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n StoryRowController = (function() {\n StoryRowController.$inject = [];\n\n function StoryRowController() {\n this._calculateProgressBar();\n }\n\n StoryRowController.prototype._calculateProgressBar = function() {\n var totalTasks, totalTasksCompleted;\n if (this.story.get('is_closed') === true) {\n return this.percentage = \"100%\";\n } else {\n totalTasks = this.story.get('tasks').size;\n totalTasksCompleted = this.story.get('tasks').filter(function(it) {\n return it.get(\"is_closed\");\n }).size;\n if (totalTasks === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (totalTasksCompleted * 100 / totalTasks) + \"%\";\n }\n }\n };\n\n return StoryRowController;\n\n })();\n\n module.controller(\"StoryRowCtrl\", StoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics-table.directive.coffee\n */\n\n(function() {\n var StoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n StoryRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/story-row/story-row.html\",\n controller: \"StoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n story: '=',\n column: '='\n }\n };\n };\n\n module.directive(\"tgStoryRow\", StoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: epics.service.coffee\n */\n\n(function() {\n var EpicsService, taiga;\n\n taiga = this.taiga;\n\n EpicsService = (function() {\n EpicsService.$inject = ['tgProjectService', 'tgAttachmentsService', 'tgResources', 'tgXhrErrorService'];\n\n function EpicsService(projectService, attachmentsService, resources, xhrError) {\n this.projectService = projectService;\n this.attachmentsService = attachmentsService;\n this.resources = resources;\n this.xhrError = xhrError;\n this.clear();\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this._epics;\n };\n })(this));\n }\n\n EpicsService.prototype.clear = function() {\n this._loadingEpics = false;\n this._disablePagination = false;\n this._page = 1;\n return this._epics = Immutable.List();\n };\n\n EpicsService.prototype.fetchEpics = function(reset) {\n if (reset == null) {\n reset = false;\n }\n this._loadingEpics = true;\n this._disablePagination = true;\n return this.resources.epics.list(this.projectService.project.get('id'), this._page).then((function(_this) {\n return function(result) {\n if (reset) {\n _this.clear();\n _this._epics = result.list;\n } else {\n _this._epics = _this._epics.concat(result.list);\n }\n _this._loadingEpics = false;\n return _this._disablePagination = !result.headers('x-pagination-next');\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n EpicsService.prototype.nextPage = function() {\n this._page++;\n return this.fetchEpics();\n };\n\n EpicsService.prototype.listRelatedUserStories = function(epic) {\n return this.resources.userstories.listInEpic(epic.get('id'));\n };\n\n EpicsService.prototype.createEpic = function(epicData, attachments) {\n epicData.project = this.projectService.project.get('id');\n return this.resources.epics.post(epicData).then((function(_this) {\n return function(epic) {\n var promises;\n promises = _.map(attachments.toJS(), function(attachment) {\n return _this.attachmentsService.upload(attachment.file, epic.get('id'), epic.get('project'), 'epic');\n });\n return Promise.all(promises).then(_this.fetchEpics.bind(_this, true));\n };\n })(this));\n };\n\n EpicsService.prototype.reorderEpic = function(epic, newIndex) {\n var afterDestination, beforeDestination, data, newOrder, orderList, previous, previousWithTheSameOrder, setOrders, withoutMoved;\n orderList = {};\n this._epics.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order');\n });\n withoutMoved = this.epics.filter((function(_this) {\n return function(it) {\n return it.get('id') !== epic.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n afterDestination = withoutMoved.slice(newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epics_order') + 1;\n orderList[epic.get('id')] = newOrder;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epics_order') === previous.get('epics_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epics_order')];\n };\n })(this)).toJS());\n afterDestination.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order') + 1;\n });\n this._epics = this._epics.map(function(it) {\n return it.set('epics_order', orderList[it.get('id')]);\n });\n this._epics = this._epics.sortBy(function(it) {\n return it.get('epics_order');\n });\n data = {\n epics_order: newOrder,\n version: epic.get('version')\n };\n return this.resources.epics.reorder(epic.get('id'), data, setOrders).then((function(_this) {\n return function(newEpic) {\n return _this._epics = _this._epics.map(function(it) {\n if (it.get('id') === newEpic.get('id')) {\n return newEpic;\n }\n return it;\n });\n };\n })(this));\n };\n\n EpicsService.prototype.reorderRelatedUserstory = function(epic, epicUserstories, userstory, newIndex) {\n var beforeDestination, data, epicId, newOrder, previous, previousWithTheSameOrder, setOrders, userstoryId, withoutMoved;\n withoutMoved = epicUserstories.filter((function(_this) {\n return function(it) {\n return it.get('id') !== userstory.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epic_order') + 1;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epic_order') === previous.get('epic_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epic_order')];\n };\n })(this)).toJS());\n data = {\n order: newOrder\n };\n epicId = epic.get('id');\n userstoryId = userstory.get('id');\n return this.resources.epics.reorderRelatedUserstory(epicId, userstoryId, data, setOrders).then((function(_this) {\n return function() {\n return _this.listRelatedUserStories(epic);\n };\n })(this));\n };\n\n EpicsService.prototype.replaceEpic = function(epic) {\n return this._epics = this._epics.map(function(it) {\n if (it.get('id') === epic.get('id')) {\n return epic;\n }\n return it;\n });\n };\n\n EpicsService.prototype.updateEpicStatus = function(epic, statusId) {\n var data;\n data = {\n status: statusId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n EpicsService.prototype.updateEpicAssignedTo = function(epic, userId) {\n var data;\n data = {\n assigned_to: userId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n return EpicsService;\n\n })();\n\n angular.module('taigaEpics').service('tgEpicsService', EpicsService);\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: related-userstories.controller.coffee\n */\n\n(function() {\n var RelatedUserStoriesController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserStoriesController = (function() {\n RelatedUserStoriesController.$inject = [\"tgProjectService\", \"tgEpicsService\"];\n\n function RelatedUserStoriesController(projectService, epicsService) {\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.sectionName = \"Epics\";\n this.showCreateRelatedUserstoriesLightbox = false;\n }\n\n RelatedUserStoriesController.prototype.showRelatedUserStoriesSection = function() {\n var ref;\n return this.projectService.hasPermission(\"view_epics\") || ((ref = this.userstories) != null ? ref.length : void 0) > 0;\n };\n\n RelatedUserStoriesController.prototype.userCanSort = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n RelatedUserStoriesController.prototype.loadRelatedUserstories = function() {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n RelatedUserStoriesController.prototype.reorderRelatedUserstory = function(us, newIndex) {\n return this.epicsService.reorderRelatedUserstory(this.epic, this.userstories, us, newIndex).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n return RelatedUserStoriesController;\n\n })();\n\n module.controller(\"RelatedUserStoriesCtrl\", RelatedUserStoriesController);\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: related-userstory-create.controller.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoriesCreateController = (function() {\n RelatedUserstoriesCreateController.$inject = [\"tgCurrentUserService\", \"tgResources\", \"$tgConfirm\", \"$tgAnalytics\"];\n\n function RelatedUserstoriesCreateController(currentUserService, rs, confirm, analytics) {\n this.currentUserService = currentUserService;\n this.rs = rs;\n this.confirm = confirm;\n this.analytics = analytics;\n this.projects = null;\n this.projectUserstories = Immutable.List();\n this.loading = false;\n }\n\n RelatedUserstoriesCreateController.prototype.loadProjects = function() {\n if (this.projects === null) {\n return this.projects = this.currentUserService.projects.get(\"all\");\n }\n };\n\n RelatedUserstoriesCreateController.prototype.filterUss = function(selectedProjectId, filterText) {\n var promise;\n promise = this.rs.userstories.listInAllProjects({\n project: selectedProjectId,\n q: filterText\n }, true).then((function(_this) {\n return function(data) {\n var excludeIds, filteredData;\n excludeIds = _this.epicUserstories.map(function(us) {\n return us.get('id');\n });\n filteredData = data.filter(function(us) {\n return excludeIds.indexOf(us.get('id')) === -1;\n });\n return _this.projectUserstories = filteredData;\n };\n })(this));\n return promise;\n };\n\n RelatedUserstoriesCreateController.prototype.saveRelatedUserStory = function(selectedUserstoryId, onSavedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateExistingUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setExistingUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onSavedRelatedUserstory) {\n onSavedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.addRelatedUserstory(epicId, selectedUserstoryId).then(onSuccess, onError);\n };\n\n RelatedUserstoriesCreateController.prototype.bulkCreateRelatedUserStories = function(selectedProjectId, userstoriesText, onCreatedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateNewUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setNewUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onCreatedRelatedUserstory) {\n onCreatedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.bulkCreateRelatedUserStories(epicId, selectedProjectId, userstoriesText).then(onSuccess, onError);\n };\n\n return RelatedUserstoriesCreateController;\n\n })();\n\n module.controller(\"RelatedUserstoriesCreateCtrl\", RelatedUserstoriesCreateController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstory-create.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateDirective, debounceLeading, module;\n\n module = angular.module('taigaEpics');\n\n debounceLeading = this.taiga.debounceLeading;\n\n RelatedUserstoriesCreateDirective = function(lightboxService1) {\n var link;\n this.lightboxService = lightboxService1;\n link = function(scope, el, attrs, ctrl) {\n var existingUserstoryForm, newUserstoryForm;\n newUserstoryForm = el.find(\".new-user-story-form\").checksley();\n existingUserstoryForm = el.find(\".existing-user-story-form\").checksley();\n ctrl.validateNewUserstoryForm = (function(_this) {\n return function() {\n return newUserstoryForm.validate();\n };\n })(this);\n ctrl.setNewUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return newUserstoryForm.setErrors(errors);\n };\n })(this);\n ctrl.validateExistingUserstoryForm = (function(_this) {\n return function() {\n return existingUserstoryForm.validate();\n };\n })(this);\n ctrl.setExistingUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return existingUserstoryForm.setErrors(errors);\n };\n })(this);\n scope.showLightbox = function(selectedProjectId) {\n ctrl.loadProjects();\n return scope.selectProject(selectedProjectId).then((function(_this) {\n return function() {\n return lightboxService.open(el.find(\".lightbox-create-related-user-stories\"));\n };\n })(this));\n };\n scope.closeLightbox = function() {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n scope.relatedUserstoriesText = \"\";\n return lightboxService.close(el.find(\".lightbox-create-related-user-stories\"));\n };\n scope.$watch('vm.project', function(project) {\n if (project != null) {\n return scope.selectedProject = project.get('id');\n }\n });\n scope.selectProject = function(selectedProjectId) {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n return ctrl.filterUss(selectedProjectId, scope.searchUserstory);\n };\n return scope.onUpdateSearchUserstory = debounceLeading(300, function() {\n scope.selectedUserstory = null;\n return ctrl.filterUss(scope.selectedProject, scope.searchUserstory);\n });\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstories-create/related-userstories-create.html\",\n controller: \"RelatedUserstoriesCreateCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n showCreateRelatedUserstoriesLightbox: \"=\",\n project: \"=\",\n epic: \"=\",\n epicUserstories: \"=\",\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoriesCreateDirective.$inject = [\"lightboxService\"];\n\n module.directive(\"tgRelatedUserstoriesCreate\", RelatedUserstoriesCreateDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstories-sortable.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesSortableDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoriesSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgRelatedUserstoriesSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('tg-related-userstory-row');\n }\n });\n drake.on('dragend', function(item) {\n var itemEl, newIndex, us;\n itemEl = $(item);\n us = itemEl.scope().us;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n us: us,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n RelatedUserstoriesSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n module.directive(\"tgRelatedUserstoriesSortable\", RelatedUserstoriesSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstories.directive.coffee\n */\n\n(function() {\n var RelatedUserStoriesDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserStoriesDirective = function() {\n return {\n templateUrl: \"epics/related-userstories/related-userstories.html\",\n controller: \"RelatedUserStoriesCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstories: '=',\n project: '=',\n epic: '='\n }\n };\n };\n\n RelatedUserStoriesDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstories\", RelatedUserStoriesDirective);\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: reñated-userstory-row.controller.coffee\n */\n\n(function() {\n var RelatedUserstoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoryRowController = (function() {\n RelatedUserstoryRowController.$inject = [\"tgAvatarService\", \"$translate\", \"$tgConfirm\", \"tgResources\"];\n\n function RelatedUserstoryRowController(avatarService, translate, confirm, rs) {\n this.avatarService = avatarService;\n this.translate = translate;\n this.confirm = confirm;\n this.rs = rs;\n }\n\n RelatedUserstoryRowController.prototype.setAvatarData = function() {\n var member;\n member = this.userstory.get('assigned_to_extra_info');\n return this.avatar = this.avatarService.getAvatar(member);\n };\n\n RelatedUserstoryRowController.prototype.getAssignedToFullNameDisplay = function() {\n if (this.userstory.get('assigned_to')) {\n return this.userstory.getIn(['assigned_to_extra_info', 'full_name_display']);\n }\n return this.translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\");\n };\n\n RelatedUserstoryRowController.prototype.onDeleteRelatedUserstory = function() {\n var message, title;\n title = this.translate.instant('EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY');\n message = this.translate.instant('EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY', {\n subject: this.userstory.get('subject')\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var epicId, onError, onSuccess, userstoryId;\n onError = function() {\n message = _this.translate.instant('EPIC.ERROR_UNLINK_RELATED_USERSTORY', {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n _this.loadRelatedUserstories();\n return askResponse.finish();\n };\n epicId = _this.epic.get('id');\n userstoryId = _this.userstory.get('id');\n return _this.rs.epics.deleteRelatedUserstory(epicId, userstoryId).then(onSuccess, onError);\n };\n })(this));\n };\n\n return RelatedUserstoryRowController;\n\n })();\n\n module.controller(\"RelatedUserstoryRowCtrl\", RelatedUserstoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: related-userstory-row.directive.coffee\n */\n\n(function() {\n var RelatedUserstoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoryRowDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.setAvatarData();\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstory-row/related-userstory-row.html\",\n controller: \"RelatedUserstoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstory: '=',\n epic: '=',\n project: '=',\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoryRowDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstoryRow\", RelatedUserstoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-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: history.controller.coffee\n */\n\n(function() {\n var CommentController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentController = (function() {\n CommentController.$inject = [\"tgCurrentUserService\", \"tgCheckPermissionsService\", \"tgLightboxFactory\"];\n\n function CommentController(currentUserService, permissionService, lightboxFactory) {\n this.currentUserService = currentUserService;\n this.permissionService = permissionService;\n this.lightboxFactory = lightboxFactory;\n this.hiddenDeletedComment = true;\n }\n\n CommentController.prototype.showDeletedComment = function() {\n return this.hiddenDeletedComment = false;\n };\n\n CommentController.prototype.hideDeletedComment = function() {\n return this.hiddenDeletedComment = true;\n };\n\n CommentController.prototype.checkCancelComment = function(event) {\n if (event.keyCode === 27) {\n return this.onEditMode({\n commentId: this.comment.id\n });\n }\n };\n\n CommentController.prototype.canEditDeleteComment = function() {\n if (this.currentUserService.getUser()) {\n this.user = this.currentUserService.getUser();\n return this.user.get('id') === this.comment.user.pk || this.permissionService.check('modify_project');\n }\n };\n\n CommentController.prototype.saveComment = function(text, cb) {\n return this.onEditComment({\n commentId: this.comment.id,\n commentData: text,\n callback: cb\n });\n };\n\n CommentController.prototype.displayCommentHistory = function() {\n return this.lightboxFactory.create('tg-lb-display-historic', {\n \"class\": \"lightbox lightbox-display-historic\",\n \"comment\": \"comment\",\n \"name\": \"name\",\n \"object\": \"object\"\n }, {\n \"comment\": this.comment,\n \"name\": this.name,\n \"object\": this.object\n });\n };\n\n return CommentController;\n\n })();\n\n module.controller(\"CommentCtrl\", CommentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comment.directive.coffee\n */\n\n(function() {\n var CommentDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentDirective = function() {\n return {\n scope: {\n name: \"@\",\n object: \"@\",\n comment: \"<\",\n type: \"<\",\n loading: \"<\",\n editing: \"<\",\n deleting: \"<\",\n objectId: \"<\",\n editMode: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onEditComment: \"&\"\n },\n templateUrl: \"history/comments/comment.html\",\n bindToController: true,\n controller: 'CommentCtrl',\n controllerAs: \"vm\"\n };\n };\n\n module.directive(\"tgComment\", CommentDirective);\n\n}).call(this);\n\n\n/*\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comments.controller.coffee\n */\n\n(function() {\n var CommentsController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentsController = (function() {\n CommentsController.$inject = [];\n\n function CommentsController() {}\n\n CommentsController.prototype.initializePermissions = function() {\n return this.canAddCommentPermission = 'comment_' + this.name;\n };\n\n return CommentsController;\n\n })();\n\n module.controller(\"CommentsCtrl\", CommentsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comments.directive.coffee\n */\n\n(function() {\n var CommentsDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentsDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initializePermissions();\n };\n return {\n scope: {\n type: \"<\",\n name: \"@\",\n object: \"@\",\n comments: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onAddComment: \"&\",\n onEditComment: \"&\",\n editMode: \"<\",\n loading: \"<\",\n deleting: \"<\",\n editing: \"<\",\n projectId: \"=\"\n },\n templateUrl: \"history/comments/comments.html\",\n bindToController: true,\n controller: 'CommentsCtrl',\n controllerAs: \"vm\",\n link: link\n };\n };\n\n module.directive(\"tgComments\", CommentsDirective);\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: history.controller.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricController, module;\n\n module = angular.module(\"taigaHistory\");\n\n LightboxDisplayHistoricController = (function() {\n LightboxDisplayHistoricController.$inject = [\"$tgResources\"];\n\n function LightboxDisplayHistoricController(rs) {\n this.rs = rs;\n }\n\n LightboxDisplayHistoricController.prototype._loadHistoric = function() {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.object;\n activityId = this.comment.id;\n return this.rs.history.getCommentHistory(type, objectId, activityId).then((function(_this) {\n return function(data) {\n return _this.commentHistoryEntries = data;\n };\n })(this));\n };\n\n return LightboxDisplayHistoricController;\n\n })();\n\n module.controller(\"LightboxDisplayHistoricCtrl\", LightboxDisplayHistoricController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comment.directive.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricDirective;\n\n LightboxDisplayHistoricDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._loadHistoric();\n return lightboxService.open(el);\n };\n return {\n scope: {},\n bindToController: {\n name: '=',\n object: '=',\n comment: '='\n },\n templateUrl: \"history/history-lightbox/comment-history-lightbox.html\",\n controller: \"LightboxDisplayHistoricCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n LightboxDisplayHistoricDirective.$inject = [\"lightboxService\"];\n\n angular.module('taigaHistory').directive(\"tgLbDisplayHistoric\", LightboxDisplayHistoricDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: comment.directive.coffee\n */\n\n(function() {\n var HistoryEntryDirective;\n\n HistoryEntryDirective = function() {\n return {\n scope: {\n entry: \"<\"\n },\n templateUrl: \"history/history-lightbox/history-entry.html\"\n };\n };\n\n angular.module('taigaHistory').directive(\"tgHistoryEntry\", HistoryEntryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history-tabs.directive.coffee\n */\n\n(function() {\n var HistoryTabsDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryTabsDirective = function() {\n return {\n templateUrl: \"history/history-tabs/history-tabs.html\",\n scope: {\n showCommentTab: \"&\",\n showActivityTab: \"&\",\n onActiveComments: \"&\",\n onActiveActivities: \"&\",\n onOrderComments: \"&\",\n activeTab: \"<\",\n commentsNum: \"<\",\n activitiesNum: \"<\",\n onReverse: \"<\"\n }\n };\n };\n\n module.directive(\"tgHistoryTabs\", HistoryTabsDirective);\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: history.controller.coffee\n */\n\n(function() {\n var HistorySectionController, module;\n\n module = angular.module(\"taigaHistory\");\n\n HistorySectionController = (function() {\n HistorySectionController.$inject = [\"$tgResources\", \"$tgRepo\", \"$tgStorage\", \"tgProjectService\"];\n\n function HistorySectionController(rs, repo, storage, projectService) {\n this.rs = rs;\n this.repo = repo;\n this.storage = storage;\n this.projectService = projectService;\n this.editing = null;\n this.deleting = null;\n this.editMode = {};\n this.viewComments = true;\n this.reverse = this.storage.get(\"orderComments\");\n this._loadHistory();\n }\n\n HistorySectionController.prototype._loadHistory = function() {\n return this.rs.history.get(this.name, this.id).then((function(_this) {\n return function(history) {\n _this._getComments(history);\n return _this._getActivities(history);\n };\n })(this));\n };\n\n HistorySectionController.prototype._getComments = function(comments) {\n this.comments = _.filter(comments, function(item) {\n return item.comment !== \"\";\n });\n if (this.reverse) {\n this.comments - _.reverse(this.comments);\n }\n return this.commentsNum = this.comments.length;\n };\n\n HistorySectionController.prototype._getActivities = function(activities) {\n this.activities = _.filter(activities, function(item) {\n return Object.keys(item.values_diff).length > 0;\n });\n return this.activitiesNum = this.activities.length;\n };\n\n HistorySectionController.prototype.showHistorySection = function() {\n return this.showCommentTab() || this.showActivityTab();\n };\n\n HistorySectionController.prototype.showCommentTab = function() {\n return this.commentsNum > 0 || this.projectService.hasPermission(\"comment_\" + this.name);\n };\n\n HistorySectionController.prototype.showActivityTab = function() {\n return this.activitiesNum > 0;\n };\n\n HistorySectionController.prototype.toggleEditMode = function(commentId) {\n return this.editMode[commentId] = !this.editMode[commentId];\n };\n\n HistorySectionController.prototype.onActiveHistoryTab = function(active) {\n return this.viewComments = active;\n };\n\n HistorySectionController.prototype.deleteComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.deleting = commentId;\n return this.rs.history.deleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.deleting = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.editComment = function(commentId, comment) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.editComment(type, objectId, activityId, comment).then((function(_this) {\n return function() {\n _this._loadHistory();\n _this.toggleEditMode(commentId);\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.restoreDeletedComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.undeleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.addComment = function(cb) {\n return this.repo.save(this.type).then((function(_this) {\n return function() {\n _this._loadHistory();\n return cb();\n };\n })(this));\n };\n\n HistorySectionController.prototype.onOrderComments = function() {\n this.reverse = !this.reverse;\n this.storage.set(\"orderComments\", this.reverse);\n return this._loadHistory();\n };\n\n return HistorySectionController;\n\n })();\n\n module.controller(\"HistorySection\", HistorySectionController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history.directive.coffee\n */\n\n(function() {\n var HistorySectionDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistorySectionDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return scope.$on(\"object:updated\", function() {\n return ctrl._loadHistory(scope.type, scope.id);\n });\n };\n return {\n link: link,\n templateUrl: \"history/history.html\",\n controller: \"HistorySection\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: \"=\",\n name: \"@\",\n id: \"=\",\n projectId: \"=\"\n }\n };\n };\n\n HistorySectionDirective.$inject = [];\n\n module.directive(\"tgHistorySection\", HistorySectionDirective);\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: history.controller.coffee\n */\n\n(function() {\n var ActivitiesDiffController, module;\n\n module = angular.module(\"taigaHistory\");\n\n ActivitiesDiffController = (function() {\n ActivitiesDiffController.$inject = [];\n\n function ActivitiesDiffController() {}\n\n ActivitiesDiffController.prototype.diffTags = function() {\n if (this.type === 'tags') {\n this.diffRemoveTags = _.difference(this.diff[0], this.diff[1]).toString();\n return this.diffAddTags = _.difference(this.diff[1], this.diff[0]).toString();\n }\n };\n\n return ActivitiesDiffController;\n\n })();\n\n module.controller(\"ActivitiesDiffCtrl\", ActivitiesDiffController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history.directive.coffee\n */\n\n(function() {\n var HistoryDiffDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDiffDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.diffTags();\n };\n return {\n scope: {\n type: \"<\",\n diff: \"<\"\n },\n templateUrl: \"history/history/history-diff.html\",\n controller: \"ActivitiesDiffCtrl\",\n controllerAs: 'vm',\n bindToController: true,\n link: link\n };\n };\n\n module.directive(\"tgHistoryDiff\", HistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: history.directive.coffee\n */\n\n(function() {\n var HistoryDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n scope: {\n activities: \"<\"\n },\n templateUrl: \"history/history/history.html\",\n link: link\n };\n };\n\n module.directive(\"tgHistory\", HistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 scope.vm.type = scope.type;\n return scope.vm.getDutyType = function() {\n if (scope.vm.duty) {\n if (scope.vm.duty.get('_name') === \"epics\") {\n return $translate.instant(\"COMMON.EPIC\");\n }\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 \"type\": \"@\"\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-2017 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, _getValidDutiesAndAttachProjectInfo, 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('project', project);\n duty = duty.set(\"_name\", objType);\n return duty;\n };\n })(this);\n _getValidDutiesAndAttachProjectInfo = function(duties, dutyType) {\n duties = duties.filter(function(duty) {\n return projectsById.get(String(duty.get('project')));\n });\n duties = duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, dutyType);\n });\n return duties;\n };\n assignedTo = workInProgress.get(\"assignedTo\");\n if (assignedTo.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"epics\"), \"epics\");\n assignedTo = assignedTo.set(\"epics\", _duties);\n }\n if (assignedTo.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"userStories\"), \"userstories\");\n assignedTo = assignedTo.set(\"userStories\", _duties);\n }\n if (assignedTo.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"tasks\"), \"tasks\");\n assignedTo = assignedTo.set(\"tasks\", _duties);\n }\n if (assignedTo.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"issues\"), \"issues\");\n assignedTo = assignedTo.set(\"issues\", _duties);\n }\n watching = workInProgress.get(\"watching\");\n if (watching.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"epics\"), \"epics\");\n watching = watching.set(\"epics\", _duties);\n }\n if (watching.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"userStories\"), \"userstories\");\n watching = watching.set(\"userStories\", _duties);\n }\n if (watching.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"tasks\"), \"tasks\");\n watching = watching.set(\"tasks\", _duties);\n }\n if (watching.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"issues\"), \"issues\");\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 assignedEpicsPromise, assignedIssuesPromise, assignedTasksPromise, assignedTo, assignedUserStoriesPromise, params_epics, params_issues, params_tasks, params_uss, projectsById, projectsPromise, watching, watchingEpicsPromise, 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_epics = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_uss = {\n is_closed: false,\n assigned_to: userId\n };\n params_tasks = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_issues = {\n status__is_closed: false,\n assigned_to: userId\n };\n assignedEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return assignedTo = assignedTo.set(\"epics\", epics);\n });\n assignedUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return assignedTo = assignedTo.set(\"userStories\", userstories);\n });\n assignedTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return assignedTo = assignedTo.set(\"tasks\", tasks);\n });\n assignedIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return assignedTo = assignedTo.set(\"issues\", issues);\n });\n params_epics = {\n status__is_closed: false,\n watchers: userId\n };\n params_uss = {\n is_closed: false,\n watchers: userId\n };\n params_tasks = {\n status__is_closed: false,\n watchers: userId\n };\n params_issues = {\n status__is_closed: false,\n watchers: userId\n };\n watching = Immutable.Map();\n watchingEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return watching = watching.set(\"epics\", epics);\n });\n watchingUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return watching = watching.set(\"userStories\", userstories);\n });\n watchingTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return watching = watching.set(\"tasks\", tasks);\n });\n watchingIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return watching = watching.set(\"issues\", issues);\n });\n workInProgress = Immutable.Map();\n return Promise.all([projectsPromise, assignedEpicsPromise, watchingEpicsPromise, assignedUserStoriesPromise, watchingUserStoriesPromise, assignedTasksPromise, watchingTasksPromise, assignedIssuesPromise, 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-2017 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) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n return taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\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\"];\n\n angular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 epics, issues, tasks, userStories;\n epics = workInProgress.get(\"assignedTo\").get(\"epics\");\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).concat(epics);\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 epics, issues, tasks, userStories;\n epics = workInProgress.get(\"watching\").get(\"epics\");\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).concat(epics);\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-2017 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-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: add-members.controller.coffee\n */\n\n(function() {\n var InviteMembersFormController, taiga;\n\n taiga = this.taiga;\n\n InviteMembersFormController = (function() {\n InviteMembersFormController.$inject = [\"tgProjectService\", \"$tgResources\", \"lightboxService\", \"$tgConfirm\", \"$rootScope\"];\n\n function InviteMembersFormController(projectService, rs, lightboxService, confirm, rootScope) {\n this.projectService = projectService;\n this.rs = rs;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.rootScope = rootScope;\n this.project = this.projectService.project;\n this.roles = this.projectService.project.get('roles');\n this.rolesValues = {};\n this.loading = false;\n this.defaultMaxInvites = 4;\n }\n\n InviteMembersFormController.prototype._areRolesValidated = function() {\n return Object.defineProperty(this, 'areRolesValidated', {\n get: (function(_this) {\n return function() {\n var roleIds;\n roleIds = _.filter(Object.values(_this.rolesValues), function(it) {\n return it;\n });\n return roleIds.length === _this.contactsToInvite.size + _this.emailsToInvite.size;\n };\n })(this)\n });\n };\n\n InviteMembersFormController.prototype._checkLimitMemberships = function() {\n var pendingMembersCount;\n if (this.project.get('max_memberships') === null) {\n this.membersLimit = this.defaultMaxInvites;\n } else {\n pendingMembersCount = Math.max(this.project.get('max_memberships') - this.project.get('total_memberships'), 0);\n this.membersLimit = Math.min(pendingMembersCount, this.defaultMaxInvites);\n }\n return this.showWarningMessage = this.membersLimit < this.defaultMaxInvites;\n };\n\n InviteMembersFormController.prototype.sendInvites = function() {\n this.setInvitedContacts = [];\n _.forEach(this.rolesValues, (function(_this) {\n return function(key, value) {\n return _this.setInvitedContacts.push({\n 'role_id': key,\n 'username': value\n });\n };\n })(this));\n this.loading = true;\n return this.rs.memberships.bulkCreateMemberships(this.project.get('id'), this.setInvitedContacts, this.inviteContactsMessage).then((function(_this) {\n return function(response) {\n return _this.projectService.fetchProject().then(function() {\n _this.loading = false;\n _this.lightboxService.closeAll();\n _this.rootScope.$broadcast(\"membersform:new:success\");\n return _this.confirm.notify('success');\n });\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n return InviteMembersFormController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"InviteMembersFormCtrl\", InviteMembersFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersFormDirective;\n\n InviteMembersFormDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._areRolesValidated();\n return ctrl._checkLimitMemberships();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/invite-members-form/invite-members-form.html\",\n controller: \"InviteMembersFormCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contactsToInvite: '<',\n emailsToInvite: '=',\n onDisplayContactList: '&',\n onRemoveInvitedContact: '&',\n onRemoveInvitedEmail: '&',\n onSendInvites: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgInviteMembersForm\", InviteMembersFormDirective);\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: add-members.controller.coffee\n */\n\n(function() {\n var AddMembersController, taiga;\n\n taiga = this.taiga;\n\n AddMembersController = (function() {\n AddMembersController.$inject = [\"tgUserService\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function AddMembersController(userService, currentUserService, projectService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n this.contactsToInvite = Immutable.List();\n this.emailsToInvite = Immutable.List();\n this.displayContactList = false;\n }\n\n AddMembersController.prototype._getContacts = function() {\n var excludeProjectId, userId;\n userId = this.currentUserService.getUser().get(\"id\");\n excludeProjectId = this.projectService.project.get(\"id\");\n return this.userService.getContacts(userId, excludeProjectId).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n AddMembersController.prototype._filterContacts = function(invited) {\n return this.contacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.get('id');\n };\n })(this));\n };\n\n AddMembersController.prototype.inviteSuggested = function(contact) {\n this.contactsToInvite = this.contactsToInvite.push(contact);\n this._filterContacts(contact);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeContact = function(invited) {\n this.contactsToInvite = this.contactsToInvite.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.id;\n };\n })(this));\n invited = Immutable.fromJS(invited);\n this.contacts = this.contacts.push(invited);\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.inviteEmail = function(email) {\n var emailData;\n emailData = Immutable.Map({\n 'email': email\n });\n this.emailsToInvite = this.emailsToInvite.push(emailData);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeEmail = function(invited) {\n this.emailsToInvite = this.emailsToInvite.filter((function(_this) {\n return function(email) {\n return email.get('email') !== invited.email;\n };\n })(this));\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.testEmptyContacts = function() {\n if (this.emailsToInvite.size + this.contactsToInvite.size === 0) {\n return this.displayContactList = false;\n }\n };\n\n return AddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"AddMembersCtrl\", AddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: add-member.directive.coffee\n */\n\n(function() {\n var LightboxAddMembersDirective;\n\n LightboxAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n lightboxService.open(el);\n return ctrl._getContacts();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/lightbox-add-members.html\",\n controller: \"AddMembersCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgLbAddMembers\", [\"lightboxService\", LightboxAddMembersDirective]);\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: suggest-add-members.controller.coffee\n */\n\n(function() {\n var SuggestAddMembersController, taiga;\n\n taiga = this.taiga;\n\n SuggestAddMembersController = (function() {\n SuggestAddMembersController.$inject = [];\n\n function SuggestAddMembersController() {\n this.contactQuery = \"\";\n }\n\n SuggestAddMembersController.prototype.isEmail = function() {\n return taiga.isEmail(this.contactQuery);\n };\n\n SuggestAddMembersController.prototype.filterContacts = function() {\n return this.filteredContacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('full_name_display').toLowerCase().includes(_this.contactQuery.toLowerCase()) || contact.get('username').toLowerCase().includes(_this.contactQuery.toLowerCase());\n };\n })(this)).slice(0, 12);\n };\n\n SuggestAddMembersController.prototype.setInvited = function(contact) {\n return this.onInviteSuggested({\n 'contact': contact\n });\n };\n\n return SuggestAddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"SuggestAddMembersCtrl\", SuggestAddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: suggest-add-member.directive.coffee\n */\n\n(function() {\n var SuggestAddMembersDirective;\n\n SuggestAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch(\"vm.contacts\", (function(_this) {\n return function(contacts) {\n if (contacts) {\n return ctrl.filterContacts();\n }\n };\n })(this));\n };\n return {\n scope: {},\n templateUrl: \"invite-members/suggest-add-members/suggest-add-members.html\",\n controller: \"SuggestAddMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contacts: '=',\n onInviteSuggested: '&',\n onInviteEmail: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgSuggestAddMembers\", [\"lightboxService\", SuggestAddMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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, $rootScope) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\");\n scope.vm.supportUrl = configService.get(\"supportUrl\");\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 scope.vm.sendFeedback = function() {\n return feedbackService.sendFeedback();\n };\n return scope.vm.userSettingsPlugins = _.filter($rootScope.userSettingsPlugins, {\n userMenu: true\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\", \"$rootScope\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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, config) {\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 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.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\n scope.vm.supportUrl = config.get(\"supportUrl\");\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.$on(\"$routeChangeSuccess\", function() {\n if (locationService.path() === \"/\") {\n return scope.vm.active = true;\n } else {\n return scope.vm.active = false;\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\", \"$tgConfig\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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.enableFilterByEpics = 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.showEpicsOnly = function() {\n if (this.type !== \"epic\") {\n this.type = \"epic\";\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.tabName = 'likes';\n this.enableFilterByAll = false;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = 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.tabName = 'upvotes';\n this.enableFilterByAll = true;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = true;\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.tabName = 'watchers';\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-2017 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-2017 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://tree.taiga.io/support/admin/import-export-projects/\"\n }, {\n url: \"https://tree.taiga.io/support/admin/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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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-2017 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: blocked-project-explanation.directive.coffee\n */\n\n(function() {\n var BlockedProjectExplanationDirective;\n\n BlockedProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/project/blocked-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgBlockedProjectExplanation\", BlockedProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 ContactProjectButtonController;\n\n ContactProjectButtonController = (function() {\n ContactProjectButtonController.$inject = ['tgLightboxFactory'];\n\n function ContactProjectButtonController(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n ContactProjectButtonController.prototype.launchContactForm = function() {\n return this.lightboxFactory.create('tg-lb-contact-project', {\n \"class\": \"lightbox lightbox-contact-project e2e-lightbox-contact-project\",\n \"project\": \"project\"\n }, {\n \"project\": this.project\n });\n };\n\n return ContactProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectButtonCtrl\", ContactProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: contact-project-button.directive.coffee\n */\n\n(function() {\n var ContactProjectButtonDirective;\n\n ContactProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"ContactProjectButtonCtrl\",\n bindToController: {\n project: '=',\n layout: '@'\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/contact-project-button/contact-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgContactProjectButton\", ContactProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: lb-contact-team.controller.coffee\n */\n\n(function() {\n var ContactProjectLbController;\n\n ContactProjectLbController = (function() {\n ContactProjectLbController.$inject = [\"lightboxService\", \"tgResources\", \"$tgConfirm\"];\n\n function ContactProjectLbController(lightboxService, rs, confirm) {\n this.lightboxService = lightboxService;\n this.rs = rs;\n this.confirm = confirm;\n this.contact = {};\n }\n\n ContactProjectLbController.prototype.contactProject = function() {\n var message, project, promise;\n project = this.project.get('id');\n message = this.contact.message;\n promise = this.rs.projects.contactProject(project, message);\n this.sendingFeedback = true;\n return promise.then((function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.sendingFeedback = false;\n return _this.confirm.notify(\"success\");\n };\n })(this));\n };\n\n return ContactProjectLbController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectLbCtrl\", ContactProjectLbController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: lb-contact-team.directive.coffee\n */\n\n(function() {\n var ContactProjectLbDirective;\n\n ContactProjectLbDirective = function(lightboxService) {\n var link;\n this.inject = ['lightboxService'];\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n controller: \"ContactProjectLbCtrl\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/lb-contact-project/lb-contact-project.html\",\n link: link\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLbContactProject\", [\"lightboxService\", ContactProjectLbDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-2017 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-2017 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 drake, itemEl, scroll;\n itemEl = null;\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).hasClass('list-itemtype-project');\n }\n });\n drake.on('dragend', function(item) {\n var i, index, len, project, sortData, sorted_project_ids, value;\n itemEl = $(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 scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\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-2017 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-2017 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-2017 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-2017 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: asana-import-project-form.controller.coffee\n */\n\n(function() {\n var AsanaImportProjectFormController;\n\n AsanaImportProjectFormController = (function() {\n AsanaImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function AsanaImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Asana\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"scrum\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n AsanaImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n AsanaImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n AsanaImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n AsanaImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return AsanaImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportProjectFormCtrl', AsanaImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import-project-form.directive.coffee\n */\n\n(function() {\n var AsanaImportProjectFormDirective;\n\n AsanaImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/asana-import/asana-import-project-form/asana-import-project-form.html\",\n controller: \"AsanaImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n AsanaImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImportProjectForm\", AsanaImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import.controller.coffee\n */\n\n(function() {\n var AsanaImportController;\n\n AsanaImportController = (function() {\n AsanaImportController.$inject = ['tgAsanaImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function AsanaImportController(asanaImportService, confirm, translate, importProjectService) {\n this.asanaImportService = asanaImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-asana';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.asanaImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.asanaImportService.projectUsers;\n };\n })(this));\n }\n\n AsanaImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-asana';\n return this.asanaImportService.fetchProjects();\n };\n\n AsanaImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-asana';\n this.project = project;\n this.fetchingUsers = true;\n return this.asanaImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n AsanaImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-asana';\n };\n\n AsanaImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-asana';\n };\n\n AsanaImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.asanaImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n AsanaImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return AsanaImportController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportCtrl', AsanaImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import.directive.coffee\n */\n\n(function() {\n var AsanaImportDirective;\n\n AsanaImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/asana-import/asana-import.html\",\n controller: \"AsanaImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n AsanaImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImport\", AsanaImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: asana-import.service.coffee\n */\n\n(function() {\n var AsanaImportService,\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 AsanaImportService = (function(superClass) {\n extend(AsanaImportService, superClass);\n\n AsanaImportService.$inject = ['tgResources', '$location'];\n\n function AsanaImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n AsanaImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n AsanaImportService.prototype.fetchProjects = function() {\n return this.resources.asanaImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n AsanaImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.asanaImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n AsanaImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.asanaImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n AsanaImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.asanaImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n AsanaImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.asanaImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return AsanaImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgAsanaImportService\", AsanaImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: create-project-form.controller.coffee\n */\n\n(function() {\n var CreatetProjectFormController;\n\n CreatetProjectFormController = (function() {\n CreatetProjectFormController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$projectUrl\", \"$location\", \"$tgNavUrls\", \"$tgAnalytics\"];\n\n function CreatetProjectFormController(currentUserService, projectsService, projectUrl, location, navUrls, analytics) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.projectUrl = projectUrl;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.projectForm = {\n is_private: false\n };\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n if (this.type === 'scrum') {\n this.projectForm.creation_template = 1;\n } else {\n this.projectForm.creation_template = 2;\n }\n }\n\n CreatetProjectFormController.prototype.submit = function() {\n this.formSubmitLoading = true;\n return this.projectsService.create(this.projectForm).then((function(_this) {\n return function(project) {\n _this.analytics.trackEvent(\"project\", \"create\", \"project creation\", {\n slug: project.get('slug'),\n id: project.get('id')\n });\n return _this.location.url(_this.projectUrl.get(project));\n };\n })(this));\n };\n\n CreatetProjectFormController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n CreatetProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n CreatetProjectFormController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n return CreatetProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('CreateProjectFormCtrl', CreatetProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: create-project-form.directive.coffee\n */\n\n(function() {\n var CreateProjectFormDirective;\n\n CreateProjectFormDirective = function() {\n return {\n templateUrl: \"projects/create/create-project-form/create-project-form.html\",\n controller: \"CreateProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCreateProjectForm\", CreateProjectFormDirective);\n\n}).call(this);\n\n(function() {\n var createProjectMembersRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectMembersRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n limitMembersPrivateProject: '=',\n limitMembersPublicProject: '='\n },\n templateUrl: \"projects/create/create-project-members-restrictions/create-project-members-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectMembersRestrictions', [createProjectMembersRestrictionsDirective]);\n\n}).call(this);\n\n(function() {\n var createProjectRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n canCreatePrivateProjects: '=',\n canCreatePublicProjects: '='\n },\n templateUrl: \"projects/create/create-project-restrictions/create-project-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectRestrictions', [createProjectRestrictionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 CreateProjectController;\n\n CreateProjectController = (function() {\n CreateProjectController.$inject = [\"tgAppMetaService\", \"$translate\", \"tgProjectService\", \"$location\", \"$tgAuth\"];\n\n function CreateProjectController(appMetaService, translate, projectService, location, authService) {\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n this.authService.refresh();\n this.displayScrumDesc = false;\n this.displayKanbanDesc = false;\n }\n\n CreateProjectController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\n };\n\n CreateProjectController.prototype.displayHelp = function(type, $event) {\n $event.stopPropagation();\n $event.preventDefault();\n if (type === 'scrum') {\n this.displayScrumDesc = !this.displayScrumDesc;\n }\n if (type === 'kanban') {\n return this.displayKanbanDesc = !this.displayKanbanDesc;\n }\n };\n\n return CreateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"CreateProjectCtrl\", CreateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 DuplicateProjectController;\n\n DuplicateProjectController = (function() {\n DuplicateProjectController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$tgLocation\", \"$tgNavUrls\"];\n\n function DuplicateProjectController(currentUserService, projectsService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.location = location;\n this.navUrls = navUrls;\n this.user = this.currentUserService.getUser();\n this.members = Immutable.List();\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n this.projectForm = {\n is_private: false\n };\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n DuplicateProjectController.prototype.refreshReferenceProject = function(slug) {\n return this.projectsService.getProjectBySlug(slug).then((function(_this) {\n return function(project) {\n _this.referenceProject = project;\n _this.members = project.get('members').filter(function(it) {\n return it.get('id') !== _this.user.get('id');\n });\n _this.invitedMembers = _this.members.map(function(it) {\n return it.get('id');\n });\n return _this.checkUsersLimit();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.toggleInvitedMember = function(member) {\n if (this.invitedMembers.includes(member)) {\n this.invitedMembers = this.invitedMembers.filter(function(it) {\n return it !== member;\n });\n } else {\n this.invitedMembers = this.invitedMembers.push(member);\n }\n return this.checkUsersLimit();\n };\n\n DuplicateProjectController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.invitedMembers.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.invitedMembers.size + 1);\n };\n\n DuplicateProjectController.prototype.submit = function() {\n var data, projectId;\n projectId = this.referenceProject.get('id');\n data = this.projectForm;\n data.users = this.invitedMembers;\n this.formSubmitLoading = true;\n return this.projectsService.duplicate(projectId, data).then((function(_this) {\n return function(newProject) {\n _this.formSubmitLoading = false;\n _this.location.path(_this.navUrls.resolve(\"project\", {\n project: newProject.data.slug\n }));\n return _this.currentUserService.loadProjects();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid && this.limitMembersPrivateProject.valid;\n } else {\n return this.canCreatePublicProjects.valid && this.limitMembersPublicProject.valid;\n }\n };\n\n DuplicateProjectController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n DuplicateProjectController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n return DuplicateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"DuplicateProjectCtrl\", DuplicateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: duplicate-project.directive.coffee\n */\n\n(function() {\n var DuplicateProjectDirective;\n\n DuplicateProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/duplicate/duplicate-project.html\",\n controller: \"DuplicateProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n DuplicateProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgDuplicateProject\", DuplicateProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import-project-form.controller.coffee\n */\n\n(function() {\n var GithubImportProjectFormController;\n\n GithubImportProjectFormController = (function() {\n GithubImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function GithubImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Github\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"kanban\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n GithubImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n GithubImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n GithubImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n GithubImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return GithubImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportProjectFormCtrl', GithubImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import-project-form.directive.coffee\n */\n\n(function() {\n var GithubImportProjectFormDirective;\n\n GithubImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/github-import/github-import-project-form/github-import-project-form.html\",\n controller: \"GithubImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n GithubImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImportProjectForm\", GithubImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import.controller.coffee\n */\n\n(function() {\n var GithubImportController;\n\n GithubImportController = (function() {\n GithubImportController.$inject = ['tgGithubImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function GithubImportController(githubImportService, confirm, translate, importProjectService) {\n this.githubImportService = githubImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-github';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.githubImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.githubImportService.projectUsers;\n };\n })(this));\n }\n\n GithubImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-github';\n return this.githubImportService.fetchProjects();\n };\n\n GithubImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-github';\n this.project = project;\n this.fetchingUsers = true;\n return this.githubImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n GithubImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-github';\n };\n\n GithubImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-github';\n };\n\n GithubImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.githubImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n GithubImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return GithubImportController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportCtrl', GithubImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import.directive.coffee\n */\n\n(function() {\n var GithubImportDirective;\n\n GithubImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/github-import/github-import.html\",\n controller: \"GithubImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n GithubImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImport\", GithubImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: github-import.service.coffee\n */\n\n(function() {\n var GithubImportService,\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 GithubImportService = (function(superClass) {\n extend(GithubImportService, superClass);\n\n GithubImportService.$inject = ['tgResources'];\n\n function GithubImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n GithubImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n GithubImportService.prototype.fetchProjects = function() {\n return this.resources.githubImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n GithubImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.githubImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n GithubImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.githubImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n GithubImportService.prototype.getAuthUrl = function(callbackUri) {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.githubImporter.getAuthUrl(callbackUri).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n GithubImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.githubImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return GithubImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgGithubImportService\", GithubImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-members.controller.coffee\n */\n\n(function() {\n var ImportProjectMembersController;\n\n ImportProjectMembersController = (function() {\n ImportProjectMembersController.$inject = ['tgCurrentUserService', 'tgUserService'];\n\n function ImportProjectMembersController(currentUserService, userService) {\n this.currentUserService = currentUserService;\n this.userService = userService;\n this.selectImportUserLightbox = false;\n this.warningImportUsers = false;\n this.displayEmailSelector = true;\n this.cancelledUsers = Immutable.List();\n this.selectedUsers = Immutable.List();\n this.selectableUsers = Immutable.List();\n this.userContacts = Immutable.List();\n }\n\n ImportProjectMembersController.prototype.fetchUser = function() {\n this.currentUser = this.currentUserService.getUser();\n return this.userService.getContacts(this.currentUser.get('id')).then((function(_this) {\n return function(userContacts) {\n _this.userContacts = userContacts;\n return _this.refreshSelectableUsers();\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.searchUser = function(user) {\n this.selectImportUserLightbox = true;\n return this.searchingUser = user;\n };\n\n ImportProjectMembersController.prototype.beforeSubmitUsers = function() {\n if (this.selectedUsers.size !== this.members.size) {\n return this.warningImportUsers = true;\n } else {\n return this.submit();\n }\n };\n\n ImportProjectMembersController.prototype.confirmUser = function(externalUser, taigaUser) {\n var user;\n this.selectImportUserLightbox = false;\n user = Immutable.Map();\n user = user.set('user', externalUser);\n user = user.set('taigaUser', taigaUser);\n this.selectedUsers = this.selectedUsers.push(user);\n this.discardSuggestedUser(externalUser);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.unselectUser = function(user) {\n var index;\n index = this.selectedUsers.findIndex(function(it) {\n return it.getIn(['user', 'id']) === user.get('id');\n });\n this.selectedUsers = this.selectedUsers[\"delete\"](index);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.discardSuggestedUser = function(member) {\n return this.cancelledUsers = this.cancelledUsers.push(member.get('id'));\n };\n\n ImportProjectMembersController.prototype.getSelectedMember = function(member) {\n return this.selectedUsers.find(function(it) {\n return it.getIn(['user', 'id']) === member.get('id');\n });\n };\n\n ImportProjectMembersController.prototype.isMemberSelected = function(member) {\n return !!this.getSelectedMember(member);\n };\n\n ImportProjectMembersController.prototype.getUser = function(user) {\n var userSelected;\n userSelected = this.getSelectedMember(user);\n if (userSelected) {\n return userSelected.get('taigaUser');\n } else {\n return null;\n }\n };\n\n ImportProjectMembersController.prototype.submit = function() {\n var users;\n this.warningImportUsers = false;\n users = Immutable.Map();\n this.selectedUsers.map(function(it) {\n var id;\n id = '';\n if (_.isString(it.get('taigaUser'))) {\n id = it.get('taigaUser');\n } else {\n id = it.getIn(['taigaUser', 'id']);\n }\n return users = users.set(it.getIn(['user', 'id']), id);\n });\n return this.onSubmit({\n users: users\n });\n };\n\n ImportProjectMembersController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size + 1);\n };\n\n ImportProjectMembersController.prototype.showSuggestedMatch = function(member) {\n return member.get('user') && this.cancelledUsers.indexOf(member.get('id')) === -1 && !this.isMemberSelected(member);\n };\n\n ImportProjectMembersController.prototype.getDistinctSelectedTaigaUsers = function() {\n var ids, users;\n ids = [];\n users = this.selectedUsers.filter(function(it) {\n var id;\n id = it.getIn(['taigaUser', 'id']);\n if (ids.indexOf(id) === -1) {\n ids.push(id);\n return true;\n }\n return false;\n });\n return users.filter((function(_this) {\n return function(it) {\n return it.getIn(['taigaUser', 'id']) !== _this.currentUser.get('id');\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.refreshSelectableUsers = function() {\n var users;\n this.importMoreUsersDisabled = this.isImportMoreUsersDisabled();\n if (this.importMoreUsersDisabled) {\n users = this.getDistinctSelectedTaigaUsers();\n this.selectableUsers = users.map(function(it) {\n return it.get('taigaUser');\n });\n this.displayEmailSelector = false;\n } else {\n this.selectableUsers = this.userContacts;\n this.displayEmailSelector = true;\n }\n return this.selectableUsers = this.selectableUsers.push(this.currentUser);\n };\n\n ImportProjectMembersController.prototype.isImportMoreUsersDisabled = function() {\n var total, users;\n users = this.getDistinctSelectedTaigaUsers();\n total = users.size + 2;\n if (this.project.get('is_private')) {\n return !this.currentUserService.canAddMembersPrivateProject(total).valid;\n } else {\n return !this.currentUserService.canAddMembersPublicProject(total).valid;\n }\n };\n\n return ImportProjectMembersController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectMembersCtrl', ImportProjectMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-form.directive.coffee\n */\n\n(function() {\n var ImportProjectMembersDirective;\n\n ImportProjectMembersDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n ctrl.fetchUser();\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/import-project-members/import-project-members.html\",\n controller: \"ImportProjectMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSubmit: '&',\n platform: '@',\n logo: '@',\n onCancel: '&'\n }\n };\n };\n\n ImportProjectMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectMembers\", ImportProjectMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-selector.controller.coffee\n */\n\n(function() {\n var ImportProjectSelectorController;\n\n ImportProjectSelectorController = (function() {\n function ImportProjectSelectorController() {}\n\n ImportProjectSelectorController.prototype.selectProject = function(project) {\n return this.onSelectProject({\n project: Immutable.fromJS(project)\n });\n };\n\n return ImportProjectSelectorController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectSelectorCtrl', ImportProjectSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project-selector.directive.coffee\n */\n\n(function() {\n var ImportProjectSelectorDirective;\n\n ImportProjectSelectorDirective = function() {\n return {\n templateUrl: \"projects/create/import-project-selector/import-project-selector.html\",\n controller: \"ImportProjectSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n projects: '<',\n onCancel: '&',\n onSelectProject: '&',\n logo: '@',\n noProjectsMsg: '@',\n search: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectSelector\", ImportProjectSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.controller.coffee\n */\n\n(function() {\n var ImportTaigaController;\n\n ImportTaigaController = (function() {\n ImportTaigaController.$inject = ['$tgConfirm', '$tgResources', 'tgImportProjectService', '$translate', '$tgAnalytics'];\n\n function ImportTaigaController(confirm, rs, importProjectService, translate, analytics) {\n this.confirm = confirm;\n this.rs = rs;\n this.importProjectService = importProjectService;\n this.translate = translate;\n this.analytics = analytics;\n }\n\n ImportTaigaController.prototype.importTaiga = function(files) {\n var file, loader, promise;\n this.analytics.trackEvent(\"import\", \"taiga\", \"Start import from taiga\", 1);\n file = files[0];\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.rs.projects[\"import\"](file, loader.update);\n this.importProjectService.importPromise(promise)[\"finally\"]((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n return ImportTaigaController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportTaigaCtrl\", ImportTaigaController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-taiga.directive.coffee\n */\n\n(function() {\n var ImportTaigaDirective;\n\n ImportTaigaDirective = function() {\n return {\n templateUrl: \"projects/create/import-taiga/import-taiga.html\",\n controller: \"ImportTaigaCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportTaiga\", ImportTaigaDirective);\n\n}).call(this);\n\n(function() {\n var LbImportErrorDirective;\n\n LbImportErrorDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs) {\n lightboxService.open(el);\n return scope.close = function() {\n lightboxService.close(el);\n };\n };\n return {\n templateUrl: \"projects/create/import/import-project-error-lb.html\",\n link: link\n };\n };\n\n LbImportErrorDirective.$inject = [\"lightboxService\"];\n\n angular.module(\"taigaProjects\").directive(\"tgLbImportError\", LbImportErrorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.controller.coffee\n */\n\n(function() {\n var ImportProjectController;\n\n ImportProjectController = (function() {\n ImportProjectController.$inject = ['tgTrelloImportService', 'tgJiraImportService', 'tgGithubImportService', 'tgAsanaImportService', '$location', '$window', '$routeParams', '$tgNavUrls', '$tgConfig', '$tgConfirm', '$tgAnalytics'];\n\n function ImportProjectController(trelloService, jiraService, githubService, asanaService, location, window, routeParams, tgNavUrls, config, confirm, analytics) {\n this.trelloService = trelloService;\n this.jiraService = jiraService;\n this.githubService = githubService;\n this.asanaService = asanaService;\n this.location = location;\n this.window = window;\n this.routeParams = routeParams;\n this.tgNavUrls = tgNavUrls;\n this.config = config;\n this.confirm = confirm;\n this.analytics = analytics;\n }\n\n ImportProjectController.prototype.start = function() {\n var asanaOauthToken, githubOauthToken, jiraOauthToken, jiraOauthVerifier, locationSearch, trelloOauthToken;\n this.token = null;\n this.from = this.routeParams.platform;\n locationSearch = this.location.search();\n if (this.from) {\n this.analytics.trackEvent(\"import\", this.from, \"Start import from \" + this.from, 1);\n }\n if (this.from === \"asana\") {\n asanaOauthToken = locationSearch.code;\n if (locationSearch.code) {\n asanaOauthToken = locationSearch.code;\n return this.asanaService.authorize(asanaOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: encodeURIComponent(JSON.stringify(token))\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = JSON.parse(decodeURIComponent(locationSearch.token));\n this.asanaService.setToken(this.token);\n }\n }\n if (this.from === 'trello') {\n if (locationSearch.oauth_verifier) {\n trelloOauthToken = locationSearch.oauth_verifier;\n return this.trelloService.authorize(trelloOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.trelloService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"github\") {\n if (locationSearch.code) {\n githubOauthToken = locationSearch.code;\n return this.githubService.authorize(githubOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.githubService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"jira\") {\n jiraOauthToken = locationSearch.oauth_token;\n if (jiraOauthToken) {\n jiraOauthVerifier = locationSearch.oauth_verifier;\n return this.jiraService.authorize(jiraOauthVerifier).then(((function(_this) {\n return function(data) {\n return _this.location.search({\n token: data.token,\n url: data.url\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = locationSearch.token;\n return this.jiraService.setToken(locationSearch.token, locationSearch.url);\n }\n }\n };\n\n ImportProjectController.prototype.select = function(from) {\n var callbackUri;\n if (from === \"trello\") {\n return this.trelloService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"jira\") {\n return this.jiraService.getAuthUrl(this.jiraUrl).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this), (function(_this) {\n return function(err) {\n return _this.confirm.notify('error', err);\n };\n })(this));\n } else if (from === \"github\") {\n callbackUri = this.location.absUrl() + \"/github\";\n return this.githubService.getAuthUrl(callbackUri).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"asana\") {\n return this.asanaService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else {\n return this.from = from;\n }\n };\n\n ImportProjectController.prototype.unfoldOptions = function(options) {\n return this.unfoldedOptions = options;\n };\n\n ImportProjectController.prototype.isActiveImporter = function(importer) {\n if (this.config.get('importers').indexOf(importer) === -1) {\n return false;\n }\n return true;\n };\n\n ImportProjectController.prototype.cancelCurrentImport = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project-import'));\n };\n\n ImportProjectController.prototype.backToCreate = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project'));\n };\n\n return ImportProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportProjectCtrl\", ImportProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.directive.coffee\n */\n\n(function() {\n var ImportProjectDirective;\n\n ImportProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return ctrl.start();\n };\n return {\n link: link,\n templateUrl: \"projects/create/import/import-project.html\",\n controller: \"ImportProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancelImport: '&'\n }\n };\n };\n\n ImportProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProject\", ImportProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: import-project.service.coffee\n */\n\n(function() {\n var ImportProjectService,\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 ImportProjectService = (function(superClass) {\n extend(ImportProjectService, superClass);\n\n ImportProjectService.$inject = ['tgCurrentUserService', '$tgAuth', 'tgLightboxFactory', '$translate', '$tgConfirm', '$location', '$tgNavUrls'];\n\n function ImportProjectService(currentUserService, tgAuth, lightboxFactory, translate, confirm, location, tgNavUrls) {\n this.currentUserService = currentUserService;\n this.tgAuth = tgAuth;\n this.lightboxFactory = lightboxFactory;\n this.translate = translate;\n this.confirm = confirm;\n this.location = location;\n this.tgNavUrls = tgNavUrls;\n }\n\n ImportProjectService.prototype.importPromise = function(promise) {\n return promise.then(this.importSuccess.bind(this), this.importError.bind(this));\n };\n\n ImportProjectService.prototype.importSuccess = function(result) {\n var promise;\n promise = this.currentUserService.loadProjects();\n promise.then((function(_this) {\n return function() {\n var ctx, message, msg, title;\n if (result.status === 202) {\n title = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE');\n message = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE');\n _this.location.path(_this.tgNavUrls.resolve('home'));\n return _this.confirm.success(title, message);\n } else {\n ctx = {\n project: result.data.slug\n };\n _this.location.path(_this.tgNavUrls.resolve('project-admin-project-profile-details', ctx));\n msg = _this.translate.instant('PROJECT.IMPORT.SYNC_SUCCESS');\n return _this.confirm.notify('success', msg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.importError = function(result) {\n var promise;\n promise = this.tgAuth.refresh();\n promise.then((function(_this) {\n return function() {\n var errorMsg, ref, restrictionError;\n restrictionError = _this.getRestrictionError(result);\n if (restrictionError) {\n return _this.lightboxFactory.create('tg-lb-import-error', {\n \"class\": 'lightbox lightbox-import-error'\n }, restrictionError);\n } else {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {\n error_message: result.data._error_message\n });\n }\n return _this.confirm.notify(\"error\", errorMsg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.getRestrictionError = function(result) {\n var errorKey, maxMemberships, membersError, privateError, publicError, user;\n if (result.headers) {\n errorKey = '';\n user = this.currentUserService.getUser();\n maxMemberships = null;\n if (result.headers.isPrivate) {\n privateError = !this.currentUserService.canCreatePrivateProjects().valid;\n if (user.get('max_memberships_private_projects') !== null && result.headers.memberships >= user.get('max_memberships_private_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (privateError && membersError) {\n errorKey = 'private-space-members';\n maxMemberships = user.get('max_memberships_private_projects');\n } else if (privateError) {\n errorKey = 'private-space';\n } else if (membersError) {\n errorKey = 'private-members';\n maxMemberships = user.get('max_memberships_private_projects');\n }\n } else {\n publicError = !this.currentUserService.canCreatePublicProjects().valid;\n if (user.get('max_memberships_public_projects') !== null && result.headers.memberships >= user.get('max_memberships_public_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (publicError && membersError) {\n errorKey = 'public-space-members';\n maxMemberships = user.get('max_memberships_public_projects');\n } else if (publicError) {\n errorKey = 'public-space';\n } else if (membersError) {\n errorKey = 'public-members';\n maxMemberships = user.get('max_memberships_public_projects');\n }\n }\n if (!errorKey) {\n return false;\n }\n return {\n key: errorKey,\n values: {\n max_memberships: maxMemberships,\n members: result.headers.memberships\n }\n };\n } else {\n return false;\n }\n };\n\n return ImportProjectService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgImportProjectService\", ImportProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: invite-members.controller.coffee\n */\n\n(function() {\n var InviteMembersController;\n\n InviteMembersController = (function() {\n function InviteMembersController() {}\n\n InviteMembersController.$inject = [];\n\n InviteMembersController.prototype.isDisabled = function(id) {\n return this.invitedMembers.indexOf(id) === -1;\n };\n\n return InviteMembersController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"InviteMembersCtrl\", InviteMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersDirective;\n\n InviteMembersDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/invite-members/invite-members.html\",\n controller: \"InviteMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n invitedMembers: '<',\n members: '<',\n onToggleInvitedMember: '&'\n }\n };\n };\n\n InviteMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgInviteMembers\", InviteMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: single-member.directive.coffee\n */\n\n(function() {\n var SingleMemberDirective;\n\n SingleMemberDirective = function() {\n return {\n templateUrl: \"projects/create/invite-members/single-member/single-member.html\",\n scope: {\n disabled: \"<\",\n avatar: \"=\"\n }\n };\n };\n\n SingleMemberDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgSingleMember\", SingleMemberDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import-project-form.controller.coffee\n */\n\n(function() {\n var JiraImportProjectFormController;\n\n JiraImportProjectFormController = (function() {\n JiraImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function JiraImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (this.projectForm.importer_type === \"agile\") {\n this.projectForm.project_type = null;\n } else {\n this.projectForm.project_type = \"scrum\";\n }\n this.projectForm.create_subissues = true;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n JiraImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n JiraImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n JiraImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n JiraImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return JiraImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportProjectFormCtrl', JiraImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import-project-form.directive.coffee\n */\n\n(function() {\n var JiraImportProjectFormDirective;\n\n JiraImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/jira-import/jira-import-project-form/jira-import-project-form.html\",\n controller: \"JiraImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n JiraImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImportProjectForm\", JiraImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import.controller.coffee\n */\n\n(function() {\n var JiraImportController;\n\n JiraImportController = (function() {\n JiraImportController.$inject = ['tgJiraImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function JiraImportController(jiraImportService, confirm, translate, importProjectService) {\n this.jiraImportService = jiraImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-jira';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.jiraImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.jiraImportService.projectUsers;\n };\n })(this));\n }\n\n JiraImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-jira';\n return this.jiraImportService.fetchProjects();\n };\n\n JiraImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-jira';\n this.project = project;\n this.fetchingUsers = true;\n return this.jiraImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n JiraImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-jira';\n };\n\n JiraImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-jira';\n };\n\n JiraImportController.prototype.startImport = function(users) {\n var loader, projectType, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n projectType = this.project.get('project_type');\n if (projectType === \"issues\" && this.project.get('create_subissues')) {\n projectType = \"issues-with-subissues\";\n }\n promise = this.jiraImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), projectType, this.project.get('importer_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n JiraImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return JiraImportController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportCtrl', JiraImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import.directive.coffee\n */\n\n(function() {\n var JiraImportDirective;\n\n JiraImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/jira-import/jira-import.html\",\n controller: \"JiraImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n JiraImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImport\", JiraImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: jira-import.service.coffee\n */\n\n(function() {\n var JiraImportService,\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 JiraImportService = (function(superClass) {\n extend(JiraImportService, superClass);\n\n JiraImportService.$inject = ['tgResources', '$location'];\n\n function JiraImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n JiraImportService.prototype.setToken = function(token, url) {\n this.token = token;\n return this.url = url;\n };\n\n JiraImportService.prototype.fetchProjects = function() {\n return this.resources.jiraImporter.listProjects(this.url, this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n JiraImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.jiraImporter.listUsers(this.url, this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n JiraImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n return this.resources.jiraImporter.importProject(this.url, this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType);\n };\n\n JiraImportService.prototype.getAuthUrl = function(url) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.getAuthUrl(url).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n }, function(err) {\n return reject(err.data._error_message);\n });\n };\n })(this));\n };\n\n JiraImportService.prototype.authorize = function(oauth_verifier) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.authorize(oauth_verifier).then((function(response) {\n _this.token = response.data.token;\n _this.url = response.data.url;\n return resolve(response.data);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return JiraImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgJiraImportService\", JiraImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import-project-members.controller.coffee\n */\n\n(function() {\n var SelectImportUserLightboxCtrl;\n\n SelectImportUserLightboxCtrl = (function() {\n SelectImportUserLightboxCtrl.$inject = [];\n\n function SelectImportUserLightboxCtrl() {}\n\n SelectImportUserLightboxCtrl.prototype.start = function() {\n this.mode = 'search';\n return this.invalid = false;\n };\n\n SelectImportUserLightboxCtrl.prototype.assignUser = function() {\n return this.onSelectUser({\n user: this.user,\n taigaUser: this.userEmail\n });\n };\n\n SelectImportUserLightboxCtrl.prototype.selectUser = function(taigaUser) {\n return this.onSelectUser({\n user: this.user,\n taigaUser: Immutable.fromJS(taigaUser)\n });\n };\n\n return SelectImportUserLightboxCtrl;\n\n })();\n\n angular.module('taigaProjects').controller('SelectImportUserLightboxCtrl', SelectImportUserLightboxCtrl);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: select-import-user-lightbox.directive.coffee\n */\n\n(function() {\n var SelectImportUserLightboxDirective;\n\n SelectImportUserLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('vm.visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n ctrl.start();\n return lightboxService.open(el, null, scope.vm.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el).then(function() {\n ctrl.userEmail = '';\n return ctrl.usersSearch = '';\n });\n }\n });\n };\n return {\n controller: \"SelectImportUserLightboxCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n user: '<',\n visible: '<',\n onClose: '&',\n onSelectUser: '&',\n selectableUsers: '<',\n isPrivate: '<',\n limitMembersPrivateProject: '<',\n limitMembersPublicProject: '<',\n displayEmailSelector: '<'\n },\n templateUrl: 'projects/create/select-import-user-lightbox/select-import-user-lightbox.html',\n link: link\n };\n };\n\n SelectImportUserLightboxDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgSelectImportUserLightbox\", SelectImportUserLightboxDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import-project-form.controller.coffee\n */\n\n(function() {\n var TrelloImportProjectFormController;\n\n TrelloImportProjectFormController = (function() {\n TrelloImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function TrelloImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Trello\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n TrelloImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n TrelloImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n TrelloImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n TrelloImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return TrelloImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportProjectFormCtrl', TrelloImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import-project-form.directive.coffee\n */\n\n(function() {\n var TrelloImportProjectFormDirective;\n\n TrelloImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/trello-import/trello-import-project-form/trello-import-project-form.html\",\n controller: \"TrelloImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n TrelloImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImportProjectForm\", TrelloImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import.controller.coffee\n */\n\n(function() {\n var TrelloImportController;\n\n TrelloImportController = (function() {\n TrelloImportController.$inject = ['tgTrelloImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function TrelloImportController(trelloImportService, confirm, translate, importProjectService) {\n this.trelloImportService = trelloImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.trelloImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.trelloImportService.projectUsers;\n };\n })(this));\n }\n\n TrelloImportController.prototype.startProjectSelector = function() {\n return this.trelloImportService.fetchProjects().then((function(_this) {\n return function() {\n return _this.step = 'project-select-trello';\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-trello';\n this.project = project;\n this.fetchingUsers = true;\n return this.trelloImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-trello';\n };\n\n TrelloImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-trello';\n };\n\n TrelloImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.trelloImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n TrelloImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return TrelloImportController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportCtrl', TrelloImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import.directive.coffee\n */\n\n(function() {\n var TrelloImportDirective;\n\n TrelloImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/trello-import/trello-import.html\",\n controller: \"TrelloImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n TrelloImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImport\", TrelloImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: trello-import.service.coffee\n */\n\n(function() {\n var TrelloImportService,\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 TrelloImportService = (function(superClass) {\n extend(TrelloImportService, superClass);\n\n TrelloImportService.$inject = ['tgResources'];\n\n function TrelloImportService(resources) {\n this.resources = resources;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n TrelloImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n TrelloImportService.prototype.fetchProjects = function() {\n return this.resources.trelloImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n TrelloImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.trelloImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n TrelloImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n return this.resources.trelloImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate);\n };\n\n TrelloImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.trelloImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n TrelloImportService.prototype.authorize = function(verifyCode) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.trelloImporter.authorize(verifyCode).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return TrelloImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgTrelloImportService\", TrelloImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: warning-user-import.directive.coffee\n */\n\n(function() {\n var WarningUserImportDirective;\n\n WarningUserImportDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n return {\n link: function(scope, el, attr) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n return lightboxService.open(el, scope.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el);\n }\n });\n },\n templateUrl: \"projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html\",\n scope: {\n visible: '<',\n onClose: '&',\n onConfirm: '&'\n }\n };\n };\n\n WarningUserImportDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgWarningUserImportLightbox\", WarningUserImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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\"];\n\n function ProjectsListingController(currentUserService) {\n this.currentUserService = currentUserService;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\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-2017 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 this.routeParams = routeParams;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\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() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\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-2017 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\"];\n\n function ProjectsService(rs, projectUrl) {\n this.rs = rs;\n this.projectUrl = projectUrl;\n }\n\n ProjectsService.prototype.create = function(data) {\n return this.rs.projects.create(data);\n };\n\n ProjectsService.prototype.duplicate = function(projectId, data) {\n return this.rs.projects.duplicate(projectId, data);\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 url;\n url = this.projectUrl.get(project.toJS());\n project = project.set(\"url\", url);\n return project;\n };\n\n ProjectsService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.rs.projects.bulkUpdateOrder(sortData);\n };\n\n ProjectsService.prototype.transferValidateToken = function(projectId, token) {\n return this.rs.projects.transferValidateToken(projectId, token);\n };\n\n ProjectsService.prototype.transferAccept = function(projectId, token, reason) {\n return this.rs.projects.transferAccept(projectId, token, reason);\n };\n\n ProjectsService.prototype.transferReject = function(projectId, token, reason) {\n return this.rs.projects.transferReject(projectId, token, reason);\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-2017 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: cant-own-project-explanation.directive.coffee\n */\n\n(function() {\n var CantOwnProjectExplanationDirective;\n\n CantOwnProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/transfer/cant-own-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCantOwnProjectExplanation\", CantOwnProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProject, module;\n\n module = angular.module('taigaProjects');\n\n TransferProject = (function() {\n TransferProject.$inject = [\"$routeParams\", \"tgProjectsService\", \"$location\", \"$tgAuth\", \"tgCurrentUserService\", \"$tgNavUrls\", \"$translate\", \"$tgConfirm\", \"tgErrorHandlingService\"];\n\n function TransferProject(routeParams, projectService, location, authService, currentUserService, navUrls, translate, confirmService, errorHandlingService) {\n this.routeParams = routeParams;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n this.currentUserService = currentUserService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.confirmService = confirmService;\n this.errorHandlingService = errorHandlingService;\n }\n\n TransferProject.prototype.initialize = function() {\n this.projectId = this.project.get(\"id\");\n this.token = this.routeParams.token;\n this.showAddComment = false;\n return this._refreshUserData();\n };\n\n TransferProject.prototype._validateToken = function() {\n return this.projectService.transferValidateToken(this.projectId, this.token).then(null, (function(_this) {\n return function(data, status) {\n return _this.errorHandlingService.notfound();\n };\n })(this));\n };\n\n TransferProject.prototype._refreshUserData = function() {\n return this.authService.refresh().then((function(_this) {\n return function() {\n _this._validateToken();\n _this._setProjectData();\n return _this._checkOwnerData();\n };\n })(this));\n };\n\n TransferProject.prototype._setProjectData = function() {\n return this.canBeOwnedByUser = this.currentUserService.canOwnProject(this.project);\n };\n\n TransferProject.prototype._checkOwnerData = function() {\n var currentUser, maxMemberships;\n currentUser = this.currentUserService.getUser();\n if (this.project.get('is_private')) {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PRIVATE';\n this.maxProjects = currentUser.get('max_private_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_private_projects');\n maxMemberships = currentUser.get('max_memberships_private_projects');\n } else {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PUBLIC';\n this.maxProjects = currentUser.get('max_public_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_public_projects');\n maxMemberships = currentUser.get('max_memberships_public_projects');\n }\n return this.validNumberOfMemberships = maxMemberships === null || this.project.get('total_memberships') <= maxMemberships;\n };\n\n TransferProject.prototype.transferAccept = function(token, reason) {\n this.loadingAccept = true;\n return this.projectService.transferAccept(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"project-admin-project-profile-details\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingAccept = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.ACCEPTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.transferReject = function(token, reason) {\n this.loadingReject = true;\n return this.projectService.transferReject(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"home\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingReject = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.REJECTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.addComment = function() {\n return this.showAddComment = true;\n };\n\n TransferProject.prototype.hideComment = function() {\n this.showAddComment = false;\n return this.reason = '';\n };\n\n return TransferProject;\n\n })();\n\n module.controller(\"TransferProjectController\", TransferProject);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProjectDirective, module;\n\n module = angular.module('taigaProjects');\n\n TransferProjectDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initialize();\n };\n return {\n link: link,\n scope: {},\n bindToController: {\n project: \"=\"\n },\n templateUrl: \"projects/transfer/transfer-project.html\",\n controller: 'TransferProjectController',\n controllerAs: 'vm'\n };\n };\n\n module.directive('tgTransferProject', TransferProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n * Copyright (C) 2014-2017 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, from_comment) {\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, 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 data.append(\"from_comment\", from_comment);\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-2017 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: epics-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(\"epics\");\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 service.list = function(projectId, page) {\n var params, url;\n if (page == null) {\n page = 0;\n }\n url = urlsService.resolve(\"epics\");\n params = {\n project: projectId,\n page: page\n };\n return http.get(url, params).then(function(result) {\n return {\n list: Immutable.fromJS(result.data),\n headers: result.headers\n };\n });\n };\n service.patch = function(id, patch) {\n var url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n return http.patch(url, patch).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.post = function(params) {\n var url;\n url = urlsService.resolve(\"epics\");\n return http.post(url, params).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.reorder = function(id, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.addRelatedUserstory = function(epicId, userstoryId) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId);\n params = {\n user_story: userstoryId,\n epic: epicId\n };\n return http.post(url, params);\n };\n service.reorderRelatedUserstory = function(epicId, userstoryId, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options);\n };\n service.bulkCreateRelatedUserStories = function(epicId, projectId, bulk_userstories) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories-bulk-create\", epicId);\n params = {\n bulk_userstories: bulk_userstories,\n project_id: projectId\n };\n return http.post(url, params);\n };\n service.deleteRelatedUserstory = function(epicId, userstoryId) {\n var url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n return http[\"delete\"](url);\n };\n return function() {\n return {\n \"epics\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgEpicsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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/importers.coffee\n */\n\n(function() {\n var AsanaResource, GithubResource, JiraResource, TrelloResource, module, taiga;\n\n taiga = this.taiga;\n\n TrelloResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(url) {\n url = urlsService.resolve(\"importers-trello-auth-url\");\n return http.get(url);\n };\n service.authorize = function(verifyCode) {\n var url;\n url = urlsService.resolve(\"importers-trello-authorize\");\n return http.post(url, {\n code: verifyCode\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n var data, url;\n url = urlsService.resolve(\"importers-trello-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: \"kanban\"\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"trelloImporter\": service\n };\n };\n };\n\n TrelloResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n JiraResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(jira_url) {\n var url;\n url = urlsService.resolve(\"importers-jira-auth-url\") + \"?url=\" + jira_url;\n return http.get(url);\n };\n service.authorize = function(oauth_verifier) {\n var url;\n url = urlsService.resolve(\"importers-jira-authorize\");\n return http.post(url, {\n oauth_verifier: oauth_verifier\n });\n };\n service.listProjects = function(jira_url, token) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-projects\");\n return http.post(url, {\n url: jira_url,\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(jira_url, token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-users\");\n return http.post(url, {\n url: jira_url,\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(jira_url, token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n var data, projectTemplate, url;\n url = urlsService.resolve(\"importers-jira-import-project\");\n projectTemplate = \"kanban\";\n if (projectType !== \"kanban\") {\n projectTemplate = \"scrum\";\n }\n data = {\n url: jira_url,\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n project_type: projectType,\n importer_type: importerType,\n template: projectTemplate\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"jiraImporter\": service\n };\n };\n };\n\n JiraResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n GithubResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(callbackUri) {\n var url;\n url = urlsService.resolve(\"importers-github-auth-url\") + \"?uri=\" + callbackUri;\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-github-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-github-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-github-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-github-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"githubImporter\": service\n };\n };\n };\n\n GithubResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n AsanaResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function() {\n var url;\n url = urlsService.resolve(\"importers-asana-auth-url\");\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-asana-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-asana-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"asanaImporter\": service\n };\n };\n };\n\n AsanaResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTrelloImportResource\", TrelloResource);\n\n module.factory(\"tgJiraImportResource\", JiraResource);\n\n module.factory(\"tgGithubImportResource\", GithubResource);\n\n module.factory(\"tgAsanaImportResource\", AsanaResource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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.create = function(data) {\n var url;\n url = urlsService.resolve('projects');\n return http.post(url, JSON.stringify(data)).then((function(_this) {\n return function(result) {\n return Immutable.fromJS(result.data);\n };\n })(this));\n };\n service.duplicate = function(projectId, data) {\n var members, params, url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId + \"/duplicate\";\n members = data.users.map((function(_this) {\n return function(member) {\n return {\n \"id\": member\n };\n };\n })(this));\n params = {\n \"name\": data.name,\n \"description\": data.description,\n \"is_private\": data.is_private,\n \"users\": members\n };\n return http.post(url, params);\n };\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\": \"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 service.contactProject = function(projectId, message) {\n var params, url;\n params = {\n project: projectId,\n comment: message\n };\n url = urlsService.resolve(\"project-contact\");\n return http.post(url, params);\n };\n service.transferValidateToken = function(projectId, token) {\n var data, url;\n data = {\n token: token\n };\n url = urlsService.resolve(\"project-transfer-validate-token\", projectId);\n return http.post(url, data);\n };\n service.transferAccept = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-accept\", projectId);\n return http.post(url, data);\n };\n service.transferReject = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-reject\", projectId);\n return http.post(url, data);\n };\n service.transferRequest = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-transfer-request\", projectId);\n return http.post(url);\n };\n service.transferStart = function(projectId, userId, reason) {\n var data, url;\n data = {\n user: userId,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-start\", projectId);\n return http.post(url, data);\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-2017 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\", \"tgWikiHistory\", \"tgEpicsResource\", \"tgTrelloImportResource\", \"tgJiraImportResource\", \"tgGithubImportResource\", \"tgAsanaImportResource\"];\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.warn(\"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-2017 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-2017 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-2017 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, excludeProjectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"user-contacts\", userId);\n params = {};\n if (excludeProjectId != null) {\n params.exclude_project = excludeProjectId;\n }\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 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-2017 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, pagination) {\n var httpOptions, url;\n if (pagination == null) {\n pagination = false;\n }\n url = urlsService.resolve(\"userstories\");\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n }\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listAllInProject = function(projectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n project: projectId\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listInEpic = function(epicIid) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n epic: epicIid,\n order_by: 'epic_order',\n include_tasks: true\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-2017 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: wiki-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getWikiHistory = function(wikiId) {\n var httpOptions, url;\n url = urlsService.resolve(\"history/wiki\", wikiId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, null, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"wikiHistory\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgWikiHistory\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 = $(\"head 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 = $(\"head 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 = $(\"head 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 $(\"head 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, from_comment) {\n var promise;\n if (from_comment == null) {\n from_comment = false;\n }\n promise = this.rs.attachments.create(type, projectId, objId, file, from_comment);\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-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: avatar.service.coffee\n */\n\n(function() {\n var AvatarService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n AvatarService = (function() {\n function AvatarService(config) {\n var COLORS, IMAGES;\n this.config = config;\n IMAGES = [\"/\" + window._version + \"/images/user-avatars/user-avatar-01.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-02.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-03.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-04.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-05.png\"];\n COLORS = [\"rgba( 178, 176, 204, 1 )\", \"rgba( 183, 203, 131, 1 )\", \"rgba( 210, 198, 139, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 247, 154, 154, 1 )\"];\n this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n AvatarService.prototype.getDefault = function(key) {\n var idx, logo;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n AvatarService.prototype.getUnnamed = function() {\n return {\n url: \"/\" + window._version + \"/images/unnamed.png\"\n };\n };\n\n AvatarService.prototype.getAvatar = function(user, type) {\n var avatarParamName, gravatar, logo, logoUrl, photo, root;\n if (!user) {\n return this.getUnnamed();\n }\n avatarParamName = 'photo';\n if (type === 'avatarBig') {\n avatarParamName = 'big_photo';\n }\n photo = null;\n if (user instanceof Immutable.Map) {\n gravatar = user.get('gravatar_id');\n photo = user.get(avatarParamName);\n } else {\n gravatar = user.gravatar_id;\n photo = user[avatarParamName];\n }\n if (!gravatar) {\n return this.getUnnamed();\n }\n if (photo) {\n return {\n url: photo\n };\n } else if (location.host.indexOf('localhost') !== -1 || !this.config.get(\"gravatar\", true)) {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n return {\n url: root + logo.src,\n bg: logo.color\n };\n } else {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n logoUrl = encodeURIComponent(root + logo.src);\n return {\n url: 'https://www.gravatar.com/avatar/' + gravatar + \"?s=200&d=\" + logoUrl,\n bg: logo.color\n };\n }\n };\n\n return AvatarService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAvatarService\", [\"$tgConfig\", AvatarService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 CheckPermissionsService, taiga;\n\n taiga = this.taiga;\n\n CheckPermissionsService = (function() {\n CheckPermissionsService.$inject = [\"tgProjectService\"];\n\n function CheckPermissionsService(projectService) {\n this.projectService = projectService;\n }\n\n CheckPermissionsService.prototype.check = function(permission) {\n if (!this.projectService.project) {\n return false;\n }\n return this.projectService.project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n return CheckPermissionsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", CheckPermissionsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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 (!this.isAuthenticated()) {\n return;\n }\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 CurrentUserService.prototype.canCreatePrivateProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_private_projects') !== null && user.get('total_private_projects') >= user.get('max_private_projects')) {\n return {\n valid: false,\n reason: 'max_private_projects',\n type: 'private_project',\n current: user.get('total_private_projects'),\n max: user.get('max_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canCreatePublicProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_public_projects') !== null && user.get('total_public_projects') >= user.get('max_public_projects')) {\n return {\n valid: false,\n reason: 'max_public_projects',\n type: 'public_project',\n current: user.get('total_public_projects'),\n max: user.get('max_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPublicProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_public_projects') !== null && totalMembers > user.get('max_memberships_public_projects')) {\n return {\n valid: false,\n reason: 'max_members_public_projects',\n type: 'public_project',\n current: totalMembers,\n max: user.get('max_memberships_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPrivateProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_private_projects') !== null && totalMembers > user.get('max_memberships_private_projects')) {\n return {\n valid: false,\n reason: 'max_members_private_projects',\n type: 'private_project',\n current: totalMembers,\n max: user.get('max_memberships_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canOwnProject = function(project) {\n var membersResult, result, user;\n user = this.getUser();\n if (project.get('is_private')) {\n result = this.canCreatePrivateProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPrivateProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n } else {\n result = this.canCreatePublicProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPublicProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n }\n return {\n valid: true\n };\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-2017 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: error-handling.service.coffee\n */\n\n(function() {\n var ErrorHandlingService, taiga;\n\n taiga = this.taiga;\n\n ErrorHandlingService = (function() {\n ErrorHandlingService.$inject = [\"$rootScope\"];\n\n function ErrorHandlingService(rootScope) {\n this.rootScope = rootScope;\n }\n\n ErrorHandlingService.prototype.init = function() {\n return this.rootScope.errorHandling = {};\n };\n\n ErrorHandlingService.prototype.notfound = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.notfound = true;\n };\n\n ErrorHandlingService.prototype.error = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.error = true;\n };\n\n ErrorHandlingService.prototype.permissionDenied = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.permissionDenied = true;\n };\n\n ErrorHandlingService.prototype.block = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.blocked = true;\n };\n\n return ErrorHandlingService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgErrorHandlingService\", ErrorHandlingService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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-2017 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-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: project-logo.service.coffee\n */\n\n(function() {\n var ProjectLogoService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n ProjectLogoService = (function() {\n function ProjectLogoService() {\n var COLORS, IMAGES;\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 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 this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n ProjectLogoService.prototype.getDefaultProjectLogo = function(slug, id) {\n var idx, key, logo;\n key = slug + \"-\" + id;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n return ProjectLogoService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectLogoService\", ProjectLogoService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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\", \"tgUserActivityService\", \"$interval\"];\n\n function ProjectService(projectsService, xhrError, userActivityService, interval) {\n this.projectsService = projectsService;\n this.xhrError = xhrError;\n this.userActivityService = userActivityService;\n this.interval = interval;\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 if (!window.localStorage.e2e) {\n this.autoRefresh();\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.autoRefresh = function() {\n var intervalId;\n intervalId = this.interval((function(_this) {\n return function() {\n return _this.fetchProject();\n };\n })(this), 60 * 10 * 1000);\n this.userActivityService.onInactive((function(_this) {\n return function() {\n return _this.interval.cancel(intervalId);\n };\n })(this));\n return this.userActivityService.onActive((function(_this) {\n return function() {\n _this.fetchProject();\n return _this.autoRefresh();\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.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.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.fetchProject = function() {\n var pslug;\n if (!this.project) {\n return;\n }\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 ProjectService.prototype.hasPermission = function(permission) {\n return this._project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n ProjectService.prototype.isEpicsDashboardEnabled = function() {\n return this._project.get(\"is_epics_activated\");\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-2017 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-2017 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-activity.service.coffee\n */\n\n(function() {\n var UserActivityService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n UserActivityService = (function() {\n UserActivityService.$inject = ['$timeout'];\n\n UserActivityService.prototype.idleTimeout = 60 * 5 * 1000;\n\n function UserActivityService(timeout) {\n this.timeout = timeout;\n if (window.localStorage.e2e) {\n return null;\n }\n window.addEventListener('mousemove', this.resetTimer.bind(this), false);\n window.addEventListener('mousedown', this.resetTimer.bind(this), false);\n window.addEventListener('keypress', this.resetTimer.bind(this), false);\n window.addEventListener('mousewheel', this.resetTimer.bind(this), false);\n window.addEventListener('touchmove', this.resetTimer.bind(this), false);\n this.subscriptionsActive = [];\n this.subscriptionsInactive = [];\n this.isActive = true;\n this.startTimer();\n }\n\n UserActivityService.prototype.startTimer = function() {\n return this.timerId = this.timeout(this._fireInactive.bind(this), this.idleTimeout);\n };\n\n UserActivityService.prototype.resetTimer = function() {\n if (!this.isActive) {\n this._fireActive();\n }\n this.timeout.cancel(this.timerId);\n this.startTimer();\n return this.isActive = true;\n };\n\n UserActivityService.prototype.onActive = function(cb) {\n this.subscriptionsActive.push(cb);\n return this._unSubscriptionsActive.bind(this, cb);\n };\n\n UserActivityService.prototype.onInactive = function(cb) {\n this.subscriptionsInactive.push(cb);\n return this._unSubscriptionsInactive.bind(this, cb);\n };\n\n UserActivityService.prototype._fireActive = function() {\n return this.subscriptionsActive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._fireInactive = function() {\n this.isActive = false;\n return this.subscriptionsInactive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._unSubscriptionsActive = function(cb) {\n return this.subscriptionsActive = this.subscriptionsActive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n UserActivityService.prototype._unSubscriptionsInactive = function(cb) {\n return this.subscriptionsInactive = this.subscriptionsInactive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n return UserActivityService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgUserActivityService\", UserActivityService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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, excludeProjectId) {\n return this.rs.users.getContacts(userId, excludeProjectId);\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-2017 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\", \"tgErrorHandlingService\"];\n\n function xhrError(q, errorHandlingService) {\n this.q = q;\n this.errorHandlingService = errorHandlingService;\n }\n\n xhrError.prototype.notFound = function() {\n return this.errorHandlingService.notfound();\n };\n\n xhrError.prototype.permissionDenied = function() {\n return this.errorHandlingService.permissionDenied();\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-2017 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-2017 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 'color': 'COMMON.FIELDS.COLOR'\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 related_us_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"userstory\"]);\n url = \"project-userstories-detail:project=timeline.getIn(['data', 'userstory', 'project', 'slug']),ref=timeline.getIn(['data', 'userstory', 'ref'])\";\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n epic_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"epic\"]);\n url = \"project-epics-detail:project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['data', 'epic', 'ref'])\";\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 \"epic\": [\"project-epics-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"]\n };\n return url[event.obj][0] + url[event.obj][1];\n };\n\n UserTimelineItemTitle.prototype._getLink = function(url, text, title) {\n var span;\n title = title || text;\n span = $('').attr('ng-non-bindable', true).text(text);\n return $('').attr('tg-nav', url).attr('title', title).append(span).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-2017 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 event.obj === 'epic' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'relateduserstory' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_RELATED_USERSTORY_CREATED',\n translate_params: ['username', 'project_name', 'related_us_name', 'epic_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.getIn(['data', 'comment']) && event.obj === 'epic';\n },\n key: 'TIMELINE.NEW_COMMENT_EPIC',\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 === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.EPIC_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'color';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_COLOR',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_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-2017 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-2017 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-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 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-2017 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-2017 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', 'color'];\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\n/*\n * Copyright (C) 2014-2017 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: isolate-click.directive.coffee\n */\n\n(function() {\n var IsolateClickDirective;\n\n IsolateClickDirective = function() {\n var link;\n link = function(scope, el, attrs) {\n return el.on('click', (function(_this) {\n return function(e) {\n return e.stopPropagation();\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n angular.module(\"taigaUtils\").directive(\"tgIsolateClick\", IsolateClickDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDiffDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDiffDirective = function() {\n return {\n templateUrl: \"wiki/history/wiki-history-diff.html\",\n scope: {\n key: \"<\",\n diff: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryDiff\", WikiHistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryEntryDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryEntryDirective = function() {\n var link;\n link = function(scope, el, attr) {\n return scope.singleHistoryEntry = scope.historyEntry.toJS();\n };\n return {\n link: link,\n templateUrl: \"wiki/history/wiki-history-entry.html\",\n scope: {\n historyEntry: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryEntry\", WikiHistoryEntryDirective);\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: wiki-history.controller.coffee\n */\n\n(function() {\n var WikiHistoryController, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaWikiHistory\");\n\n WikiHistoryController = (function() {\n WikiHistoryController.$inject = [\"tgWikiHistoryService\"];\n\n function WikiHistoryController(wikiHistoryService) {\n this.wikiHistoryService = wikiHistoryService;\n taiga.defineImmutableProperty(this, 'historyEntries', (function(_this) {\n return function() {\n return _this.wikiHistoryService.historyEntries;\n };\n })(this));\n this.toggle = false;\n }\n\n WikiHistoryController.prototype.initializeHistoryEntries = function(wikiId) {\n if (wikiId) {\n this.wikiHistoryService.setWikiId(wikiId);\n }\n return this.wikiHistoryService.loadHistoryEntries();\n };\n\n return WikiHistoryController;\n\n })();\n\n module.controller(\"WikiHistoryCtrl\", WikiHistoryController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.wikiId', function(value) {\n return ctrl.initializeHistoryEntries(value);\n });\n };\n return {\n scope: {},\n bindToController: {\n wikiId: \"<\"\n },\n controller: \"WikiHistoryCtrl\",\n controllerAs: \"vm\",\n templateUrl: \"wiki/history/wiki-history.html\",\n link: link\n };\n };\n\n module.directive(\"tgWikiHistory\", WikiHistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 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: wiki-history.service.coffee\n */\n\n(function() {\n var WikiHistoryService, 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('taigaWikiHistory');\n\n WikiHistoryService = (function(superClass) {\n extend(WikiHistoryService, superClass);\n\n WikiHistoryService.$inject = [\"tgResources\", \"tgXhrErrorService\"];\n\n function WikiHistoryService(rs, xhrError) {\n this.rs = rs;\n this.xhrError = xhrError;\n this._wikiId = null;\n this._historyEntries = Immutable.List();\n taiga.defineImmutableProperty(this, \"wikiId\", (function(_this) {\n return function() {\n return _this._wikiId;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"historyEntries\", (function(_this) {\n return function() {\n return _this._historyEntries;\n };\n })(this));\n }\n\n WikiHistoryService.prototype.setWikiId = function(wikiId) {\n this._wikiId = wikiId;\n return this._historyEntries = Immutable.List();\n };\n\n WikiHistoryService.prototype.loadHistoryEntries = function() {\n if (!this._wikiId) {\n return;\n }\n return this.rs.wikiHistory.getWikiHistory(this._wikiId).then((function(_this) {\n return function(historyEntries) {\n if (historyEntries.size) {\n return _this._historyEntries = historyEntries.reverse();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n _;\n\n return WikiHistoryService;\n\n })(taiga.Service);\n\n module.service(\"tgWikiHistoryService\", WikiHistoryService);\n\n}).call(this);\n\n//# sourceMappingURL=maps/app.js.map\n"]} \ No newline at end of file diff --git a/dist/v-1520418874500/js/maps/libs.js.map b/dist/v-1521124836513/js/maps/libs.js.map similarity index 100% rename from dist/v-1520418874500/js/maps/libs.js.map rename to dist/v-1521124836513/js/maps/libs.js.map diff --git a/dist/v-1521124836513/js/templates.js b/dist/v-1521124836513/js/templates.js new file mode 100644 index 0000000..2a42461 --- /dev/null +++ b/dist/v-1521124836513/js/templates.js @@ -0,0 +1,16 @@ +angular.module("templates",[]).run(["$templateCache",function(t){t.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
    '),t.put("auth/forgot-password.html",'\n
    '),t.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
    '),t.put("auth/login-text.html",'\n'),t.put("auth/login.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
    '),t.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
    \n
    \n
    \n
    '),t.put("common/lightbox-feedback.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.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

    {{\'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 \n
    \n
    \n {{ ::us.total_voters }}\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

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

    \n \n
    \n
    {{\'BACKLOG.SPRINTS.EMPTY\' | translate}}\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
    {{ \'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
    '), +t.put("backlog/progress-bar.html",'\n
    \n
    \n
    '),t.put("backlog/sprint-header.html",'\n\n
    \n
    {{::estimatedDateRange}}
    \n
      \n
    • {{::closedPoints | number}}
    • \n
    • {{::totalPoints | number}}
    • \n
    \n
    '),t.put("backlog/us-role-points-popover.html",'\n'),t.put("admin/admin-membership-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
    '),t.put("admin/admin-memberships-row-checkbox.html",'\n
    \n \n
    \n
    '),t.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
    '),t.put("admin/admin-project-change-owner.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.CHANGE_OWNER\' | translate }}'),t.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
    \n
    \n
    \n
    \n
    '),t.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
    '),t.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
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.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
    {{ \'ADMIN.PROJECT_PROFILE.RECRUITING\' | translate }}\n \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.FEEDBACK\' | translate }}\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'), +t.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
    \n
    '),t.put("admin/admin-project-request-ownership.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP\' | translate }}'),t.put("admin/admin-project-restrictions.html",'\n
    {{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS_MEMBERS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS_MEMBERS\' | translate }}
    '),t.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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \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 \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    '),t.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 \n
    {{ value.name }}
    \n
    {{ value.value }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '), +t.put("admin/admin-project-values-priorities.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 \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-severities.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 \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-status.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
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \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
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n
    \n \n
    \n
    {{ value.wip_limit }}
    \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
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \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
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '), +t.put("admin/admin-project-values-tags.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
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    {{\'BACKLOG.EMPTY\' | 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
    '),t.put("admin/admin-project-values-types.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 \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-roles.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

    {{ role.name }}\n

    \n
    \n
    \n

    {{ role.name }}

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-third-parties-bitbucket.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
    '),t.put("admin/admin-third-parties-github.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
    '),t.put("admin/admin-third-parties-gitlab.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
    '), +t.put("admin/admin-third-parties-gogs.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
    '),t.put("admin/admin-third-parties-webhooks.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
    '),t.put("admin/lightbox-add-members.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
    '),t.put("admin/memberships-row-avatar.html",'\n
    <%- full_name %>\n
    \n
    <%- full_name %><% if (isOwner) { %>\n <% } %>\n
    \n
    <% if (pending) { %><%- pending %><% } %>
    \n
    \n
    '),t.put("admin/memberships-warning-message.html",'\n

    \n

    '),t.put("admin/no-more-memberships-explanation.html",'\n

    \n

    '),t.put("admin/project-csv.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n \n \n
    \n
    '),t.put("contrib/main.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("contrib/user-settings.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("custom-attributes/custom-attribute-value-edit.html",'\n
    \n
    \n <% if (description){ %><%- description %><% } %>\n
    \n
    <% if (type=="text") { %>\n <% } else if (type=="multiline") { %>\n <% } else if (type=="richtext") { %>\n <% } else if (type=="date") { %>\n <% } else if (type=="url") { %>\n <% } else { %>\n <% } %>\n
    <% if (type != "richtext") { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attribute-value.html",'\n
    \n
    <%- name %><% if (description){ %><%- description %><% } %>
    <% if (type=="url") { %>\n <% } else if (type=="richtext") { %>\n
    \n
    \n
    <% } else { %>\n
    <%- value %>
    <% } %>\n <% if (isEditable) { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attributes-values.html",'\n
    \n \n
    \n
    \n
    \n
    '),t.put("epic/epic-detail.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
    '),t.put("error/error.html",'\n
    \n
    TAIGA\n

    Taiga

    \n

    \n
    \n
    '),t.put("error/not-found.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("error/permission-denied.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("issue/iocaine-button.html",'\n
    \n \n \n
    '),t.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
    '),t.put("issue/issue-priority-button.html",'\n
    <%- priority.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-severity-button.html",'\n
    <%- severity.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-status-inline-edition-selection.html",'\n'),t.put("issue/issue-type-button.html",'\n
    <%- type.name %><% if(editable){ %>\n <% }%>\n \n
    '), +t.put("issue/issues-detail.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
    '),t.put("issue/issues.html",'\n'),t.put("issue/promote-issue-to-us-button.html",'\n '),t.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
    {{ usByStatus.get(s.id.toString()).size }}0
    \n
    \n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '),t.put("search/lightbox-search.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.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
    '),t.put("task/related-task-create-form.html",'\n'),t.put("task/related-task-row-edit.html",'\n
    \n \n
    \n\n\n
    \n
    \n
    \n \n
    \n
    '), +t.put("task/related-task-row.html",'\n\n
    <% if(perms.modify_task) { %>\n <% } %>\n <% if(perms.delete_task) { %>\n <% } %>\n
    \n\n
    \n
    \n
    <% if(perms.modify_task) { %>\n <% } %>\n
    \n
    '),t.put("task/task-detail.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
    '),t.put("taskboard/taskboard-user.html",'\n
    \n'),t.put("taskboard/taskboard.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
    {{rolePoint.points}}{{rolePoint.name}}
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n

    \n \n \n

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

    \n

    \n

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

    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '),t.put("team/leave-project.html",'\n {{ \'TEAM.ACTION_LEAVE_PROJECT\' | translate }}'),t.put("team/team-filter.html",'\n'),t.put("team/team-member-current-user.html",'\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("team/team-member-stats.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("team/team-members.html",'\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("team/team.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

    {{filtersRole.name || ("TEAM.SECTION_FILTER_ALL" | translate)}}

    \n
    \n
    \n
    '),t.put("us/us-client-requirement-button.html",'\n\n'),t.put("us/us-detail.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 {{\'US.TRIBE.PUBLISH_INFO\' | translate}}\n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("us/us-team-requirement-button.html",'\n\n'),t.put("user/cancel-account.html",'\n'), +t.put("user/change-email.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
    '),t.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
    '),t.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
    '),t.put("user/user-profile.html",'\n
    \n \n
    \n \n
    \n
    \n \n
    \n'),t.put("wiki/wiki-list.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{wikipage.editions}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("wiki/wiki-nav.html",'\n
    \n

    \n
    \n\n\n<% if (addWikiLinkPermission) { %>\n <% } %>\n'),t.put("wiki/wiki-summary.html",'\n
    \n
    <%- user.name %>
    \n
    <%- user.name %>
    \n
    \n
    <%- lastModifiedDate %>
    \n
    <%- totalEditions %>
    \n'),t.put("wiki/wiki.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n \n
    \n \n \n
    \n
    '),t.put("common/components/add-button.html",'\n '),t.put("common/components/assigned-to.html",'\n
    <%- fullName %><% if (isIocaine) { %>\n
    \n \n
    <% }; %>\n
    \n
    <% if (isUnassigned) { %>\n
    {{ "COMMON.ASSIGNED_TO.NOT_ASSIGNED" | translate }}
    <% } else { %>\n
    {{ "COMMON.FIELDS.ASSIGNED_TO" | translate }}
    <% }; %>\n
    <% if (!isEditable && fullNameVisible) { %><%- fullName %><% }; %>\n <% if (isEditable) { %>\n <% if (fullNameVisible) { %>\n <%- fullName %>\n <% }; %>\n <% if (!isUnassigned) { %>\n <% }; %><% }; %>\n <% if (isEditable && isUnassigned) { %> {{ "COMMON.ASSIGNED_TO.SELF" | translate }}<% }; %>\n
    <% if (isEditable && !isUnassigned) { %>\n <% } %>\n
    '),t.put("common/components/block-button.html",'\n \n '),t.put("common/components/created-by.html",'\n
    \n
    {{date}}
    \n
    \n
    {{owner.full_name_display}}
    '),t.put("common/components/delete-button.html",'\n '),t.put("common/components/editable-description-msg-edit-mode.html",'\n

    '),t.put("common/components/editable-description-msg-read-mode.html",'\n

    '),t.put("common/components/editable-subject.html",'\n
    {{ item.subject }}\n \n
    \n
    \n \n \n
    '),t.put("common/components/kanban-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/level.html",'\n
    '),t.put("common/components/list-item-assigned-to-avatar.html",'\n
    <%- name %><%- name %>
    '),t.put("common/components/main-title.html",'{{ projectName }}{{ sectionName | translate }}'),t.put("common/components/progress-bar.html",'\n
    '),t.put("common/components/status-button.html",'<%- status.name %><% if(editable){ %>\n <% }%>\n'),t.put("common/components/status-display.html",'<% if (is_closed) { %><% } else { %><% } %>'),t.put("common/components/taskboard-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/user-display.html",'\n
    {{user.full_name_display}}
    {{user.full_name_display}}\n
    {{user.full_name_display}}
    {{user.full_name_display}}'),t.put("common/components/watchers.html",'\n
    \n
    {{watcher.full_name_display}}
    \n
    {{watcher.full_name_display}}\n \n
    \n
    '),t.put("common/components/wysiwyg-toolbar.html",'\n
    \n
    \n

    {{\'COMMON.WYSIWYG.OUTDATED\' | translate}}

    \n
    \n
    \n \n
    Markdown ModeHTML Mode\n
    \n
    \n\n'),t.put("common/estimation/us-estimation-points-per-role.html",'\n
      <% _.each(roles, function(role) { %>\n
    • <%- role.points %>\n <%- role.name %>
    • <% }); %>\n
    • <%- totalPoints %>
    • \n
    '),t.put("common/estimation/us-estimation-points.html",'\n'),t.put("common/estimation/us-estimation-total.html",'<%= text %><% if (editable) { %>\n <% } %>'),t.put("common/estimation/us-points-roles-popover.html",'\n'),t.put("common/lightbox/lightbox-assigned-to-users.html",'<% if (selected) { %>\n<% } %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
    <% } %>'),t.put("common/lightbox/lightbox-assigned-to.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    '),t.put("common/lightbox/lightbox-block.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("common/lightbox/lightbox-blocking-message-input.html",'\n'),t.put("common/lightbox/lightbox-change-owner.html",'\n\n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n \n
    '),t.put("common/lightbox/lightbox-leave-project-warning.html",'\n\n
    \n \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.TITLE\' | translate}}

    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.CURRENT_USER_OWNER.DESC\' | translate}}

    \n
    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.OTHER_USER_OWNER.DESC\' | translate}}

    \n
    \n
    '), +t.put("common/lightbox/lightbox-request-ownership.html",'\n\n
    \n

    \n

    \n
    '),t.put("common/lightbox/lightbox-users.html",'\n\n
    \n

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

    \n

    \n
    \n
    '),t.put("projects/create/asana-import/asana-import-project-form/asana-import-project-form.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
    '),t.put("projects/create/github-import/github-import-project-form/github-import-project-form.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
    '),t.put("projects/create/trello-import/trello-import-project-form/trello-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("projects/create/invite-members/single-member/single-member.html",'\n'),t.put("projects/create/jira-import/jira-import-project-form/jira-import-project-form.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
    '),t.put("external-apps/external-app.html",'\n
    \n \n

    Taiga

    \n

    \n
    \n
    \n
    {{::vm.user.get(\'full_name_display\')}}
    \n
    \n

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

    \n

    {{ ::vm.user.get("email") }}

    \n
    \n
    \n
    \n
    \n
    \n
    {{::vm.application.get(\'name\')}}
    \n
    \n

    {{ ::vm.application.get("name") }}

    {{ ::vm.application.get(\'web\') }}\n

    {{ ::vm.application.get("description") }}

    \n
    \n
    \n
    \n
    '),t.put("history/history.html",'\n
    \n \n \n \n
    '),t.put("home/home.html",'\n
    \n
    \n

    {{"HOME.DASHBOARD" | translate}}

    \n \n
    \n \n
    '),t.put("invite-members/lightbox-add-members.html",'\n\n
    \n

    \n \n \n
    '),t.put("navigation-bar/navigation-bar.html",'\n'),t.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
    '),t.put("components/assigned-to/assigned-to.html",'{{vm.assignedTo.get(\'full_name_display\')}}{{vm.assignedTo.get(\'full_name_display\')}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}'),t.put("components/attachment/attachment-gallery.html","\n"),t.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
    '), +t.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 {{file.name}}\n
    \n
    {{file.size | sizeFormat}}
    \n
    {{file.progressMessage}}\n
    \n
    \n
    \n
    \n
    \n \n
    \n'),t.put("components/attachments-preview/attachments-preview.html",'\n
    \n \n \n
    '),t.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 {{attachment.get(\'name\')}}\n
    \n
    {{attachment.get(\'size\') | sizeFormat}}
    \n \n
    \n
    \n
    '),t.put("components/belong-to-epics/belong-to-epics-pill.html","\n
    "),t.put("components/belong-to-epics/belong-to-epics-text.html",""),t.put("components/board-zoom/board-zoom.html",'\n'),t.put("components/card/card.html",'\n
    \n
    \n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    \n \n
    {{"COMMON.FIELDS.POINTS" | translate}} {{vm.item.getIn([\'model\', \'total_points\'])}}\n
    \n
    \n \n
    \n
    \n {{vm.item.getIn([\'model\', \'total_voters\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'watchers\']).size}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'total_comments\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'attachments\']).size}}\n
    \n
    \n
    \n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn([\'model\', \'tasks\']).size}}\n
    \n
      \n
    • \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("components/card-slideshow/card-slideshow.html",'\n
    \n \n \n
    \n \n
    \n
    '),t.put("components/color-selector/color-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
      \n
    • \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("components/filter/filter.html",'\n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{it.name}}\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    '),t.put("components/live-announcement/live-announcement.html",'\n
    \n
    Loading...\n
    \n

    {{vm.title}}

    \n

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

    '),t.put("components/tribe-button/tribe-button.html",'{{ \'US.TRIBE.PUBLISH\' | translate }}'),t.put("components/tribe-button/tribe-linked.html",'\n'),t.put("components/vote-button/vote-button.html",'\n {{ vm.item.total_voters }}\n {{ ::vm.item.total_voters }}'),t.put("components/watch-button/watch-button-ticket.html",'\n
    {{ vm.item.watchers.length }} {{\'COMMON.WATCHERS.WATCHERS\' | translate}}
    \n'),t.put("components/watch-button/watch-button.html",'\n {{ vm.item.watchers.length }}\n {{ vm.item.watchers.length }}'),t.put("discover/discover-home/discover-home.html",'\n
    \n
    \n \n
    \n
    \n \n \n
    \n \n
    '), +t.put("discover/discover-search/discover-search.html",'\n
    \n \n
    {{ DISCOVER.EMPTY | translate }}\n

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

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

      \n

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

      \n
      \n
      \n
      \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}
      \n
    • \n
    {{ \'DISCOVER.VIEW_MORE\' | translate }}\n
    \n
    \n
    '),t.put("epics/create-epic/create-epic.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
    '),t.put("epics/dashboard/epics-dashboard.html",'\n
    \n \n
    \n
    \n

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

    \n

    \n \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories.html",'\n'),t.put("history/comments/comment.html",'\n
    \n
    \n
    {{vm.comment.user.name}}{{vm.comment.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}\n
    {{vm.comment.edit_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}-\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    - {{vm.comment.delete_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}\n \n \n
    \n

    \n
    '),t.put("history/comments/comments.html",'\n
    \n
    \n \n
    \n \n
    '),t.put("history/history-lightbox/comment-history-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("history/history-lightbox/history-entry.html",'\n
    \n
    \n
    {{entry.user.full_name_display}}\n \n
    \n
    \n
    \n
    '),t.put("history/history/history-diff.html",'\n
    \n
    {{diff[0]}}\n {{diff[1]}}\n
    \n
    \n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    \n

    \n

    \n

    \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    \n
    \n
    \n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    '),t.put("history/history/history.html",'\n
    \n
    \n
    \n
    \n
    {{activity.user.name}}{{activity.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("history/history-tabs/history-tabs.html",'\n'),t.put("home/duties/duty.html","\n
    \n
    \n
    \n

    {{ ::vm.duty.getIn(['project', 'name']) }}{{ ::vm.getDutyType() }}{{ ::vm.duty.get('status_extra_info').get('name') }}\n \n

    \n

    {{ 'COMMON.BLOCKED' | translate }}

    \n
    "),t.put("home/projects/home-project-list.html",'\n
    \n
    \n
    \n
    \n

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

    \n
    \n

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

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

    \n
    '),t.put("home/working-on/empty.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("home/working-on/working-on.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
    '),t.put("invite-members/invite-members-form/invite-members-form.html",'\n
    \n
      \n
    • \n
      {{contact.full_name}}{{contact.full_name}}
      \n \n
    • \n
    • \n
      {{userMail.email}}
      \n \n
    • \n
    \n
    \n \n
    \n \n \n \n

    \n
    '), +t.put("invite-members/suggest-add-members/suggest-add-members.html",'\n
    \n
    \n \n \n
    \n
      \n
    • {{contact.get(\'full_name_display\')}}{{contact.get(\'full_name_display\')}}
    • \n
    \n
    '),t.put("navigation-bar/dropdown-project-list/dropdown-project-list.html",'\n \n'),t.put("navigation-bar/dropdown-user/dropdown-user.html",'{{ vm.user.get(\'full_name_display\') }}{{ vm.user.get(\'full_name_display\') }}\n'),t.put("profile/profile-bar/profile-bar.html",'\n
    \n
    {{::vm.user.get(\'full_name\')}}
    \n
    \n

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

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

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

    \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
    {{::vm.user.get("bio") | limitTo:210 }}{{vm.user.get("bio").length < 210 ? \'\' : \'...\'}}
    \n
    '),t.put("profile/profile-contacts/profile-contacts.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    {{ \'USER.PROFILE.CONTACTS_EMPTY\' | translate }}\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
    '),t.put("profile/profile-favs/profile-favs.html",'\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'COMMON.LOADING\'|translate }}
    \n
    \n
    {{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}\n

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

    \n
    \n
    '),t.put("profile/profile-hints/profile-hints.html",'\n

    \n \n

    \n

    {{::vm.hint.title}}

    \n

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

    '),t.put("profile/profile-projects/profile-projects.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n \n

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

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

    \n

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

    \n
    \n
    \n
    \n
    \n
    \n {{ ::project.get(\'total_fans\') }}\n {{ ::project.get(\'total_watchers\') }}
    \n
    {{::contact.get(\'full_name\')}}
    \n
    \n
    \n
    '),t.put("profile/profile-tab/profile-tab.html",'\n
    \n \n
    '),t.put("profile/profile-tabs/profile-tabs.html",'\n'),t.put("projects/listing/projects-listing.html",'\n
    \n
    \n

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

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

      \n

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

      \n
      \n
      \n
      \n \n
    • \n
    \n
    \n \n
    \n
    '),t.put("projects/create/create-project.html",'\n'),t.put("projects/project/blocked-project-explanation.html","\n
    \n
    {{'PROJECT.BLOCKED_PROJECT.THIS_PROJECT_IS_BLOCKED' | translate}}
    \n
    \n
    \n
    {{'PROJECT.BLOCKED_PROJECT.TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF' | translate}}
    \n
    "),t.put("projects/project/blocked-project.html",'\n
    \n
    \n
    \n
    {{::vm.project.get(\'name\')}}\n \n
    {{::vm.project.get("name")}}\n
    \n
    \n

    {{\'PROJECT.BLOCKED_PROJECT.BLOCKED\' | translate}}

    \n \n
    \n
    \n
    '),t.put("projects/project/project.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n
    \n

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

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

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

    \n
    \n
    \n
    {{::tag}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n

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

    \n

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

    \n \n
    \n

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

    \n \n
    \n
    \n
    \n
    '),t.put("projects/transfer/cant-own-project-explanation.html",'\n

    '),t.put("projects/transfer/transfer-page.html",'\n'),t.put("projects/transfer/transfer-project.html",'\n
    \n

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

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

    \n
    \n \n {{::vm.project.get("total_memberships")}}
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n \n
    '),t.put("user-timeline/user-timeline/user-timeline.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n
    \n
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html",'\n\n
    \n
    {{::attachment.get(\'filename\')}}
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment.html",'\n'),t.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
    "),t.put("wiki/history/wiki-history-diff.html",'\n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n

    \n

    \n
    '),t.put("wiki/history/wiki-history-entry.html",'\n
    \n
    \n
    {{singleHistoryEntry.user.name}}{{singleHistoryEntry.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    '), +t.put("wiki/history/wiki-history.html",'\n\n
    \n \n
    '),t.put("components/assigned-to/assigned-item/assigned-item.html",'\n
    \n
    {{member.full_name}}
    \n
    '),t.put("components/assigned-to/assigned-to-selector/assigned-to-selector.html",'\n\n
    \n

    \n \n
      \n
    • \n \n \n
    • \n
    • \n \n
    • \n
    \n
    '),t.put("components/detail/header/detail-header.html",'\n
    \n

    {{\'#\' + vm.item.ref}}\n

    \n
    \n \n \n
    \n
    \n
    \n \n
    \n\n
    \n\n\n
    {{vm.item.blocked_note}}
    \n'),t.put("components/card/card-templates/card-completion.html","\n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn(['model', 'tasks']).size}}\n
    "),t.put("components/card/card-templates/card-data.html","\n
    {{\"COMMON.FIELDS.POINTS\" | translate}} {{vm.item.getIn(['model', 'total_points'])}}\n
    \n
    \n \n
    \n
    \n {{vm.item.getIn(['model', 'total_voters'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'watchers']).size}}\n
    \n
    \n {{vm.item.getIn(['model', 'total_comments'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'attachments']).size}}\n
    \n
    \n
    "),t.put("components/card/card-templates/card-owner.html",'\n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    '),t.put("components/card/card-templates/card-tags.html",'\n
    '),t.put("components/card/card-templates/card-tasks.html","\n
      \n
    • \n
    "),t.put("components/card/card-templates/card-title.html","\n

    {{::\"#\" + vm.item.getIn(['model', 'ref'])}}\n

    "),t.put("components/card/card-templates/card-unfold.html",'\n
    \n \n
    \n
    '),t.put("components/tags/components/add-tag-button.html",'\n '),t.put("components/tags/components/add-tag-input.html",'\n
    \n \n \n \n \n
    '),t.put("components/tags/tag/tag.html",'\n'),t.put("components/tags/tag-dropdown/tag-dropdown.html",'\n
      \n
    • \n
      {{tag[0]}}
      \n
    • \n
    '),t.put("components/tags/tag-line-common/tag-line-common.html",'\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n \n \n
    '),t.put("components/tags/tag-line-detail/tag-line-detail.html",'\n'),t.put("components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("discover/components/discover-home-order-by/discover-home-order-by.html",'\n
    {{vm.currentText()}}\n \n
      \n
    • {{ \'DISCOVER.FILTERS.WEEK\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.MONTH\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.YEAR\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.ALL_TIME\' | translate }}
    • \n
    \n
    '),t.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
    '),t.put("discover/components/discover-search-list-header/discover-search-list-header.html",'\n'),t.put("discover/components/featured-projects/featured-projects.html",'\n'),t.put("discover/components/highlighted/highlighted.html",'\n
    \n
    \n
    \n
    \n
    \n

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

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

    {{ ::project.get(\'description\') | limitTo:150 }}{{ ::project.get(\'description\').length < 150 ? \'\' : \'...\'}}

    \n
    \n
    \n \n
    '),t.put("discover/components/most-active/most-active.html",'\n
    \n
    \n
    \n \n

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

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

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

    \n
    \n \n
    \n \n
    \n
    \n {{ \'DISCOVER.MOST_LIKED_EMPTY\' | translate }}\n
    '),t.put("epics/dashboard/epic-row/epic-row.html",'\n
    \n \n
    \n {{::vm.epic.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    {{vm.epic.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n \n
      \n
    • {{status.name}}
    • \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    '), +t.put("epics/dashboard/epics-table/epics-table.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
    '),t.put("epics/dashboard/story-row/story-row.html",'\n
    \n
    \n {{::vm.story.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    {{::vm.story.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{::vm.story.get(\'milestone_name\')}}
    \n
    {{::vm.story.getIn([\'assigned_to_extra_info\', \'full_name_display\'])}}
    \n
    {{EPICS.DASHBOARD.UNASSIGNED | translate}}
    \n
    {{vm.story.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories-create/related-userstories-create.html",'\n \n'),t.put("epics/related-userstories/related-userstory-row/related-userstory-row.html",'\n\n
    \n \n
    \n\n
    {{::vm.userstory.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{vm.userstory.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    {{ vm.avatar.full_name_display }}\n
    {{ vm.getAssignedToFullNameDisplay() }}
    \n
    \n
    \n
    '),t.put("history/history/history-templates/blocked.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/client-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-assigned.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    '),t.put("history/history/history-templates/history-color.html",'\n
    \n \n
    '),t.put("history/history/history-templates/history-custom-attributes.html",'\n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    '),t.put("history/history/history-templates/history-description.html",'\n
    \n

    \n

    \n

    \n
    '),t.put("history/history/history-templates/history-milestone.html",'\n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    '),t.put("history/history/history-templates/history-points.html",'\n
    {{diff[0]}}\n {{diff[1]}}\n
    '),t.put("history/history/history-templates/history-status.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-subject.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-tags.html",'\n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    '),t.put("history/history/history-templates/history-type.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/team-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("profile/profile-favs/items/project.html",'\n
    \n
    \n
    \n
    \n

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

    \n

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

    \n
    \n
    \n
    \n
    \n {{ ::vm.item.get(\'total_fans\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("profile/profile-favs/items/ticket.html",'\n
    {{ ::vm.item.getIn([\'assigned_to_extra_info\', \'full_name_display\']) }}{{ \'COMMON.ASSIGNED_TO.NOT_ASSIGNED\'|translate }}\n
    \n

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

    \n

    \n
    \n
    \n {{ ::vm.item.get(\'total_voters\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("projects/components/contact-project-button/contact-project-button.html",'\n'),t.put("projects/components/lb-contact-project/lb-contact-project.html",'\n\n'),t.put("projects/components/like-project-button/like-project-button.html",'\n'),t.put("projects/components/watch-project-button/watch-project-button.html",'\n\n'),t.put("projects/create/asana-import/asana-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/create-project-form/create-project-form.html",'\n
    \n
    \n \n

    \n
    \n

    \n
    \n \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '), +t.put("projects/create/create-project-members-restrictions/create-project-members-restrictions.html",'\n
    \n \n
    \n
    \n \n
    '),t.put("projects/create/create-project-restrictions/create-project-restrictions.html",'\n
    \n {{ \'PROJECT.CREATE.MAX_PRIVATE_PROJECTS\' | translate }}\n
    \n
    \n {{ \'PROJECT.CREATE.MAX_PUBLIC_PROJECTS\' | translate }}\n
    '),t.put("projects/create/duplicate/duplicate-project.html",'\n
    \n

    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    '),t.put("projects/create/github-import/github-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/import/import-header.html",'\n
    \n

    \n

    \n
    '),t.put("projects/create/import/import-project-error-lb.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
    '),t.put("projects/create/import/import-project.html",'\n
    \n
    \n
      \n
    • \n
    • \n \n
      Jira\n

      \n
      \n \n \n \n
      \n
      \n
    • \n
    • \n \n
      Github\n

      \n
      \n
    • \n
    • \n \n
      Trello\n

      \n
      \n
    • \n
    • \n \n
      Asana\n

      \n
      \n
    • \n
    \n
    \n \n
    \n
    \n\n\n\n'),t.put("projects/create/import-project-form-common/actions.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/description.html",'\n
    \n \n
    '),t.put("projects/create/import-project-form-common/links.html",'\n
    \n \n
    \n \n
    \n
    \n
    '),t.put("projects/create/import-project-form-common/name.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/project-privacy.html",'\n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    '),t.put("projects/create/import-project-members/import-project-members.html",'\n
    \n
    \n

    \n

    \n \n
    \n \n \n
    \n
      \n
    • \n
      \n
      {{member.get(\'full_name\')[0].toUpperCase()}}
      \n
      {{member.get(\'full_name\') || member.get(\'username\') }}\n
      \n
      \n
      \n \n \n
      \n
      \n {{vm.getUser(member).get(\'full_name\') || vm.getUser(member)}}\n
      \n \n
      \n
    • \n
    \n
    \n \n \n
    \n \n \n
    '),t.put("projects/create/import-project-selector/import-project-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
      \n
    • {{project.name}}
    • \n
    \n
    \n

    {{ vm.noProjectsMsg }}

    \n
    \n
    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("projects/create/import-taiga/import-taiga.html",'\n\n\n
    Taiga\n

    \n
    '),t.put("projects/create/invite-members/invite-members.html",'\n
    \n
    \n \n
    \n
    '),t.put("projects/create/jira-import/jira-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/select-import-user-lightbox/select-import-user-lightbox.html",'\n\n
    \n
    \n
    {{vm.user.get(\'full_name\')[0].toUpperCase() || vm.user.get(\'username\')[0].toUpperCase()}}
    \n
    {{vm.user.get(\'full_name\') || vm.user.get(\'username\')}}\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    '),t.put("projects/create/trello-import/trello-import.html",'\n\n\n'),t.put("projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html",'\n\n
    \n

    \n

    \n
    \n \n \n
    \n
    '),t.put("wiki/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    ')}]); \ No newline at end of file diff --git a/dist/v-1520418874500/locales/moment-locales/af.js b/dist/v-1521124836513/locales/moment-locales/af.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/af.js rename to dist/v-1521124836513/locales/moment-locales/af.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar-dz.js b/dist/v-1521124836513/locales/moment-locales/ar-dz.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar-dz.js rename to dist/v-1521124836513/locales/moment-locales/ar-dz.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar-kw.js b/dist/v-1521124836513/locales/moment-locales/ar-kw.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar-kw.js rename to dist/v-1521124836513/locales/moment-locales/ar-kw.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar-ly.js b/dist/v-1521124836513/locales/moment-locales/ar-ly.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar-ly.js rename to dist/v-1521124836513/locales/moment-locales/ar-ly.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar-ma.js b/dist/v-1521124836513/locales/moment-locales/ar-ma.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar-ma.js rename to dist/v-1521124836513/locales/moment-locales/ar-ma.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar-sa.js b/dist/v-1521124836513/locales/moment-locales/ar-sa.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar-sa.js rename to dist/v-1521124836513/locales/moment-locales/ar-sa.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar-tn.js b/dist/v-1521124836513/locales/moment-locales/ar-tn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar-tn.js rename to dist/v-1521124836513/locales/moment-locales/ar-tn.js diff --git a/dist/v-1520418874500/locales/moment-locales/ar.js b/dist/v-1521124836513/locales/moment-locales/ar.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ar.js rename to dist/v-1521124836513/locales/moment-locales/ar.js diff --git a/dist/v-1520418874500/locales/moment-locales/az.js b/dist/v-1521124836513/locales/moment-locales/az.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/az.js rename to dist/v-1521124836513/locales/moment-locales/az.js diff --git a/dist/v-1520418874500/locales/moment-locales/be.js b/dist/v-1521124836513/locales/moment-locales/be.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/be.js rename to dist/v-1521124836513/locales/moment-locales/be.js diff --git a/dist/v-1520418874500/locales/moment-locales/bg.js b/dist/v-1521124836513/locales/moment-locales/bg.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/bg.js rename to dist/v-1521124836513/locales/moment-locales/bg.js diff --git a/dist/v-1520418874500/locales/moment-locales/bm.js b/dist/v-1521124836513/locales/moment-locales/bm.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/bm.js rename to dist/v-1521124836513/locales/moment-locales/bm.js diff --git a/dist/v-1520418874500/locales/moment-locales/bn.js b/dist/v-1521124836513/locales/moment-locales/bn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/bn.js rename to dist/v-1521124836513/locales/moment-locales/bn.js diff --git a/dist/v-1520418874500/locales/moment-locales/bo.js b/dist/v-1521124836513/locales/moment-locales/bo.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/bo.js rename to dist/v-1521124836513/locales/moment-locales/bo.js diff --git a/dist/v-1520418874500/locales/moment-locales/br.js b/dist/v-1521124836513/locales/moment-locales/br.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/br.js rename to dist/v-1521124836513/locales/moment-locales/br.js diff --git a/dist/v-1520418874500/locales/moment-locales/bs.js b/dist/v-1521124836513/locales/moment-locales/bs.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/bs.js rename to dist/v-1521124836513/locales/moment-locales/bs.js diff --git a/dist/v-1520418874500/locales/moment-locales/ca.js b/dist/v-1521124836513/locales/moment-locales/ca.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ca.js rename to dist/v-1521124836513/locales/moment-locales/ca.js diff --git a/dist/v-1520418874500/locales/moment-locales/cs.js b/dist/v-1521124836513/locales/moment-locales/cs.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/cs.js rename to dist/v-1521124836513/locales/moment-locales/cs.js diff --git a/dist/v-1520418874500/locales/moment-locales/cv.js b/dist/v-1521124836513/locales/moment-locales/cv.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/cv.js rename to dist/v-1521124836513/locales/moment-locales/cv.js diff --git a/dist/v-1520418874500/locales/moment-locales/cy.js b/dist/v-1521124836513/locales/moment-locales/cy.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/cy.js rename to dist/v-1521124836513/locales/moment-locales/cy.js diff --git a/dist/v-1520418874500/locales/moment-locales/da.js b/dist/v-1521124836513/locales/moment-locales/da.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/da.js rename to dist/v-1521124836513/locales/moment-locales/da.js diff --git a/dist/v-1520418874500/locales/moment-locales/de-at.js b/dist/v-1521124836513/locales/moment-locales/de-at.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/de-at.js rename to dist/v-1521124836513/locales/moment-locales/de-at.js diff --git a/dist/v-1520418874500/locales/moment-locales/de-ch.js b/dist/v-1521124836513/locales/moment-locales/de-ch.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/de-ch.js rename to dist/v-1521124836513/locales/moment-locales/de-ch.js diff --git a/dist/v-1520418874500/locales/moment-locales/de.js b/dist/v-1521124836513/locales/moment-locales/de.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/de.js rename to dist/v-1521124836513/locales/moment-locales/de.js diff --git a/dist/v-1520418874500/locales/moment-locales/dv.js b/dist/v-1521124836513/locales/moment-locales/dv.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/dv.js rename to dist/v-1521124836513/locales/moment-locales/dv.js diff --git a/dist/v-1520418874500/locales/moment-locales/el.js b/dist/v-1521124836513/locales/moment-locales/el.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/el.js rename to dist/v-1521124836513/locales/moment-locales/el.js diff --git a/dist/v-1520418874500/locales/moment-locales/en-au.js b/dist/v-1521124836513/locales/moment-locales/en-au.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/en-au.js rename to dist/v-1521124836513/locales/moment-locales/en-au.js diff --git a/dist/v-1520418874500/locales/moment-locales/en-ca.js b/dist/v-1521124836513/locales/moment-locales/en-ca.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/en-ca.js rename to dist/v-1521124836513/locales/moment-locales/en-ca.js diff --git a/dist/v-1520418874500/locales/moment-locales/en-gb.js b/dist/v-1521124836513/locales/moment-locales/en-gb.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/en-gb.js rename to dist/v-1521124836513/locales/moment-locales/en-gb.js diff --git a/dist/v-1520418874500/locales/moment-locales/en-ie.js b/dist/v-1521124836513/locales/moment-locales/en-ie.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/en-ie.js rename to dist/v-1521124836513/locales/moment-locales/en-ie.js diff --git a/dist/v-1520418874500/locales/moment-locales/en-il.js b/dist/v-1521124836513/locales/moment-locales/en-il.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/en-il.js rename to dist/v-1521124836513/locales/moment-locales/en-il.js diff --git a/dist/v-1520418874500/locales/moment-locales/en-nz.js b/dist/v-1521124836513/locales/moment-locales/en-nz.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/en-nz.js rename to dist/v-1521124836513/locales/moment-locales/en-nz.js diff --git a/dist/v-1520418874500/locales/moment-locales/eo.js b/dist/v-1521124836513/locales/moment-locales/eo.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/eo.js rename to dist/v-1521124836513/locales/moment-locales/eo.js diff --git a/dist/v-1520418874500/locales/moment-locales/es-do.js b/dist/v-1521124836513/locales/moment-locales/es-do.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/es-do.js rename to dist/v-1521124836513/locales/moment-locales/es-do.js diff --git a/dist/v-1520418874500/locales/moment-locales/es-us.js b/dist/v-1521124836513/locales/moment-locales/es-us.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/es-us.js rename to dist/v-1521124836513/locales/moment-locales/es-us.js diff --git a/dist/v-1520418874500/locales/moment-locales/es.js b/dist/v-1521124836513/locales/moment-locales/es.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/es.js rename to dist/v-1521124836513/locales/moment-locales/es.js diff --git a/dist/v-1520418874500/locales/moment-locales/et.js b/dist/v-1521124836513/locales/moment-locales/et.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/et.js rename to dist/v-1521124836513/locales/moment-locales/et.js diff --git a/dist/v-1520418874500/locales/moment-locales/eu.js b/dist/v-1521124836513/locales/moment-locales/eu.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/eu.js rename to dist/v-1521124836513/locales/moment-locales/eu.js diff --git a/dist/v-1520418874500/locales/moment-locales/fa.js b/dist/v-1521124836513/locales/moment-locales/fa.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fa.js rename to dist/v-1521124836513/locales/moment-locales/fa.js diff --git a/dist/v-1520418874500/locales/moment-locales/fi.js b/dist/v-1521124836513/locales/moment-locales/fi.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fi.js rename to dist/v-1521124836513/locales/moment-locales/fi.js diff --git a/dist/v-1520418874500/locales/moment-locales/fo.js b/dist/v-1521124836513/locales/moment-locales/fo.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fo.js rename to dist/v-1521124836513/locales/moment-locales/fo.js diff --git a/dist/v-1520418874500/locales/moment-locales/fr-ca.js b/dist/v-1521124836513/locales/moment-locales/fr-ca.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fr-ca.js rename to dist/v-1521124836513/locales/moment-locales/fr-ca.js diff --git a/dist/v-1520418874500/locales/moment-locales/fr-ch.js b/dist/v-1521124836513/locales/moment-locales/fr-ch.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fr-ch.js rename to dist/v-1521124836513/locales/moment-locales/fr-ch.js diff --git a/dist/v-1520418874500/locales/moment-locales/fr.js b/dist/v-1521124836513/locales/moment-locales/fr.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fr.js rename to dist/v-1521124836513/locales/moment-locales/fr.js diff --git a/dist/v-1520418874500/locales/moment-locales/fy.js b/dist/v-1521124836513/locales/moment-locales/fy.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/fy.js rename to dist/v-1521124836513/locales/moment-locales/fy.js diff --git a/dist/v-1520418874500/locales/moment-locales/gd.js b/dist/v-1521124836513/locales/moment-locales/gd.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/gd.js rename to dist/v-1521124836513/locales/moment-locales/gd.js diff --git a/dist/v-1520418874500/locales/moment-locales/gl.js b/dist/v-1521124836513/locales/moment-locales/gl.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/gl.js rename to dist/v-1521124836513/locales/moment-locales/gl.js diff --git a/dist/v-1520418874500/locales/moment-locales/gom-latn.js b/dist/v-1521124836513/locales/moment-locales/gom-latn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/gom-latn.js rename to dist/v-1521124836513/locales/moment-locales/gom-latn.js diff --git a/dist/v-1520418874500/locales/moment-locales/gu.js b/dist/v-1521124836513/locales/moment-locales/gu.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/gu.js rename to dist/v-1521124836513/locales/moment-locales/gu.js diff --git a/dist/v-1520418874500/locales/moment-locales/he.js b/dist/v-1521124836513/locales/moment-locales/he.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/he.js rename to dist/v-1521124836513/locales/moment-locales/he.js diff --git a/dist/v-1520418874500/locales/moment-locales/hi.js b/dist/v-1521124836513/locales/moment-locales/hi.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/hi.js rename to dist/v-1521124836513/locales/moment-locales/hi.js diff --git a/dist/v-1520418874500/locales/moment-locales/hr.js b/dist/v-1521124836513/locales/moment-locales/hr.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/hr.js rename to dist/v-1521124836513/locales/moment-locales/hr.js diff --git a/dist/v-1520418874500/locales/moment-locales/hu.js b/dist/v-1521124836513/locales/moment-locales/hu.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/hu.js rename to dist/v-1521124836513/locales/moment-locales/hu.js diff --git a/dist/v-1520418874500/locales/moment-locales/hy-am.js b/dist/v-1521124836513/locales/moment-locales/hy-am.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/hy-am.js rename to dist/v-1521124836513/locales/moment-locales/hy-am.js diff --git a/dist/v-1520418874500/locales/moment-locales/id.js b/dist/v-1521124836513/locales/moment-locales/id.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/id.js rename to dist/v-1521124836513/locales/moment-locales/id.js diff --git a/dist/v-1520418874500/locales/moment-locales/is.js b/dist/v-1521124836513/locales/moment-locales/is.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/is.js rename to dist/v-1521124836513/locales/moment-locales/is.js diff --git a/dist/v-1520418874500/locales/moment-locales/it.js b/dist/v-1521124836513/locales/moment-locales/it.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/it.js rename to dist/v-1521124836513/locales/moment-locales/it.js diff --git a/dist/v-1520418874500/locales/moment-locales/ja.js b/dist/v-1521124836513/locales/moment-locales/ja.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ja.js rename to dist/v-1521124836513/locales/moment-locales/ja.js diff --git a/dist/v-1520418874500/locales/moment-locales/jv.js b/dist/v-1521124836513/locales/moment-locales/jv.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/jv.js rename to dist/v-1521124836513/locales/moment-locales/jv.js diff --git a/dist/v-1520418874500/locales/moment-locales/ka.js b/dist/v-1521124836513/locales/moment-locales/ka.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ka.js rename to dist/v-1521124836513/locales/moment-locales/ka.js diff --git a/dist/v-1520418874500/locales/moment-locales/kk.js b/dist/v-1521124836513/locales/moment-locales/kk.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/kk.js rename to dist/v-1521124836513/locales/moment-locales/kk.js diff --git a/dist/v-1520418874500/locales/moment-locales/km.js b/dist/v-1521124836513/locales/moment-locales/km.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/km.js rename to dist/v-1521124836513/locales/moment-locales/km.js diff --git a/dist/v-1520418874500/locales/moment-locales/kn.js b/dist/v-1521124836513/locales/moment-locales/kn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/kn.js rename to dist/v-1521124836513/locales/moment-locales/kn.js diff --git a/dist/v-1520418874500/locales/moment-locales/ko.js b/dist/v-1521124836513/locales/moment-locales/ko.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ko.js rename to dist/v-1521124836513/locales/moment-locales/ko.js diff --git a/dist/v-1520418874500/locales/moment-locales/ky.js b/dist/v-1521124836513/locales/moment-locales/ky.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ky.js rename to dist/v-1521124836513/locales/moment-locales/ky.js diff --git a/dist/v-1520418874500/locales/moment-locales/lb.js b/dist/v-1521124836513/locales/moment-locales/lb.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/lb.js rename to dist/v-1521124836513/locales/moment-locales/lb.js diff --git a/dist/v-1520418874500/locales/moment-locales/lo.js b/dist/v-1521124836513/locales/moment-locales/lo.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/lo.js rename to dist/v-1521124836513/locales/moment-locales/lo.js diff --git a/dist/v-1520418874500/locales/moment-locales/lt.js b/dist/v-1521124836513/locales/moment-locales/lt.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/lt.js rename to dist/v-1521124836513/locales/moment-locales/lt.js diff --git a/dist/v-1520418874500/locales/moment-locales/lv.js b/dist/v-1521124836513/locales/moment-locales/lv.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/lv.js rename to dist/v-1521124836513/locales/moment-locales/lv.js diff --git a/dist/v-1520418874500/locales/moment-locales/me.js b/dist/v-1521124836513/locales/moment-locales/me.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/me.js rename to dist/v-1521124836513/locales/moment-locales/me.js diff --git a/dist/v-1520418874500/locales/moment-locales/mi.js b/dist/v-1521124836513/locales/moment-locales/mi.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/mi.js rename to dist/v-1521124836513/locales/moment-locales/mi.js diff --git a/dist/v-1520418874500/locales/moment-locales/mk.js b/dist/v-1521124836513/locales/moment-locales/mk.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/mk.js rename to dist/v-1521124836513/locales/moment-locales/mk.js diff --git a/dist/v-1520418874500/locales/moment-locales/ml.js b/dist/v-1521124836513/locales/moment-locales/ml.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ml.js rename to dist/v-1521124836513/locales/moment-locales/ml.js diff --git a/dist/v-1520418874500/locales/moment-locales/mr.js b/dist/v-1521124836513/locales/moment-locales/mr.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/mr.js rename to dist/v-1521124836513/locales/moment-locales/mr.js diff --git a/dist/v-1520418874500/locales/moment-locales/ms-my.js b/dist/v-1521124836513/locales/moment-locales/ms-my.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ms-my.js rename to dist/v-1521124836513/locales/moment-locales/ms-my.js diff --git a/dist/v-1520418874500/locales/moment-locales/ms.js b/dist/v-1521124836513/locales/moment-locales/ms.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ms.js rename to dist/v-1521124836513/locales/moment-locales/ms.js diff --git a/dist/v-1520418874500/locales/moment-locales/mt.js b/dist/v-1521124836513/locales/moment-locales/mt.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/mt.js rename to dist/v-1521124836513/locales/moment-locales/mt.js diff --git a/dist/v-1520418874500/locales/moment-locales/my.js b/dist/v-1521124836513/locales/moment-locales/my.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/my.js rename to dist/v-1521124836513/locales/moment-locales/my.js diff --git a/dist/v-1520418874500/locales/moment-locales/nb.js b/dist/v-1521124836513/locales/moment-locales/nb.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/nb.js rename to dist/v-1521124836513/locales/moment-locales/nb.js diff --git a/dist/v-1520418874500/locales/moment-locales/ne.js b/dist/v-1521124836513/locales/moment-locales/ne.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ne.js rename to dist/v-1521124836513/locales/moment-locales/ne.js diff --git a/dist/v-1520418874500/locales/moment-locales/nl-be.js b/dist/v-1521124836513/locales/moment-locales/nl-be.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/nl-be.js rename to dist/v-1521124836513/locales/moment-locales/nl-be.js diff --git a/dist/v-1520418874500/locales/moment-locales/nl.js b/dist/v-1521124836513/locales/moment-locales/nl.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/nl.js rename to dist/v-1521124836513/locales/moment-locales/nl.js diff --git a/dist/v-1520418874500/locales/moment-locales/nn.js b/dist/v-1521124836513/locales/moment-locales/nn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/nn.js rename to dist/v-1521124836513/locales/moment-locales/nn.js diff --git a/dist/v-1520418874500/locales/moment-locales/pa-in.js b/dist/v-1521124836513/locales/moment-locales/pa-in.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/pa-in.js rename to dist/v-1521124836513/locales/moment-locales/pa-in.js diff --git a/dist/v-1520418874500/locales/moment-locales/pl.js b/dist/v-1521124836513/locales/moment-locales/pl.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/pl.js rename to dist/v-1521124836513/locales/moment-locales/pl.js diff --git a/dist/v-1520418874500/locales/moment-locales/pt-br.js b/dist/v-1521124836513/locales/moment-locales/pt-br.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/pt-br.js rename to dist/v-1521124836513/locales/moment-locales/pt-br.js diff --git a/dist/v-1520418874500/locales/moment-locales/pt.js b/dist/v-1521124836513/locales/moment-locales/pt.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/pt.js rename to dist/v-1521124836513/locales/moment-locales/pt.js diff --git a/dist/v-1520418874500/locales/moment-locales/ro.js b/dist/v-1521124836513/locales/moment-locales/ro.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ro.js rename to dist/v-1521124836513/locales/moment-locales/ro.js diff --git a/dist/v-1520418874500/locales/moment-locales/ru.js b/dist/v-1521124836513/locales/moment-locales/ru.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ru.js rename to dist/v-1521124836513/locales/moment-locales/ru.js diff --git a/dist/v-1520418874500/locales/moment-locales/sd.js b/dist/v-1521124836513/locales/moment-locales/sd.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sd.js rename to dist/v-1521124836513/locales/moment-locales/sd.js diff --git a/dist/v-1520418874500/locales/moment-locales/se.js b/dist/v-1521124836513/locales/moment-locales/se.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/se.js rename to dist/v-1521124836513/locales/moment-locales/se.js diff --git a/dist/v-1520418874500/locales/moment-locales/si.js b/dist/v-1521124836513/locales/moment-locales/si.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/si.js rename to dist/v-1521124836513/locales/moment-locales/si.js diff --git a/dist/v-1520418874500/locales/moment-locales/sk.js b/dist/v-1521124836513/locales/moment-locales/sk.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sk.js rename to dist/v-1521124836513/locales/moment-locales/sk.js diff --git a/dist/v-1520418874500/locales/moment-locales/sl.js b/dist/v-1521124836513/locales/moment-locales/sl.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sl.js rename to dist/v-1521124836513/locales/moment-locales/sl.js diff --git a/dist/v-1520418874500/locales/moment-locales/sq.js b/dist/v-1521124836513/locales/moment-locales/sq.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sq.js rename to dist/v-1521124836513/locales/moment-locales/sq.js diff --git a/dist/v-1520418874500/locales/moment-locales/sr-cyrl.js b/dist/v-1521124836513/locales/moment-locales/sr-cyrl.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sr-cyrl.js rename to dist/v-1521124836513/locales/moment-locales/sr-cyrl.js diff --git a/dist/v-1520418874500/locales/moment-locales/sr.js b/dist/v-1521124836513/locales/moment-locales/sr.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sr.js rename to dist/v-1521124836513/locales/moment-locales/sr.js diff --git a/dist/v-1520418874500/locales/moment-locales/ss.js b/dist/v-1521124836513/locales/moment-locales/ss.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ss.js rename to dist/v-1521124836513/locales/moment-locales/ss.js diff --git a/dist/v-1520418874500/locales/moment-locales/sv.js b/dist/v-1521124836513/locales/moment-locales/sv.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sv.js rename to dist/v-1521124836513/locales/moment-locales/sv.js diff --git a/dist/v-1520418874500/locales/moment-locales/sw.js b/dist/v-1521124836513/locales/moment-locales/sw.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/sw.js rename to dist/v-1521124836513/locales/moment-locales/sw.js diff --git a/dist/v-1520418874500/locales/moment-locales/ta.js b/dist/v-1521124836513/locales/moment-locales/ta.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ta.js rename to dist/v-1521124836513/locales/moment-locales/ta.js diff --git a/dist/v-1520418874500/locales/moment-locales/te.js b/dist/v-1521124836513/locales/moment-locales/te.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/te.js rename to dist/v-1521124836513/locales/moment-locales/te.js diff --git a/dist/v-1520418874500/locales/moment-locales/tet.js b/dist/v-1521124836513/locales/moment-locales/tet.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tet.js rename to dist/v-1521124836513/locales/moment-locales/tet.js diff --git a/dist/v-1520418874500/locales/moment-locales/tg.js b/dist/v-1521124836513/locales/moment-locales/tg.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tg.js rename to dist/v-1521124836513/locales/moment-locales/tg.js diff --git a/dist/v-1520418874500/locales/moment-locales/th.js b/dist/v-1521124836513/locales/moment-locales/th.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/th.js rename to dist/v-1521124836513/locales/moment-locales/th.js diff --git a/dist/v-1520418874500/locales/moment-locales/tl-ph.js b/dist/v-1521124836513/locales/moment-locales/tl-ph.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tl-ph.js rename to dist/v-1521124836513/locales/moment-locales/tl-ph.js diff --git a/dist/v-1520418874500/locales/moment-locales/tlh.js b/dist/v-1521124836513/locales/moment-locales/tlh.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tlh.js rename to dist/v-1521124836513/locales/moment-locales/tlh.js diff --git a/dist/v-1520418874500/locales/moment-locales/tr.js b/dist/v-1521124836513/locales/moment-locales/tr.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tr.js rename to dist/v-1521124836513/locales/moment-locales/tr.js diff --git a/dist/v-1520418874500/locales/moment-locales/tzl.js b/dist/v-1521124836513/locales/moment-locales/tzl.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tzl.js rename to dist/v-1521124836513/locales/moment-locales/tzl.js diff --git a/dist/v-1520418874500/locales/moment-locales/tzm-latn.js b/dist/v-1521124836513/locales/moment-locales/tzm-latn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tzm-latn.js rename to dist/v-1521124836513/locales/moment-locales/tzm-latn.js diff --git a/dist/v-1520418874500/locales/moment-locales/tzm.js b/dist/v-1521124836513/locales/moment-locales/tzm.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/tzm.js rename to dist/v-1521124836513/locales/moment-locales/tzm.js diff --git a/dist/v-1520418874500/locales/moment-locales/ug-cn.js b/dist/v-1521124836513/locales/moment-locales/ug-cn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ug-cn.js rename to dist/v-1521124836513/locales/moment-locales/ug-cn.js diff --git a/dist/v-1520418874500/locales/moment-locales/uk.js b/dist/v-1521124836513/locales/moment-locales/uk.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/uk.js rename to dist/v-1521124836513/locales/moment-locales/uk.js diff --git a/dist/v-1520418874500/locales/moment-locales/ur.js b/dist/v-1521124836513/locales/moment-locales/ur.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/ur.js rename to dist/v-1521124836513/locales/moment-locales/ur.js diff --git a/dist/v-1520418874500/locales/moment-locales/uz-latn.js b/dist/v-1521124836513/locales/moment-locales/uz-latn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/uz-latn.js rename to dist/v-1521124836513/locales/moment-locales/uz-latn.js diff --git a/dist/v-1520418874500/locales/moment-locales/uz.js b/dist/v-1521124836513/locales/moment-locales/uz.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/uz.js rename to dist/v-1521124836513/locales/moment-locales/uz.js diff --git a/dist/v-1520418874500/locales/moment-locales/vi.js b/dist/v-1521124836513/locales/moment-locales/vi.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/vi.js rename to dist/v-1521124836513/locales/moment-locales/vi.js diff --git a/dist/v-1520418874500/locales/moment-locales/x-pseudo.js b/dist/v-1521124836513/locales/moment-locales/x-pseudo.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/x-pseudo.js rename to dist/v-1521124836513/locales/moment-locales/x-pseudo.js diff --git a/dist/v-1520418874500/locales/moment-locales/yo.js b/dist/v-1521124836513/locales/moment-locales/yo.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/yo.js rename to dist/v-1521124836513/locales/moment-locales/yo.js diff --git a/dist/v-1520418874500/locales/moment-locales/zh-cn.js b/dist/v-1521124836513/locales/moment-locales/zh-cn.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/zh-cn.js rename to dist/v-1521124836513/locales/moment-locales/zh-cn.js diff --git a/dist/v-1520418874500/locales/moment-locales/zh-hk.js b/dist/v-1521124836513/locales/moment-locales/zh-hk.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/zh-hk.js rename to dist/v-1521124836513/locales/moment-locales/zh-hk.js diff --git a/dist/v-1520418874500/locales/moment-locales/zh-tw.js b/dist/v-1521124836513/locales/moment-locales/zh-tw.js similarity index 100% rename from dist/v-1520418874500/locales/moment-locales/zh-tw.js rename to dist/v-1521124836513/locales/moment-locales/zh-tw.js diff --git a/dist/v-1520418874500/locales/taiga/locale-ca.json b/dist/v-1521124836513/locales/taiga/locale-ca.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-ca.json rename to dist/v-1521124836513/locales/taiga/locale-ca.json diff --git a/dist/v-1520418874500/locales/taiga/locale-de.json b/dist/v-1521124836513/locales/taiga/locale-de.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-de.json rename to dist/v-1521124836513/locales/taiga/locale-de.json diff --git a/dist/v-1520418874500/locales/taiga/locale-en.json b/dist/v-1521124836513/locales/taiga/locale-en.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-en.json rename to dist/v-1521124836513/locales/taiga/locale-en.json diff --git a/dist/v-1520418874500/locales/taiga/locale-es.json b/dist/v-1521124836513/locales/taiga/locale-es.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-es.json rename to dist/v-1521124836513/locales/taiga/locale-es.json diff --git a/dist/v-1520418874500/locales/taiga/locale-fi.json b/dist/v-1521124836513/locales/taiga/locale-fi.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-fi.json rename to dist/v-1521124836513/locales/taiga/locale-fi.json diff --git a/dist/v-1520418874500/locales/taiga/locale-fr.json b/dist/v-1521124836513/locales/taiga/locale-fr.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-fr.json rename to dist/v-1521124836513/locales/taiga/locale-fr.json diff --git a/dist/v-1520418874500/locales/taiga/locale-it.json b/dist/v-1521124836513/locales/taiga/locale-it.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-it.json rename to dist/v-1521124836513/locales/taiga/locale-it.json diff --git a/dist/v-1520418874500/locales/taiga/locale-ja.json b/dist/v-1521124836513/locales/taiga/locale-ja.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-ja.json rename to dist/v-1521124836513/locales/taiga/locale-ja.json diff --git a/dist/v-1520418874500/locales/taiga/locale-ko.json b/dist/v-1521124836513/locales/taiga/locale-ko.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-ko.json rename to dist/v-1521124836513/locales/taiga/locale-ko.json diff --git a/dist/v-1520418874500/locales/taiga/locale-nb.json b/dist/v-1521124836513/locales/taiga/locale-nb.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-nb.json rename to dist/v-1521124836513/locales/taiga/locale-nb.json diff --git a/dist/v-1520418874500/locales/taiga/locale-nl.json b/dist/v-1521124836513/locales/taiga/locale-nl.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-nl.json rename to dist/v-1521124836513/locales/taiga/locale-nl.json diff --git a/dist/v-1520418874500/locales/taiga/locale-pl.json b/dist/v-1521124836513/locales/taiga/locale-pl.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-pl.json rename to dist/v-1521124836513/locales/taiga/locale-pl.json diff --git a/dist/v-1520418874500/locales/taiga/locale-pt-br.json b/dist/v-1521124836513/locales/taiga/locale-pt-br.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-pt-br.json rename to dist/v-1521124836513/locales/taiga/locale-pt-br.json diff --git a/dist/v-1520418874500/locales/taiga/locale-ru.json b/dist/v-1521124836513/locales/taiga/locale-ru.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-ru.json rename to dist/v-1521124836513/locales/taiga/locale-ru.json diff --git a/dist/v-1520418874500/locales/taiga/locale-sv.json b/dist/v-1521124836513/locales/taiga/locale-sv.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-sv.json rename to dist/v-1521124836513/locales/taiga/locale-sv.json diff --git a/dist/v-1520418874500/locales/taiga/locale-tr.json b/dist/v-1521124836513/locales/taiga/locale-tr.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-tr.json rename to dist/v-1521124836513/locales/taiga/locale-tr.json diff --git a/dist/v-1520418874500/locales/taiga/locale-zh-hans.json b/dist/v-1521124836513/locales/taiga/locale-zh-hans.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-zh-hans.json rename to dist/v-1521124836513/locales/taiga/locale-zh-hans.json diff --git a/dist/v-1520418874500/locales/taiga/locale-zh-hant.json b/dist/v-1521124836513/locales/taiga/locale-zh-hant.json similarity index 100% rename from dist/v-1520418874500/locales/taiga/locale-zh-hant.json rename to dist/v-1521124836513/locales/taiga/locale-zh-hant.json diff --git a/dist/v-1520418874500/prism/prism-abap.min.js b/dist/v-1521124836513/prism/prism-abap.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-abap.min.js rename to dist/v-1521124836513/prism/prism-abap.min.js diff --git a/dist/v-1520418874500/prism/prism-actionscript.min.js b/dist/v-1521124836513/prism/prism-actionscript.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-actionscript.min.js rename to dist/v-1521124836513/prism/prism-actionscript.min.js diff --git a/dist/v-1520418874500/prism/prism-ada.min.js b/dist/v-1521124836513/prism/prism-ada.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-ada.min.js rename to dist/v-1521124836513/prism/prism-ada.min.js diff --git a/dist/v-1520418874500/prism/prism-apacheconf.min.js b/dist/v-1521124836513/prism/prism-apacheconf.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-apacheconf.min.js rename to dist/v-1521124836513/prism/prism-apacheconf.min.js diff --git a/dist/v-1520418874500/prism/prism-apl.min.js b/dist/v-1521124836513/prism/prism-apl.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-apl.min.js rename to dist/v-1521124836513/prism/prism-apl.min.js diff --git a/dist/v-1520418874500/prism/prism-applescript.min.js b/dist/v-1521124836513/prism/prism-applescript.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-applescript.min.js rename to dist/v-1521124836513/prism/prism-applescript.min.js diff --git a/dist/v-1520418874500/prism/prism-arduino.min.js b/dist/v-1521124836513/prism/prism-arduino.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-arduino.min.js rename to dist/v-1521124836513/prism/prism-arduino.min.js diff --git a/dist/v-1520418874500/prism/prism-asciidoc.min.js b/dist/v-1521124836513/prism/prism-asciidoc.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-asciidoc.min.js rename to dist/v-1521124836513/prism/prism-asciidoc.min.js diff --git a/dist/v-1520418874500/prism/prism-asm6502.min.js b/dist/v-1521124836513/prism/prism-asm6502.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-asm6502.min.js rename to dist/v-1521124836513/prism/prism-asm6502.min.js diff --git a/dist/v-1520418874500/prism/prism-aspnet.min.js b/dist/v-1521124836513/prism/prism-aspnet.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-aspnet.min.js rename to dist/v-1521124836513/prism/prism-aspnet.min.js diff --git a/dist/v-1520418874500/prism/prism-autohotkey.min.js b/dist/v-1521124836513/prism/prism-autohotkey.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-autohotkey.min.js rename to dist/v-1521124836513/prism/prism-autohotkey.min.js diff --git a/dist/v-1520418874500/prism/prism-autoit.min.js b/dist/v-1521124836513/prism/prism-autoit.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-autoit.min.js rename to dist/v-1521124836513/prism/prism-autoit.min.js diff --git a/dist/v-1520418874500/prism/prism-bash.min.js b/dist/v-1521124836513/prism/prism-bash.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-bash.min.js rename to dist/v-1521124836513/prism/prism-bash.min.js diff --git a/dist/v-1520418874500/prism/prism-basic.min.js b/dist/v-1521124836513/prism/prism-basic.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-basic.min.js rename to dist/v-1521124836513/prism/prism-basic.min.js diff --git a/dist/v-1520418874500/prism/prism-batch.min.js b/dist/v-1521124836513/prism/prism-batch.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-batch.min.js rename to dist/v-1521124836513/prism/prism-batch.min.js diff --git a/dist/v-1520418874500/prism/prism-bison.min.js b/dist/v-1521124836513/prism/prism-bison.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-bison.min.js rename to dist/v-1521124836513/prism/prism-bison.min.js diff --git a/dist/v-1520418874500/prism/prism-brainfuck.min.js b/dist/v-1521124836513/prism/prism-brainfuck.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-brainfuck.min.js rename to dist/v-1521124836513/prism/prism-brainfuck.min.js diff --git a/dist/v-1520418874500/prism/prism-bro.min.js b/dist/v-1521124836513/prism/prism-bro.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-bro.min.js rename to dist/v-1521124836513/prism/prism-bro.min.js diff --git a/dist/v-1520418874500/prism/prism-c.min.js b/dist/v-1521124836513/prism/prism-c.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-c.min.js rename to dist/v-1521124836513/prism/prism-c.min.js diff --git a/dist/v-1520418874500/prism/prism-clike.min.js b/dist/v-1521124836513/prism/prism-clike.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-clike.min.js rename to dist/v-1521124836513/prism/prism-clike.min.js diff --git a/dist/v-1520418874500/prism/prism-coffeescript.min.js b/dist/v-1521124836513/prism/prism-coffeescript.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-coffeescript.min.js rename to dist/v-1521124836513/prism/prism-coffeescript.min.js diff --git a/dist/v-1520418874500/prism/prism-core.min.js b/dist/v-1521124836513/prism/prism-core.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-core.min.js rename to dist/v-1521124836513/prism/prism-core.min.js diff --git a/dist/v-1520418874500/prism/prism-cpp.min.js b/dist/v-1521124836513/prism/prism-cpp.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-cpp.min.js rename to dist/v-1521124836513/prism/prism-cpp.min.js diff --git a/dist/v-1520418874500/prism/prism-crystal.min.js b/dist/v-1521124836513/prism/prism-crystal.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-crystal.min.js rename to dist/v-1521124836513/prism/prism-crystal.min.js diff --git a/dist/v-1520418874500/prism/prism-csharp.min.js b/dist/v-1521124836513/prism/prism-csharp.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-csharp.min.js rename to dist/v-1521124836513/prism/prism-csharp.min.js diff --git a/dist/v-1520418874500/prism/prism-csp.min.js b/dist/v-1521124836513/prism/prism-csp.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-csp.min.js rename to dist/v-1521124836513/prism/prism-csp.min.js diff --git a/dist/v-1520418874500/prism/prism-css-extras.min.js b/dist/v-1521124836513/prism/prism-css-extras.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-css-extras.min.js rename to dist/v-1521124836513/prism/prism-css-extras.min.js diff --git a/dist/v-1520418874500/prism/prism-css.min.js b/dist/v-1521124836513/prism/prism-css.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-css.min.js rename to dist/v-1521124836513/prism/prism-css.min.js diff --git a/dist/v-1520418874500/prism/prism-d.min.js b/dist/v-1521124836513/prism/prism-d.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-d.min.js rename to dist/v-1521124836513/prism/prism-d.min.js diff --git a/dist/v-1520418874500/prism/prism-dart.min.js b/dist/v-1521124836513/prism/prism-dart.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-dart.min.js rename to dist/v-1521124836513/prism/prism-dart.min.js diff --git a/dist/v-1520418874500/prism/prism-diff.min.js b/dist/v-1521124836513/prism/prism-diff.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-diff.min.js rename to dist/v-1521124836513/prism/prism-diff.min.js diff --git a/dist/v-1520418874500/prism/prism-django.min.js b/dist/v-1521124836513/prism/prism-django.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-django.min.js rename to dist/v-1521124836513/prism/prism-django.min.js diff --git a/dist/v-1520418874500/prism/prism-docker.min.js b/dist/v-1521124836513/prism/prism-docker.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-docker.min.js rename to dist/v-1521124836513/prism/prism-docker.min.js diff --git a/dist/v-1520418874500/prism/prism-eiffel.min.js b/dist/v-1521124836513/prism/prism-eiffel.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-eiffel.min.js rename to dist/v-1521124836513/prism/prism-eiffel.min.js diff --git a/dist/v-1520418874500/prism/prism-elixir.min.js b/dist/v-1521124836513/prism/prism-elixir.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-elixir.min.js rename to dist/v-1521124836513/prism/prism-elixir.min.js diff --git a/dist/v-1520418874500/prism/prism-elm.min.js b/dist/v-1521124836513/prism/prism-elm.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-elm.min.js rename to dist/v-1521124836513/prism/prism-elm.min.js diff --git a/dist/v-1520418874500/prism/prism-erlang.min.js b/dist/v-1521124836513/prism/prism-erlang.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-erlang.min.js rename to dist/v-1521124836513/prism/prism-erlang.min.js diff --git a/dist/v-1520418874500/prism/prism-flow.min.js b/dist/v-1521124836513/prism/prism-flow.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-flow.min.js rename to dist/v-1521124836513/prism/prism-flow.min.js diff --git a/dist/v-1520418874500/prism/prism-fortran.min.js b/dist/v-1521124836513/prism/prism-fortran.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-fortran.min.js rename to dist/v-1521124836513/prism/prism-fortran.min.js diff --git a/dist/v-1520418874500/prism/prism-fsharp.min.js b/dist/v-1521124836513/prism/prism-fsharp.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-fsharp.min.js rename to dist/v-1521124836513/prism/prism-fsharp.min.js diff --git a/dist/v-1520418874500/prism/prism-gherkin.min.js b/dist/v-1521124836513/prism/prism-gherkin.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-gherkin.min.js rename to dist/v-1521124836513/prism/prism-gherkin.min.js diff --git a/dist/v-1520418874500/prism/prism-git.min.js b/dist/v-1521124836513/prism/prism-git.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-git.min.js rename to dist/v-1521124836513/prism/prism-git.min.js diff --git a/dist/v-1520418874500/prism/prism-glsl.min.js b/dist/v-1521124836513/prism/prism-glsl.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-glsl.min.js rename to dist/v-1521124836513/prism/prism-glsl.min.js diff --git a/dist/v-1520418874500/prism/prism-go.min.js b/dist/v-1521124836513/prism/prism-go.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-go.min.js rename to dist/v-1521124836513/prism/prism-go.min.js diff --git a/dist/v-1520418874500/prism/prism-graphql.min.js b/dist/v-1521124836513/prism/prism-graphql.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-graphql.min.js rename to dist/v-1521124836513/prism/prism-graphql.min.js diff --git a/dist/v-1520418874500/prism/prism-groovy.min.js b/dist/v-1521124836513/prism/prism-groovy.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-groovy.min.js rename to dist/v-1521124836513/prism/prism-groovy.min.js diff --git a/dist/v-1520418874500/prism/prism-haml.min.js b/dist/v-1521124836513/prism/prism-haml.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-haml.min.js rename to dist/v-1521124836513/prism/prism-haml.min.js diff --git a/dist/v-1520418874500/prism/prism-handlebars.min.js b/dist/v-1521124836513/prism/prism-handlebars.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-handlebars.min.js rename to dist/v-1521124836513/prism/prism-handlebars.min.js diff --git a/dist/v-1520418874500/prism/prism-haskell.min.js b/dist/v-1521124836513/prism/prism-haskell.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-haskell.min.js rename to dist/v-1521124836513/prism/prism-haskell.min.js diff --git a/dist/v-1520418874500/prism/prism-haxe.min.js b/dist/v-1521124836513/prism/prism-haxe.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-haxe.min.js rename to dist/v-1521124836513/prism/prism-haxe.min.js diff --git a/dist/v-1520418874500/prism/prism-hpkp.min.js b/dist/v-1521124836513/prism/prism-hpkp.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-hpkp.min.js rename to dist/v-1521124836513/prism/prism-hpkp.min.js diff --git a/dist/v-1520418874500/prism/prism-hsts.min.js b/dist/v-1521124836513/prism/prism-hsts.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-hsts.min.js rename to dist/v-1521124836513/prism/prism-hsts.min.js diff --git a/dist/v-1520418874500/prism/prism-http.min.js b/dist/v-1521124836513/prism/prism-http.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-http.min.js rename to dist/v-1521124836513/prism/prism-http.min.js diff --git a/dist/v-1520418874500/prism/prism-ichigojam.min.js b/dist/v-1521124836513/prism/prism-ichigojam.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-ichigojam.min.js rename to dist/v-1521124836513/prism/prism-ichigojam.min.js diff --git a/dist/v-1520418874500/prism/prism-icon.min.js b/dist/v-1521124836513/prism/prism-icon.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-icon.min.js rename to dist/v-1521124836513/prism/prism-icon.min.js diff --git a/dist/v-1520418874500/prism/prism-inform7.min.js b/dist/v-1521124836513/prism/prism-inform7.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-inform7.min.js rename to dist/v-1521124836513/prism/prism-inform7.min.js diff --git a/dist/v-1520418874500/prism/prism-ini.min.js b/dist/v-1521124836513/prism/prism-ini.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-ini.min.js rename to dist/v-1521124836513/prism/prism-ini.min.js diff --git a/dist/v-1520418874500/prism/prism-io.min.js b/dist/v-1521124836513/prism/prism-io.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-io.min.js rename to dist/v-1521124836513/prism/prism-io.min.js diff --git a/dist/v-1520418874500/prism/prism-j.min.js b/dist/v-1521124836513/prism/prism-j.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-j.min.js rename to dist/v-1521124836513/prism/prism-j.min.js diff --git a/dist/v-1520418874500/prism/prism-java.min.js b/dist/v-1521124836513/prism/prism-java.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-java.min.js rename to dist/v-1521124836513/prism/prism-java.min.js diff --git a/dist/v-1520418874500/prism/prism-javascript.min.js b/dist/v-1521124836513/prism/prism-javascript.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-javascript.min.js rename to dist/v-1521124836513/prism/prism-javascript.min.js diff --git a/dist/v-1520418874500/prism/prism-jolie.min.js b/dist/v-1521124836513/prism/prism-jolie.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-jolie.min.js rename to dist/v-1521124836513/prism/prism-jolie.min.js diff --git a/dist/v-1520418874500/prism/prism-json.min.js b/dist/v-1521124836513/prism/prism-json.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-json.min.js rename to dist/v-1521124836513/prism/prism-json.min.js diff --git a/dist/v-1520418874500/prism/prism-jsx.min.js b/dist/v-1521124836513/prism/prism-jsx.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-jsx.min.js rename to dist/v-1521124836513/prism/prism-jsx.min.js diff --git a/dist/v-1520418874500/prism/prism-julia.min.js b/dist/v-1521124836513/prism/prism-julia.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-julia.min.js rename to dist/v-1521124836513/prism/prism-julia.min.js diff --git a/dist/v-1520418874500/prism/prism-keyman.min.js b/dist/v-1521124836513/prism/prism-keyman.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-keyman.min.js rename to dist/v-1521124836513/prism/prism-keyman.min.js diff --git a/dist/v-1520418874500/prism/prism-kotlin.min.js b/dist/v-1521124836513/prism/prism-kotlin.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-kotlin.min.js rename to dist/v-1521124836513/prism/prism-kotlin.min.js diff --git a/dist/v-1520418874500/prism/prism-languages.json b/dist/v-1521124836513/prism/prism-languages.json similarity index 100% rename from dist/v-1520418874500/prism/prism-languages.json rename to dist/v-1521124836513/prism/prism-languages.json diff --git a/dist/v-1520418874500/prism/prism-latex.min.js b/dist/v-1521124836513/prism/prism-latex.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-latex.min.js rename to dist/v-1521124836513/prism/prism-latex.min.js diff --git a/dist/v-1520418874500/prism/prism-less.min.js b/dist/v-1521124836513/prism/prism-less.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-less.min.js rename to dist/v-1521124836513/prism/prism-less.min.js diff --git a/dist/v-1520418874500/prism/prism-livescript.min.js b/dist/v-1521124836513/prism/prism-livescript.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-livescript.min.js rename to dist/v-1521124836513/prism/prism-livescript.min.js diff --git a/dist/v-1520418874500/prism/prism-lolcode.min.js b/dist/v-1521124836513/prism/prism-lolcode.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-lolcode.min.js rename to dist/v-1521124836513/prism/prism-lolcode.min.js diff --git a/dist/v-1520418874500/prism/prism-lua.min.js b/dist/v-1521124836513/prism/prism-lua.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-lua.min.js rename to dist/v-1521124836513/prism/prism-lua.min.js diff --git a/dist/v-1520418874500/prism/prism-makefile.min.js b/dist/v-1521124836513/prism/prism-makefile.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-makefile.min.js rename to dist/v-1521124836513/prism/prism-makefile.min.js diff --git a/dist/v-1520418874500/prism/prism-markdown.min.js b/dist/v-1521124836513/prism/prism-markdown.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-markdown.min.js rename to dist/v-1521124836513/prism/prism-markdown.min.js diff --git a/dist/v-1520418874500/prism/prism-markup.min.js b/dist/v-1521124836513/prism/prism-markup.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-markup.min.js rename to dist/v-1521124836513/prism/prism-markup.min.js diff --git a/dist/v-1520418874500/prism/prism-matlab.min.js b/dist/v-1521124836513/prism/prism-matlab.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-matlab.min.js rename to dist/v-1521124836513/prism/prism-matlab.min.js diff --git a/dist/v-1520418874500/prism/prism-mel.min.js b/dist/v-1521124836513/prism/prism-mel.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-mel.min.js rename to dist/v-1521124836513/prism/prism-mel.min.js diff --git a/dist/v-1520418874500/prism/prism-mizar.min.js b/dist/v-1521124836513/prism/prism-mizar.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-mizar.min.js rename to dist/v-1521124836513/prism/prism-mizar.min.js diff --git a/dist/v-1520418874500/prism/prism-monkey.min.js b/dist/v-1521124836513/prism/prism-monkey.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-monkey.min.js rename to dist/v-1521124836513/prism/prism-monkey.min.js diff --git a/dist/v-1520418874500/prism/prism-n4js.min.js b/dist/v-1521124836513/prism/prism-n4js.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-n4js.min.js rename to dist/v-1521124836513/prism/prism-n4js.min.js diff --git a/dist/v-1520418874500/prism/prism-nasm.min.js b/dist/v-1521124836513/prism/prism-nasm.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-nasm.min.js rename to dist/v-1521124836513/prism/prism-nasm.min.js diff --git a/dist/v-1520418874500/prism/prism-nginx.min.js b/dist/v-1521124836513/prism/prism-nginx.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-nginx.min.js rename to dist/v-1521124836513/prism/prism-nginx.min.js diff --git a/dist/v-1520418874500/prism/prism-nim.min.js b/dist/v-1521124836513/prism/prism-nim.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-nim.min.js rename to dist/v-1521124836513/prism/prism-nim.min.js diff --git a/dist/v-1520418874500/prism/prism-nix.min.js b/dist/v-1521124836513/prism/prism-nix.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-nix.min.js rename to dist/v-1521124836513/prism/prism-nix.min.js diff --git a/dist/v-1520418874500/prism/prism-nsis.min.js b/dist/v-1521124836513/prism/prism-nsis.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-nsis.min.js rename to dist/v-1521124836513/prism/prism-nsis.min.js diff --git a/dist/v-1520418874500/prism/prism-objectivec.min.js b/dist/v-1521124836513/prism/prism-objectivec.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-objectivec.min.js rename to dist/v-1521124836513/prism/prism-objectivec.min.js diff --git a/dist/v-1520418874500/prism/prism-ocaml.min.js b/dist/v-1521124836513/prism/prism-ocaml.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-ocaml.min.js rename to dist/v-1521124836513/prism/prism-ocaml.min.js diff --git a/dist/v-1520418874500/prism/prism-opencl.min.js b/dist/v-1521124836513/prism/prism-opencl.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-opencl.min.js rename to dist/v-1521124836513/prism/prism-opencl.min.js diff --git a/dist/v-1520418874500/prism/prism-oz.min.js b/dist/v-1521124836513/prism/prism-oz.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-oz.min.js rename to dist/v-1521124836513/prism/prism-oz.min.js diff --git a/dist/v-1520418874500/prism/prism-parigp.min.js b/dist/v-1521124836513/prism/prism-parigp.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-parigp.min.js rename to dist/v-1521124836513/prism/prism-parigp.min.js diff --git a/dist/v-1520418874500/prism/prism-parser.min.js b/dist/v-1521124836513/prism/prism-parser.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-parser.min.js rename to dist/v-1521124836513/prism/prism-parser.min.js diff --git a/dist/v-1520418874500/prism/prism-pascal.min.js b/dist/v-1521124836513/prism/prism-pascal.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-pascal.min.js rename to dist/v-1521124836513/prism/prism-pascal.min.js diff --git a/dist/v-1520418874500/prism/prism-perl.min.js b/dist/v-1521124836513/prism/prism-perl.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-perl.min.js rename to dist/v-1521124836513/prism/prism-perl.min.js diff --git a/dist/v-1520418874500/prism/prism-php-extras.min.js b/dist/v-1521124836513/prism/prism-php-extras.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-php-extras.min.js rename to dist/v-1521124836513/prism/prism-php-extras.min.js diff --git a/dist/v-1520418874500/prism/prism-php.min.js b/dist/v-1521124836513/prism/prism-php.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-php.min.js rename to dist/v-1521124836513/prism/prism-php.min.js diff --git a/dist/v-1520418874500/prism/prism-powershell.min.js b/dist/v-1521124836513/prism/prism-powershell.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-powershell.min.js rename to dist/v-1521124836513/prism/prism-powershell.min.js diff --git a/dist/v-1520418874500/prism/prism-processing.min.js b/dist/v-1521124836513/prism/prism-processing.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-processing.min.js rename to dist/v-1521124836513/prism/prism-processing.min.js diff --git a/dist/v-1520418874500/prism/prism-prolog.min.js b/dist/v-1521124836513/prism/prism-prolog.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-prolog.min.js rename to dist/v-1521124836513/prism/prism-prolog.min.js diff --git a/dist/v-1520418874500/prism/prism-properties.min.js b/dist/v-1521124836513/prism/prism-properties.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-properties.min.js rename to dist/v-1521124836513/prism/prism-properties.min.js diff --git a/dist/v-1520418874500/prism/prism-protobuf.min.js b/dist/v-1521124836513/prism/prism-protobuf.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-protobuf.min.js rename to dist/v-1521124836513/prism/prism-protobuf.min.js diff --git a/dist/v-1520418874500/prism/prism-pug.min.js b/dist/v-1521124836513/prism/prism-pug.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-pug.min.js rename to dist/v-1521124836513/prism/prism-pug.min.js diff --git a/dist/v-1520418874500/prism/prism-puppet.min.js b/dist/v-1521124836513/prism/prism-puppet.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-puppet.min.js rename to dist/v-1521124836513/prism/prism-puppet.min.js diff --git a/dist/v-1520418874500/prism/prism-pure.min.js b/dist/v-1521124836513/prism/prism-pure.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-pure.min.js rename to dist/v-1521124836513/prism/prism-pure.min.js diff --git a/dist/v-1520418874500/prism/prism-python.min.js b/dist/v-1521124836513/prism/prism-python.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-python.min.js rename to dist/v-1521124836513/prism/prism-python.min.js diff --git a/dist/v-1520418874500/prism/prism-q.min.js b/dist/v-1521124836513/prism/prism-q.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-q.min.js rename to dist/v-1521124836513/prism/prism-q.min.js diff --git a/dist/v-1520418874500/prism/prism-qore.min.js b/dist/v-1521124836513/prism/prism-qore.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-qore.min.js rename to dist/v-1521124836513/prism/prism-qore.min.js diff --git a/dist/v-1520418874500/prism/prism-r.min.js b/dist/v-1521124836513/prism/prism-r.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-r.min.js rename to dist/v-1521124836513/prism/prism-r.min.js diff --git a/dist/v-1520418874500/prism/prism-reason.min.js b/dist/v-1521124836513/prism/prism-reason.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-reason.min.js rename to dist/v-1521124836513/prism/prism-reason.min.js diff --git a/dist/v-1520418874500/prism/prism-renpy.min.js b/dist/v-1521124836513/prism/prism-renpy.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-renpy.min.js rename to dist/v-1521124836513/prism/prism-renpy.min.js diff --git a/dist/v-1520418874500/prism/prism-rest.min.js b/dist/v-1521124836513/prism/prism-rest.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-rest.min.js rename to dist/v-1521124836513/prism/prism-rest.min.js diff --git a/dist/v-1520418874500/prism/prism-rip.min.js b/dist/v-1521124836513/prism/prism-rip.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-rip.min.js rename to dist/v-1521124836513/prism/prism-rip.min.js diff --git a/dist/v-1520418874500/prism/prism-roboconf.min.js b/dist/v-1521124836513/prism/prism-roboconf.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-roboconf.min.js rename to dist/v-1521124836513/prism/prism-roboconf.min.js diff --git a/dist/v-1520418874500/prism/prism-ruby.min.js b/dist/v-1521124836513/prism/prism-ruby.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-ruby.min.js rename to dist/v-1521124836513/prism/prism-ruby.min.js diff --git a/dist/v-1520418874500/prism/prism-rust.min.js b/dist/v-1521124836513/prism/prism-rust.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-rust.min.js rename to dist/v-1521124836513/prism/prism-rust.min.js diff --git a/dist/v-1520418874500/prism/prism-sas.min.js b/dist/v-1521124836513/prism/prism-sas.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-sas.min.js rename to dist/v-1521124836513/prism/prism-sas.min.js diff --git a/dist/v-1520418874500/prism/prism-sass.min.js b/dist/v-1521124836513/prism/prism-sass.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-sass.min.js rename to dist/v-1521124836513/prism/prism-sass.min.js diff --git a/dist/v-1520418874500/prism/prism-scala.min.js b/dist/v-1521124836513/prism/prism-scala.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-scala.min.js rename to dist/v-1521124836513/prism/prism-scala.min.js diff --git a/dist/v-1520418874500/prism/prism-scheme.min.js b/dist/v-1521124836513/prism/prism-scheme.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-scheme.min.js rename to dist/v-1521124836513/prism/prism-scheme.min.js diff --git a/dist/v-1520418874500/prism/prism-scss.min.js b/dist/v-1521124836513/prism/prism-scss.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-scss.min.js rename to dist/v-1521124836513/prism/prism-scss.min.js diff --git a/dist/v-1520418874500/prism/prism-smalltalk.min.js b/dist/v-1521124836513/prism/prism-smalltalk.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-smalltalk.min.js rename to dist/v-1521124836513/prism/prism-smalltalk.min.js diff --git a/dist/v-1520418874500/prism/prism-smarty.min.js b/dist/v-1521124836513/prism/prism-smarty.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-smarty.min.js rename to dist/v-1521124836513/prism/prism-smarty.min.js diff --git a/dist/v-1520418874500/prism/prism-sql.min.js b/dist/v-1521124836513/prism/prism-sql.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-sql.min.js rename to dist/v-1521124836513/prism/prism-sql.min.js diff --git a/dist/v-1520418874500/prism/prism-stylus.min.js b/dist/v-1521124836513/prism/prism-stylus.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-stylus.min.js rename to dist/v-1521124836513/prism/prism-stylus.min.js diff --git a/dist/v-1520418874500/prism/prism-swift.min.js b/dist/v-1521124836513/prism/prism-swift.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-swift.min.js rename to dist/v-1521124836513/prism/prism-swift.min.js diff --git a/dist/v-1520418874500/prism/prism-tcl.min.js b/dist/v-1521124836513/prism/prism-tcl.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-tcl.min.js rename to dist/v-1521124836513/prism/prism-tcl.min.js diff --git a/dist/v-1520418874500/prism/prism-textile.min.js b/dist/v-1521124836513/prism/prism-textile.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-textile.min.js rename to dist/v-1521124836513/prism/prism-textile.min.js diff --git a/dist/v-1520418874500/prism/prism-tsx.min.js b/dist/v-1521124836513/prism/prism-tsx.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-tsx.min.js rename to dist/v-1521124836513/prism/prism-tsx.min.js diff --git a/dist/v-1520418874500/prism/prism-twig.min.js b/dist/v-1521124836513/prism/prism-twig.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-twig.min.js rename to dist/v-1521124836513/prism/prism-twig.min.js diff --git a/dist/v-1520418874500/prism/prism-typescript.min.js b/dist/v-1521124836513/prism/prism-typescript.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-typescript.min.js rename to dist/v-1521124836513/prism/prism-typescript.min.js diff --git a/dist/v-1520418874500/prism/prism-vbnet.min.js b/dist/v-1521124836513/prism/prism-vbnet.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-vbnet.min.js rename to dist/v-1521124836513/prism/prism-vbnet.min.js diff --git a/dist/v-1520418874500/prism/prism-verilog.min.js b/dist/v-1521124836513/prism/prism-verilog.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-verilog.min.js rename to dist/v-1521124836513/prism/prism-verilog.min.js diff --git a/dist/v-1520418874500/prism/prism-vhdl.min.js b/dist/v-1521124836513/prism/prism-vhdl.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-vhdl.min.js rename to dist/v-1521124836513/prism/prism-vhdl.min.js diff --git a/dist/v-1520418874500/prism/prism-vim.min.js b/dist/v-1521124836513/prism/prism-vim.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-vim.min.js rename to dist/v-1521124836513/prism/prism-vim.min.js diff --git a/dist/v-1520418874500/prism/prism-wiki.min.js b/dist/v-1521124836513/prism/prism-wiki.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-wiki.min.js rename to dist/v-1521124836513/prism/prism-wiki.min.js diff --git a/dist/v-1520418874500/prism/prism-xeora.min.js b/dist/v-1521124836513/prism/prism-xeora.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-xeora.min.js rename to dist/v-1521124836513/prism/prism-xeora.min.js diff --git a/dist/v-1520418874500/prism/prism-xojo.min.js b/dist/v-1521124836513/prism/prism-xojo.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-xojo.min.js rename to dist/v-1521124836513/prism/prism-xojo.min.js diff --git a/dist/v-1520418874500/prism/prism-yaml.min.js b/dist/v-1521124836513/prism/prism-yaml.min.js similarity index 100% rename from dist/v-1520418874500/prism/prism-yaml.min.js rename to dist/v-1521124836513/prism/prism-yaml.min.js diff --git a/dist/v-1520418874500/styles/theme-high-contrast.css b/dist/v-1521124836513/styles/theme-high-contrast.css similarity index 90% rename from dist/v-1520418874500/styles/theme-high-contrast.css rename to dist/v-1521124836513/styles/theme-high-contrast.css index e644f9f..dd4802f 100644 --- a/dist/v-1520418874500/styles/theme-high-contrast.css +++ b/dist/v-1521124836513/styles/theme-high-contrast.css @@ -1,4 +1,4 @@ @charset "UTF-8";.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;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!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;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.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;content:'';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-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;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-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{box-sizing:content-box;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-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.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-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.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;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;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}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.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}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}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}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{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}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}.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}.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-select{display:inline-block}.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}.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}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.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}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.backlog-filter,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}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{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}.backlog-table-body .user-story-name span,h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{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:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@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 b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal}h2{line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}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{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.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}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#212121;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#212121;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],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=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{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}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#000;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #c1c1c1}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#212121;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(110,110,110,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#000;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.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-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#757575;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#757575}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;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;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.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{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#212121;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff}.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)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#c1c1c1}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-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}.error-main a{color:#212121}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#757575}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #b7b7b7;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#757575}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#c1c1c1;color:#757575}.menu-button span,.menu-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:#c1c1c1}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#000;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.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}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#000;display:inline-block;margin-top:.5rem}.button-filter{background:#c1c1c1;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#757575;fill:#c1c1c1}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#ff2400;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#bcbcbc;border:1px dashed #adadad;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#adadad;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#adadad;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#a8a8a8;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;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:#212121;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#757575}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-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}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff0062;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#212121;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#757575;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#000}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(117,117,117,.2);color:#757575;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(33,33,33,.9);color:#c1c1c1}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(0,0,0,.5);border-bottom:0;color:#c1c1c1}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;background:#212121;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#212121}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;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;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;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;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#000}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#757575;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #212121;color:#212121}.history-tabs .order-comments{color:#212121}.level{background-color:#757575;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#757575}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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 .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-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 .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #c1c1c1;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#757575}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#757575}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#ff2400;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#757575}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{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;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#757575;margin-left:.25rem}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;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);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(117,117,117,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.paginator .active span,.paginator a,.paginator a:hover{transition:all .3s linear;color:#fff}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#757575;padding:.5rem 1rem}.paginator .active span,.paginator a:hover,.select-color{background:#212121}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#757575;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;position:absolute;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;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;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{background:#212121;content:'';height:15px;left:-7px;position:absolute;top:13px;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 .empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#c1c1c1;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.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}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#212121;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#000}.summary .stats svg{height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#424242;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.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{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-ms-flex-line-pack:center;align-content:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#000;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#000;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#000;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(33,33,33,.4)}.track-button.active .icon{fill:#000}.track-button.active .track-button-counter{background:rgba(33,33,33,.6)}.track-button.is-hover .track-inner{background:#ff5033;color:#c1c1c1;transition:background .2s}.track-button.is-hover .icon{fill:#ff0062}.track-icon,.watch-options .watch-check svg{fill:#212121}.track-button.is-hover .track-button-counter{background:#ff2400;color:#c1c1c1;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#c1c1c1;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#b4b4b4;transition:background .3s}.track-icon{margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#b4b4b4;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#c1c1c1;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#b4b4b4;transition:background .3s}.watch-options{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{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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(117,117,117,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options .watch-check{height:1.25rem;width:1.25rem}.upvote-btn a.active svg,.upvote-btn a:hover path{fill:#000}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#757575;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#000;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#c1c1c1}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#212121;margin-left:.5rem}.upvote-btn a.is-hover svg{fill:#ff0062;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#757575;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.assigned-to-list .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:flex}.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#212121;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#ff2400}.ticket-watchers .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#ff2400;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .admin-subtitle a{color:#000}.admin-common .admin-subtitle a:hover{color:#212121}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#c1c1c1;color:#212121;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;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 #c1c1c1}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(33,33,33,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;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:#757575}.custom-fields-table .single-custom-field{border-bottom:1px solid #c1c1c1;color:#757575}.custom-fields-table .icon-drag{fill:#757575;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#757575;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#000;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff0062}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#000;fill:#000}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#757575}.admin-functionalities .module-name{font-size:1.2rem;color:#757575;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#757575;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#757575}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#000}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff0062;display:inline-block;padding-left:.3rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-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:#c1c1c1}.admin-membership-table .resend{background-color:#000;color:#fff}.admin-membership-table .resend:hover{background-color:#212121;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#757575;transition:fill .2s}.admin-membership-table .delete:hover{fill:#ff2400}.admin-membership-table .pending{color:#ff0062}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #a8a8a8}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.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{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#757575;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#ff2400}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink: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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #c1c1c1;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #c1c1c1;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#757575;margin-left:.5rem}.project-details .get-feedback-inner .check,.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{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.backlog-table-body .loading img,.lightbox-generic-loading .spin img,.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#757575;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;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 .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#212121;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(33,33,33,.4);color:#212121}.project-privacy-settings label:hover svg{fill:#212121}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#212121;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#212121;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#757575}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#000}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff0062;border-radius:6px;color:#ff0062;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#000}.admin-project-profile-owner-actions a:hover{color:#212121;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#757575}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#212121}.admin-roles .icon:hover{fill:#000;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#757575;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#757575;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#c1c1c1;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#ff2400;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#080808;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#1a1a1a;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #c1c1c1}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#757575;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#000;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#212121}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#757575}.admin-webhooks .webhook-options svg:hover{fill:#000;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #c1c1c1;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(33,33,33,.1);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{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#212121}.admin-webhooks .history-response-icon.history-error{background:#ff2400}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#757575}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#212121;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{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-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{font-size:.9rem;color:#757575;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.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 #c1c1c1;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.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{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#757575;opacity:0}.project-values-row .icon:hover{fill:#212121;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #c1c1c1}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#999;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff0062}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.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{color:#212121;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#212121;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#757575}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#757575}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#212121;fill:#212121}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.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{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#212121;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;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:#212121;content:'';height:15px;position:absolute;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{color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#212121;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;position:absolute;background:#212121}.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:#212121;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #212121;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{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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;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:#212121;content:'';height:15px;position:absolute;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 .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:#212121;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #757575;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#757575}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #b7b7b7;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#999;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#757575;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#c1c1c1}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#999;transition:background .2s ease-in}.backlog-table-body input:checked{color:#212121;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff0062;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#ff2400;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 .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#212121}.backlog-table-body .icon-drag{cursor:move;fill:#757575;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#000;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#212121}.sprints .add-sprint svg{fill:#c1c1c1;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#757575}.sprints .sprint svg:hover{fill:#000;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#757575;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#212121;transition:color .2s}.sprints .sprint-progress-bar{background:#757575;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#000;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#b4b4b4;border:2px dashed #8f8f8f;color:#757575;padding:1rem;text-align:center}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #757575}.sprints .sprint-table .row{border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(117,117,117,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #757575}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#949494;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#828282}.sprints .sprint-table .us-name.blocked{color:#ff2400}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#828282}.sprints .sprint-table .column-points.blocked{color:#ff2400}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.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{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#757575}.sprint-closed .sprint-progress-bar .current-progress{background:#5c5c5c}.sprint-closed .button-gray{background:#757575}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#000}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items: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-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,36,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 svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,36,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#757575}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#000}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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:#212121;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-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:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#000;cursor:default}.category-config .resume,.colors-table .row.edition .current-color,.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{cursor:pointer;fill:#ff2400;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#000}.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:#000}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#757575;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#757575;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#000}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#c1c1c1;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #c1c1c1}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(110,110,110,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-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{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.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:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#c1c1c1;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#757575;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#212121;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#000;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#000;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff0062}.colors-table .gu-mirror{background:#999;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#757575}.duty-custom-fields .custom-field-options svg:hover{fill:#000}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-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{font-size:.9rem;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff0062}.external-reference{font-size:.9rem;color:#757575;margin-top:.5rem}.external-reference a{border-left:1px solid #757575;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#000}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff0062}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#c1c1c1}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #757575;color:#212121;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#212121;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#212121;border:1px solid #000}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff0062;border:1px solid #ff2400}.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:#000;border:1px solid #000;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#757575;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#ff2400}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.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-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#ff2400;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .subtitle{white-space:pre-line}.lightbox-generic-ask .options{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{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-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{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow: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{margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#b4b4b4;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#212121;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#b4b4b4;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#000}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-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-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff0062}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.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{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#757575;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#212121;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);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 .item{font-size:1.2rem}.main-nav .active{color:#212121}.main-nav .active svg path{fill:#212121;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#212121}.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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-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 .iocaine{background:rgba(33,33,33,.1);border-left:10px solid #212121}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;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 .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#212121}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #c1c1c1;color:#c1c1c1}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#c1c1c1}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#c1c1c1;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#212121;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#212121}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#000}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff0062}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;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{width:.8rem;height:.8rem;fill:#757575;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #212121;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#212121;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(33,33,33,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#8e8e8e;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#a8a8a8;transition:background .2s ease-in}.ticket-status .type-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#757575;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#212121}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#ff2400;color:#c1c1c1;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff0062}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#212121}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff0062}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-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:#757575;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;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:#757575}.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:#ff0062}.ticket-detail-settings .item-unblock:hover{background:#ff2400}.ticket-detail-settings .button-delete{background:#ff0062}.ticket-detail-settings .button-delete:hover{background:#ff2400}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(193,193,193,.2) 100%);background-color:#c1c1c1}.introjs-helperLayer{border:1px solid rgba(33,33,33,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(33,33,33,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#212121}.introjs-button{background-color:#000;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:#212121;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{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{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-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:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#757575}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-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{-ms-flex:1;flex:1;-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 .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#a6a6a6;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ff66a1}.issues-table .row.is-blocked .blocked-text{color:#ff2400;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #b7b7b7}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#212121;transition:all .2s linear}.issues-table .votes:hover svg{fill:#212121;transition:all .2s linear}.issues-table .votes.inactive{color:#757575}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#757575;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#212121;transition:all .2s linear}.issues-table .is-voted svg{fill:#212121;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff0062}.issues-table .is-voted:hover svg{fill:#ff0062;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-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;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{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#212121;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;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}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-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{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#757575;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#000}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#757575;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#ff2400;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #212121,2px 2px 4px #a8a8a8}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#bcbcbc;border:1px dashed #adadad;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #c1c1c1}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#adadad}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#757575;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;color:#212121;position:relative;top:1px}.search-filter a.active .icon{fill:#212121}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#212121;color:#fff}.search-in input::-webkit-input-placeholder{color:#757575}.search-in input::-moz-placeholder{color:#757575}.search-in input:-moz-placeholder{color:#757575}.search-in input:-ms-input-placeholder{color:#757575}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#757575}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#999;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.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{font-size:1rem;color:#757575}.search-result-table .user-story-name .icon:hover{color:#212121;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #c1c1c1}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;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}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#000;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#212121}.table-team .attribute .top{fill:#212121;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff0062}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#ff2400}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #c1c1c1;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data 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 .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#212121;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #757575}.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{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#000;transition:background .3s linear}.policy-table label{background:#757575;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#212121;cursor:pointer;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-Regular,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{max-width:780px}.user-profile form{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{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.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;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#ff2400}.user-profile .project-details-form-data{-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{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#212121}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#757575;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #757575}.wiki-nav input[type=text]{background:#c1c1c1;color:#212121;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#757575}.wiki-nav input[type=text]::-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-ms-input-placeholder{color:#757575}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#757575;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#ff2400}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#757575;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff0062}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-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-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#757575}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff0062}.attachment-gallery .icon-delete:hover svg{color:#ff2400}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span,.attachment-list .editable-attachment-deprecated span,.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#757575}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#757575;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#000}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#ff2400}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.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{margin-bottom:4rem}.attachments .gu-transit{background:#c1c1c1;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#212121;line-height:36px;padding:0 1rem}.attachments-header .options{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;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#212121}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.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;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #c1c1c1;color:#757575;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.single-attachment .attachment-size{color:#757575}.more-attachments{font-size:.9rem;border-bottom:1px solid #757575;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#000;margin-left:.5rem}.more-attachments:hover{background:#999;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#757575}.attachment-preview .attachment-preview-container svg:hover{fill:#212121;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer}.assignable-member-single:hover{background:rgba(33,33,33,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.05);border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff0062;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#ff2400}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#050505}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-ms-fill-lower{background:#c1c1c1}.range-slider:focus::-ms-fill-upper{background:#c6c6c6}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#bcbcbc;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#c1c1c1;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #a8a8a8;cursor:move;display:block;margin:0 .6rem .6rem;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #a8a8a8}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff0062}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,0,98,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#757575}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#212121}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem 1rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#757575;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-statistics{font-size:.9rem;color:#b5b5b5;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#212121}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b5b5b5;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#c1c1c1;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#212121;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#c1c1c1}.card-tasks{border-top:1px solid #c1c1c1;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #c1c1c1}.card-task a{color:#757575;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff0062}.card-task a.closed-task{color:#757575;text-decoration:line-through}.card-task a:hover{color:#000}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(33,33,33,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #757575;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#ff2400;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#757575;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg{width:1.25rem;height:1.25rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.edit-title-wrapper .edit-title-button:hover{fill:#000}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav a{display:inline-block}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(0,0,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#212121;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#757575}tg-filter input::-moz-placeholder{color:#757575}tg-filter input:-moz-placeholder{color:#757575}tg-filter input:-ms-input-placeholder{color:#757575}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #757575;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#000}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#a8a8a8;color:#212121;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#b4b4b4;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#adadad;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#212121;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#8e8e8e;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#ff2400}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-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 .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.tag,.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#757575;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#212121;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#000}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #757575;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#a1a1a1;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#757575;cursor:pointer}.add-tag-button:hover,.tag{color:#212121}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.add-tag-button .add-tag-text{font-size:.9rem}.tag{font-size:.9rem;border-radius:0 5px 5px 0;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff0062;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(33,33,33,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff0062;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#ff2400}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#000;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-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 a{color:#000;cursor:pointer}.wysiwyg a:hover{color:#212121}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#c1c1c1;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #757575;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.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}.wysiwyg hr{border:1px solid #c1c1c1}.medium-editor-mention-panel{background-color:#fff;border:1px solid #757575;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #757575;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#000;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#ff2400}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#757575}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#757575;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#757575;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#757575;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #757575}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#212121}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#212121}.discover-header{background:url(../images/discover.png) bottom left repeat-x #c1c1c1;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 .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#000}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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:#212121}.discover-header input[type=text]:-webkit-autofill{background:rgba(0,0,0,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#757575;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#000}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#757575;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#000}.filter-discover-search .discover-search-filter.active svg{fill:#000}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff0062;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#ff2400}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#757575;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#212121;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#212121;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#000}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#000}.featured-project .project-card-name a:hover{color:#212121}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-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{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#757575;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#757575;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#212121;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-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 #c1c1c1;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#757575;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;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 .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(33,33,33,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-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{-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{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#000}.highlighted-project .project-title a:hover{color:#212121}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#000}.highlighted-project .statistic.active svg{fill:#000}.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:#757575;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#212121;color:#fff}.discover-search .searchbox-filters label:hover{background:#c1c1c1;color:#757575}.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 #757575;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#757575;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#000}.discover-results .statistic.active svg{fill:#000}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#000;border:1px solid #000;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #757575;color:#757575;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#212121;border:1px solid #000;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff0062;border:1px solid #ff2400}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(33,33,33,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,0,98,.5)}.epic-row.is-closed .name a{color:#9b9b9b;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#757575;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#212121;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#212121;fill:#212121}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#757575}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #212121;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#212121;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#000;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;color:#757575}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(33,33,33,.05)}.story-row.is-blocked{background:rgba(255,0,98,.5)}.story-row.is-closed .name{color:#757575;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#212121;width:10vw}.story-row .vote.is-voter{color:#212121;fill:#212121}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#212121;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#212121}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(193,193,193,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(33,33,33,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#212121;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#212121;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#212121;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#212121}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(33,33,33,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #c1c1c1;color:#c1c1c1}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#c1c1c1}tg-related-userstory-row .closed .userstory-name a{color:#c1c1c1;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff0062}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.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:-ms-flexbox;display:flex}.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 h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;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%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #757575;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #c1c1c1}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#000;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#757575}.comment .comment-edited{font-size:.9rem;background:#c1c1c1;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#000;fill:#000}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options .icon-close,.comment .comment-options .icon-edit{fill:#757575;margin-right:.5rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close:hover{fill:#ff2400}.comment .comment-options .icon-trash{fill:#ff0062}.comment .comment-options .icon-trash:hover{fill:#ff2400}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#757575;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#000;fill:#000;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#000;fill:#000}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#000;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#757575}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#000;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#c1c1c1;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#757575;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(84,84,84,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,0,98,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#000;margin-right:.5rem}.activity .activity-date{color:#757575}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #c1c1c1;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(33,33,33,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,0,98,.2);color:#ff2400}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#000}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#000}.home-project .project-card-name a:hover{color:#212121}.home-project:hover{border:1px solid rgba(33,33,33,.2);box-shadow:0 0 5px #c1c1c1}.home-project.blocked-project{border:#c1c1c1}.home-project.blocked-project:hover{border:#c1c1c1;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#c1c1c1;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.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 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #c1c1c1;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#b4b4b4;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #c1c1c1;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff0062;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#ff2400}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#212121;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#212121}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#757575;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#212121;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(33,33,33,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(0,0,0,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a:hover svg{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;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{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}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff0062;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#757575;display:block;padding:.8rem .5rem}.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{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #c1c1c1}.profile-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #c1c1c1}.profile-filter .searchbox input:focus{border-bottom:1px solid #757575;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#757575;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;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 .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-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{fill:#c1c1c1;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#757575;font-size:.9rem;margin:0}.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);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);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:#757575;transition:all .2s linear}.profile-bar .flag:hover path{fill:#ff2400;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .location,.profile-bar .username,.profile-bar h2{margin-bottom:1rem;color:#757575}.profile-bar h2{font-size:1.6rem;line-height:1.2}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#757575}.profile-bar .profile-stats{border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-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{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.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:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#212121}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#000}.profile-content-tabs .icon{fill:#757575;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#757575;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem}.profile-sidebar a{color:#000}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#000;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#757575;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#212121}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#757575;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-import-type input:disabled+label .icon{color:#9b9b9b}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-privacity input:disabled+label .icon{color:#9b9b9b}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #c1c1c1}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#000;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#212121}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#000;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#757575;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#212121}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#c1c1c1;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#ff2400}.import-project-members-match{color:#757575}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #000;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(33,33,33,.3)}.import-project-members-match-true svg{fill:#000}.import-project-members-match-false{border:1px solid #ff2400;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,36,0,.3)}.import-project-members-match-false svg{fill:#ff2400}.import-project-members-choose{color:#000;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#212121}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #c1c1c1;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(0,0,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #c1c1c1}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#000;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#000;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#212121;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#212121;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#757575;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#212121}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(0,0,0,.6);stroke:rgba(0,0,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#c1c1c1;stroke:#a8a8a8;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#ff2400;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff0062;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#000}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#757575;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#212121}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #c1c1c1}.import-project-trello-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#212121}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#212121}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#757575;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(33,33,33,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#757575;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#c9c9c9;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#a1a1a1;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#757575;margin-right:.5rem}.transfer-project-statistics svg{fill:#757575;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#000;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#212121}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#757575}.transfer-project-comment-header .icon-close:hover{fill:#ff0062;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #c1c1c1;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:#000}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#212121}.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{-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#757575;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;-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#757575}a:hover,body,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{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#212121;margin-right:.5rem}.main-nav svg,.navbar a svg,.summary .stats svg{fill:#fff}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}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{color:#212121;font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=url],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=url]::-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=url]::-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=url]:-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=url]:-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=url].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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}.home-project-list li,.tag{border:1px solid #000}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff}.summary{background:#212121}.navbar{background:#000}.navbar::after{background:url(../images/menu-vert.png) top left}.home-project-list p,.watch-options a.active,.working-on-container .list-itemtype-ticket .ticket-project,.working-on-container .list-itemtype-ticket .ticket-status,.working-on-container .list-itemtype-ticket .ticket-type{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active svg,.taskboard-table-header .task-colum-name .icon{fill:#000}.main-nav .active{background:#fff}.single-project .title{background:#c1c1c1;color:#000}.summary .data .number,.wiki-summary .username{color:#fff}.activity-item p,.drag-drop-help,.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,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}.wiki-content.editable:hover .wysiwyg{background:#fff;border:1px solid}.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:#fff}.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,.us-story-main-data .us-title .us-name{color:#000}.us-story-main-data .us-title{background:#fff}.login-main,.login-main a{color:#fff}.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,.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete,.home-wrapper .title-bar{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000} \ No newline at end of file + */.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}.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}.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-select{display:inline-block}.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}.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}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.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}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.backlog-filter,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}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{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}.backlog-table-body .user-story-name span,h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{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:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@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 b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal}h2{line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}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{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.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}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#212121;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#212121;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],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=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{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}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#000;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #c1c1c1}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#212121;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(110,110,110,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#000;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.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-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#757575;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#757575}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;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;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.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{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#212121;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff}.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)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#c1c1c1}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-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}.error-main a{color:#212121}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#757575}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #b7b7b7;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#757575}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#c1c1c1;color:#757575}.menu-button span,.menu-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:#c1c1c1}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#000;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.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}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#000;display:inline-block;margin-top:.5rem}.button-filter{background:#c1c1c1;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#757575;fill:#c1c1c1}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#ff2400;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#bcbcbc;border:1px dashed #adadad;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#adadad;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#adadad;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#a8a8a8;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;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:#212121;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#757575}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-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}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff0062;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#212121;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#757575;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#000}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(117,117,117,.2);color:#757575;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(33,33,33,.9);color:#c1c1c1}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(0,0,0,.5);border-bottom:0;color:#c1c1c1}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;background:#212121;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#212121}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;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;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;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;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#000}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#757575;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #212121;color:#212121}.history-tabs .order-comments{color:#212121}.level{background-color:#757575;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#757575}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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 .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-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 .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #c1c1c1;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#757575}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#757575}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#ff2400;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#757575}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{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;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#757575;margin-left:.25rem}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;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);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(117,117,117,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.paginator .active span,.paginator a,.paginator a:hover{transition:all .3s linear;color:#fff}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#757575;padding:.5rem 1rem}.paginator .active span,.paginator a:hover,.select-color{background:#212121}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#757575;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;position:absolute;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;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;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{background:#212121;content:'';height:15px;left:-7px;position:absolute;top:13px;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 .empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#c1c1c1;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.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}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#212121;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#000}.summary .stats svg{height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#424242;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.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{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-ms-flex-line-pack:center;align-content:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#000;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#000;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#000;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(33,33,33,.4)}.track-button.active .icon{fill:#000}.track-button.active .track-button-counter{background:rgba(33,33,33,.6)}.track-button.is-hover .track-inner{background:#ff5033;color:#c1c1c1;transition:background .2s}.track-button.is-hover .icon{fill:#ff0062}.track-icon,.watch-options .watch-check svg{fill:#212121}.track-button.is-hover .track-button-counter{background:#ff2400;color:#c1c1c1;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#c1c1c1;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#b4b4b4;transition:background .3s}.track-icon{margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#b4b4b4;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#c1c1c1;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#b4b4b4;transition:background .3s}.watch-options{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{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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(117,117,117,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options .watch-check{height:1.25rem;width:1.25rem}.upvote-btn a.active svg,.upvote-btn a:hover path{fill:#000}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#757575;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#000;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#c1c1c1}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#212121;margin-left:.5rem}.upvote-btn a.is-hover svg{fill:#ff0062;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#757575;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.assigned-to-list .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:flex}.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#212121;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#ff2400}.ticket-watchers .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#ff2400;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .admin-subtitle a{color:#000}.admin-common .admin-subtitle a:hover{color:#212121}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#c1c1c1;color:#212121;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;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 #c1c1c1}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(33,33,33,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;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:#757575}.custom-fields-table .single-custom-field{border-bottom:1px solid #c1c1c1;color:#757575}.custom-fields-table .icon-drag{fill:#757575;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#757575;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#000;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff0062}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#000;fill:#000}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#757575}.admin-functionalities .module-name{font-size:1.2rem;color:#757575;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#757575;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#757575}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#000}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff0062;display:inline-block;padding-left:.3rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-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:#c1c1c1}.admin-membership-table .resend{background-color:#000;color:#fff}.admin-membership-table .resend:hover{background-color:#212121;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#757575;transition:fill .2s}.admin-membership-table .delete:hover{fill:#ff2400}.admin-membership-table .pending{color:#ff0062}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #a8a8a8}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.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{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#757575;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#ff2400}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink: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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #c1c1c1;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #c1c1c1;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#757575;margin-left:.5rem}.project-details .get-feedback-inner .check,.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{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.backlog-table-body .loading img,.lightbox-generic-loading .spin img,.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#757575;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;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 .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#212121;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(33,33,33,.4);color:#212121}.project-privacy-settings label:hover svg{fill:#212121}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#212121;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#212121;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#757575}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#000}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff0062;border-radius:6px;color:#ff0062;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#000}.admin-project-profile-owner-actions a:hover{color:#212121;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#757575}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#212121}.admin-roles .icon:hover{fill:#000;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#757575;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#757575;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#c1c1c1;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#ff2400;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#080808;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#1a1a1a;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #c1c1c1}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#757575;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#000;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#212121}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#757575}.admin-webhooks .webhook-options svg:hover{fill:#000;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #c1c1c1;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(33,33,33,.1);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{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#212121}.admin-webhooks .history-response-icon.history-error{background:#ff2400}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#757575}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#212121;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{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-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{font-size:.9rem;color:#757575;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.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 #c1c1c1;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.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{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#757575;opacity:0}.project-values-row .icon:hover{fill:#212121;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #c1c1c1}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#999;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff0062}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.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{color:#212121;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#212121;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#757575}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#757575}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#212121;fill:#212121}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.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{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#212121;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;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:#212121;content:'';height:15px;position:absolute;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{color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#212121;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;position:absolute;background:#212121}.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:#212121;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #212121;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{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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;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:#212121;content:'';height:15px;position:absolute;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 .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:#212121;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #757575;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#757575}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #b7b7b7;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#999;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#757575;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#c1c1c1}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#999;transition:background .2s ease-in}.backlog-table-body input:checked{color:#212121;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff0062;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#ff2400;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 .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#212121}.backlog-table-body .icon-drag{cursor:move;fill:#757575;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#000;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#212121}.sprints .add-sprint svg{fill:#c1c1c1;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#757575}.sprints .sprint svg:hover{fill:#000;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#757575;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#212121;transition:color .2s}.sprints .sprint-progress-bar{background:#757575;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#000;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#b4b4b4;border:2px dashed #8f8f8f;color:#757575;padding:1rem;text-align:center}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #757575}.sprints .sprint-table .row{border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(117,117,117,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #757575}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#949494;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#828282}.sprints .sprint-table .us-name.blocked{color:#ff2400}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#828282}.sprints .sprint-table .column-points.blocked{color:#ff2400}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.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{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#757575}.sprint-closed .sprint-progress-bar .current-progress{background:#5c5c5c}.sprint-closed .button-gray{background:#757575}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#000}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items: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-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,36,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 svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,36,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#757575}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#000}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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:#212121;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-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:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#000;cursor:default}.category-config .resume,.colors-table .row.edition .current-color,.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{cursor:pointer;fill:#ff2400;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#000}.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:#000}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#757575;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#757575;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#000}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#c1c1c1;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #c1c1c1}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(110,110,110,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-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{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.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:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#c1c1c1;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#757575;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#212121;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#000;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#000;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff0062}.colors-table .gu-mirror{background:#999;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#757575}.duty-custom-fields .custom-field-options svg:hover{fill:#000}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-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{font-size:.9rem;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff0062}.external-reference{font-size:.9rem;color:#757575;margin-top:.5rem}.external-reference a{border-left:1px solid #757575;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#000}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff0062}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#c1c1c1}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #757575;color:#212121;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#212121;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#212121;border:1px solid #000}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff0062;border:1px solid #ff2400}.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:#000;border:1px solid #000;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#757575;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#ff2400}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.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-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#ff2400;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .subtitle{white-space:pre-line}.lightbox-generic-ask .options{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{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-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{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow: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{margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#b4b4b4;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#212121;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#b4b4b4;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#000}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-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-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff0062}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.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{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#757575;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#212121;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);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 .item{font-size:1.2rem}.main-nav .active{color:#212121}.main-nav .active svg path{fill:#212121;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#212121}.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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-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 .iocaine{background:rgba(33,33,33,.1);border-left:10px solid #212121}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;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 .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#212121}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #c1c1c1;color:#c1c1c1}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#c1c1c1}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#c1c1c1;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#212121;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#212121}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#000}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff0062}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;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{width:.8rem;height:.8rem;fill:#757575;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #212121;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#212121;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(33,33,33,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#8e8e8e;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#a8a8a8;transition:background .2s ease-in}.ticket-status .type-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #212121;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:#212121;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#757575;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#212121}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#ff2400;color:#c1c1c1;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff0062}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#212121}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff0062}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-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:#757575;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;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:#757575}.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:#ff0062}.ticket-detail-settings .item-unblock:hover{background:#ff2400}.ticket-detail-settings .button-delete{background:#ff0062}.ticket-detail-settings .button-delete:hover{background:#ff2400}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(193,193,193,.2) 100%);background-color:#c1c1c1}.introjs-helperLayer{border:1px solid rgba(33,33,33,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(33,33,33,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#212121}.introjs-button{background-color:#000;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:#212121;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{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{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-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:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#757575}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-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{-ms-flex:1;flex:1;-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 .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#a6a6a6;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ff66a1}.issues-table .row.is-blocked .blocked-text{color:#ff2400;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #b7b7b7}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#212121;transition:all .2s linear}.issues-table .votes:hover svg{fill:#212121;transition:all .2s linear}.issues-table .votes.inactive{color:#757575}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#757575;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#212121;transition:all .2s linear}.issues-table .is-voted svg{fill:#212121;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff0062}.issues-table .is-voted:hover svg{fill:#ff0062;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-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;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{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#212121;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;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}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-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{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#757575;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#000}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#757575;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#ff2400;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #212121,2px 2px 4px #a8a8a8}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#bcbcbc;border:1px dashed #adadad;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #c1c1c1}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#adadad}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#757575;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;color:#212121;position:relative;top:1px}.search-filter a.active .icon{fill:#212121}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#212121;color:#fff}.search-in input::-webkit-input-placeholder{color:#757575}.search-in input::-moz-placeholder{color:#757575}.search-in input:-moz-placeholder{color:#757575}.search-in input:-ms-input-placeholder{color:#757575}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#757575}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#999;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.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{font-size:1rem;color:#757575}.search-result-table .user-story-name .icon:hover{color:#212121;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #c1c1c1}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;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}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#000;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#212121}.table-team .attribute .top{fill:#212121;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff0062}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#ff2400}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #c1c1c1;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data 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 .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#212121;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #757575}.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{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#000;transition:background .3s linear}.policy-table label{background:#757575;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#212121;cursor:pointer;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-Regular,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{max-width:780px}.user-profile form{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{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.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;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#ff2400}.user-profile .project-details-form-data{-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{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#212121}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#757575;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #757575}.wiki-nav input[type=text]{background:#c1c1c1;color:#212121;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#757575}.wiki-nav input[type=text]::-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-ms-input-placeholder{color:#757575}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#757575;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#ff2400}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#757575;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff0062}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-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-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#757575}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff0062}.attachment-gallery .icon-delete:hover svg{color:#ff2400}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span,.attachment-list .editable-attachment-deprecated span,.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#757575}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#757575;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#000}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#ff2400}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.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{margin-bottom:4rem}.attachments .gu-transit{background:#c1c1c1;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#212121;line-height:36px;padding:0 1rem}.attachments-header .options{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;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#212121}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.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;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #c1c1c1;color:#757575;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.single-attachment .attachment-size{color:#757575}.more-attachments{font-size:.9rem;border-bottom:1px solid #757575;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#000;margin-left:.5rem}.more-attachments:hover{background:#999;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#757575}.attachment-preview .attachment-preview-container svg:hover{fill:#212121;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer}.assignable-member-single:hover{background:rgba(33,33,33,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.05);border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff0062;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#ff2400}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#050505}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-ms-fill-lower{background:#c1c1c1}.range-slider:focus::-ms-fill-upper{background:#c6c6c6}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#bcbcbc;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#c1c1c1;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #a8a8a8;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #a8a8a8}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff0062}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,0,98,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#757575}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#212121}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem 1rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#757575;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-statistics{font-size:.9rem;color:#b5b5b5;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#212121}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b5b5b5;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#c1c1c1;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#212121;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#c1c1c1}.card-tasks{border-top:1px solid #c1c1c1;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #c1c1c1}.card-task a{color:#757575;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff0062}.card-task a.closed-task{color:#757575;text-decoration:line-through}.card-task a:hover{color:#000}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(33,33,33,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #757575;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#ff2400;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#757575;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg{width:1.25rem;height:1.25rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.edit-title-wrapper .edit-title-button:hover{fill:#000}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav a{display:inline-block}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(0,0,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#212121;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#757575}tg-filter input::-moz-placeholder{color:#757575}tg-filter input:-moz-placeholder{color:#757575}tg-filter input:-ms-input-placeholder{color:#757575}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #757575;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#000}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#a8a8a8;color:#212121;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#b4b4b4;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#adadad;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#212121;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#8e8e8e;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#ff2400}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-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 .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.tag,.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#757575;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#212121;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#000}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #757575;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#a1a1a1;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#757575;cursor:pointer}.add-tag-button:hover,.tag{color:#212121}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.add-tag-button .add-tag-text{font-size:.9rem}.tag{font-size:.9rem;border-radius:0 5px 5px 0;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff0062;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(33,33,33,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff0062;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#ff2400}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#000;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-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 a{color:#000;cursor:pointer}.wysiwyg a:hover{color:#212121}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#c1c1c1;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #757575;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.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}.wysiwyg hr{border:1px solid #c1c1c1}.medium-editor-mention-panel{background-color:#fff;border:1px solid #757575;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #757575;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#000;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#ff2400}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#757575}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#757575;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#757575;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#757575;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #757575}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#212121}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#212121}.discover-header{background:url(../images/discover.png) bottom left repeat-x #c1c1c1;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 .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#000}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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:#212121}.discover-header input[type=text]:-webkit-autofill{background:rgba(0,0,0,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#757575;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#000}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#757575;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#000}.filter-discover-search .discover-search-filter.active svg{fill:#000}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff0062;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#ff2400}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#757575;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#212121;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#212121;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#000}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#000}.featured-project .project-card-name a:hover{color:#212121}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-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{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#757575;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#757575;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#212121;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-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 #c1c1c1;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#757575;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;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 .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(33,33,33,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-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{-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{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#000}.highlighted-project .project-title a:hover{color:#212121}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#000}.highlighted-project .statistic.active svg{fill:#000}.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:#757575;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#212121;color:#fff}.discover-search .searchbox-filters label:hover{background:#c1c1c1;color:#757575}.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 #757575;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#757575;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#000}.discover-results .statistic.active svg{fill:#000}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#000;border:1px solid #000;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #757575;color:#757575;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#212121;border:1px solid #000;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff0062;border:1px solid #ff2400}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(33,33,33,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,0,98,.5)}.epic-row.is-closed .name a{color:#9b9b9b;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#757575;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#212121;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#212121;fill:#212121}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#757575}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #212121;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#212121;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#000;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;color:#757575}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(33,33,33,.05)}.story-row.is-blocked{background:rgba(255,0,98,.5)}.story-row.is-closed .name{color:#757575;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#212121;width:10vw}.story-row .vote.is-voter{color:#212121;fill:#212121}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#212121;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#212121}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(193,193,193,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(33,33,33,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#212121;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#212121;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#212121;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#212121}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(33,33,33,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #c1c1c1;color:#c1c1c1}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#c1c1c1}tg-related-userstory-row .closed .userstory-name a{color:#c1c1c1;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff0062}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.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:-ms-flexbox;display:flex}.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 h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;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%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #757575;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #c1c1c1}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#000;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#757575}.comment .comment-edited{font-size:.9rem;background:#c1c1c1;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#000;fill:#000}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options .icon-close,.comment .comment-options .icon-edit{fill:#757575;margin-right:.5rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close:hover{fill:#ff2400}.comment .comment-options .icon-trash{fill:#ff0062}.comment .comment-options .icon-trash:hover{fill:#ff2400}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#757575;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#000;fill:#000;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#000;fill:#000}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#000;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#757575}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#000;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#c1c1c1;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#757575;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(84,84,84,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,0,98,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#000;margin-right:.5rem}.activity .activity-date{color:#757575}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #c1c1c1;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(33,33,33,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,0,98,.2);color:#ff2400}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#000}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#000}.home-project .project-card-name a:hover{color:#212121}.home-project:hover{border:1px solid rgba(33,33,33,.2);box-shadow:0 0 5px #c1c1c1}.home-project.blocked-project{border:#c1c1c1}.home-project.blocked-project:hover{border:#c1c1c1;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#c1c1c1;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.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 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #c1c1c1;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#b4b4b4;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #c1c1c1;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff0062;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#ff2400}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#212121;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#212121}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#757575;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#212121;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(33,33,33,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(0,0,0,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a:hover svg{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;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{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}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff0062;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#757575;display:block;padding:.8rem .5rem}.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{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #c1c1c1}.profile-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #c1c1c1}.profile-filter .searchbox input:focus{border-bottom:1px solid #757575;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#757575;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;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 .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-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{fill:#c1c1c1;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#757575;font-size:.9rem;margin:0}.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);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);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:#757575;transition:all .2s linear}.profile-bar .flag:hover path{fill:#ff2400;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .location,.profile-bar .username,.profile-bar h2{margin-bottom:1rem;color:#757575}.profile-bar h2{font-size:1.6rem;line-height:1.2}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#757575}.profile-bar .profile-stats{border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-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{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.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:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#212121}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#000}.profile-content-tabs .icon{fill:#757575;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#757575;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem}.profile-sidebar a{color:#000}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#000;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#757575;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#212121}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#757575;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-import-type input:disabled+label .icon{color:#9b9b9b}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-privacity input:disabled+label .icon{color:#9b9b9b}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #c1c1c1}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#000;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#212121}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#000;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#757575;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#212121}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#c1c1c1;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#ff2400}.import-project-members-match{color:#757575}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #000;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(33,33,33,.3)}.import-project-members-match-true svg{fill:#000}.import-project-members-match-false{border:1px solid #ff2400;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,36,0,.3)}.import-project-members-match-false svg{fill:#ff2400}.import-project-members-choose{color:#000;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#212121}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #c1c1c1;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(0,0,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #c1c1c1}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#000;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#000;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#212121;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#212121;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#757575;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#212121}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(0,0,0,.6);stroke:rgba(0,0,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#c1c1c1;stroke:#a8a8a8;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#ff2400;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff0062;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#000}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#757575;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#212121}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #c1c1c1}.import-project-trello-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#212121}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#212121}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#757575;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(33,33,33,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#757575;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#c9c9c9;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#a1a1a1;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#757575;margin-right:.5rem}.transfer-project-statistics svg{fill:#757575;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#000;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#212121}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#757575}.transfer-project-comment-header .icon-close:hover{fill:#ff0062;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #c1c1c1;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:#000}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#212121}.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{-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#757575;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;-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#757575}a:hover,body,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{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#212121;margin-right:.5rem}.main-nav svg,.navbar a svg,.summary .stats svg{fill:#fff}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}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{color:#212121;font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=url],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=url]::-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=url]::-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=url]:-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=url]:-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=url].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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}.home-project-list li,.tag{border:1px solid #000}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff}.summary{background:#212121}.navbar{background:#000}.navbar::after{background:url(../images/menu-vert.png) top left}.home-project-list p,.watch-options a.active,.working-on-container .list-itemtype-ticket .ticket-project,.working-on-container .list-itemtype-ticket .ticket-status,.working-on-container .list-itemtype-ticket .ticket-type{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active svg,.taskboard-table-header .task-colum-name .icon{fill:#000}.main-nav .active{background:#fff}.single-project .title{background:#c1c1c1;color:#000}.summary .data .number,.wiki-summary .username{color:#fff}.activity-item p,.drag-drop-help,.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,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}.wiki-content.editable:hover .wysiwyg{background:#fff;border:1px solid}.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:#fff}.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,.us-story-main-data .us-title .us-name{color:#000}.us-story-main-data .us-title{background:#fff}.login-main,.login-main a{color:#fff}.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,.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete,.home-wrapper .title-bar{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000} \ No newline at end of file diff --git a/dist/v-1520418874500/styles/theme-material-design.css b/dist/v-1521124836513/styles/theme-material-design.css similarity index 90% rename from dist/v-1520418874500/styles/theme-material-design.css rename to dist/v-1521124836513/styles/theme-material-design.css index fd1db56..b263e6b 100644 --- a/dist/v-1520418874500/styles/theme-material-design.css +++ b/dist/v-1521124836513/styles/theme-material-design.css @@ -1,4 +1,4 @@ @charset "UTF-8";.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;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!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;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.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;content:'';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-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;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-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{box-sizing:content-box;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-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.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-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.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;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;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}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.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}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}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}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{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}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}.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}.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-select{display:inline-block}.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}.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}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.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}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.backlog-filter,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}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{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{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:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@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 b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#BDBDBD}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}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{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.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}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#8c9eff;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#8c9eff;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],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=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{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}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#3f51b5;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #EEE}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#8c9eff;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(255,255,255,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#1a237e;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.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-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#BDBDBD;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#BDBDBD}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;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;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.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{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#8c9eff;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#BDBDBD;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff}.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)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#EEE}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-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}.error-main a{color:#8c9eff}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#BDBDBD}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e4e4;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#BDBDBD}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#EEE;color:#757575}.menu-button span,.menu-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-bulk{background:#3f51b5;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.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}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#3f51b5;display:inline-block;margin-top:.5rem}.button-filter{background:#EEE;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#BDBDBD;fill:#EEE}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#f44336;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#e9e9e9;border:1px dashed #dadada;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#dadada;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;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:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;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%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#BDBDBD}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-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}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff5252;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#8c9eff;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#BDBDBD;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#3f51b5}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.2);color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.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:currentColor;fill:currentColor}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;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;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;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;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#3f51b5}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#BDBDBD;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #424242;color:#424242}.history-tabs .order-comments{color:#424242}.level{background-color:#BDBDBD;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#BDBDBD}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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 .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-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 .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #EEE;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#BDBDBD}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#BDBDBD}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#f44336;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#BDBDBD}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{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;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.25rem}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;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);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#BDBDBD;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;transition:all .3s linear}.paginator .active span{background:#8c9eff}.select-color,.select-color:after{background:#212121;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#BDBDBD;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;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;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;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 .empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#EEE;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;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{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#8c9eff;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#3f51b5}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#8a8a8a;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.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{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-ms-flex-line-pack:center;align-content:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#3f51b5;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#1a237e;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#1a237e;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(140,158,255,.4)}.track-button.active .icon{fill:#3f51b5}.track-button.active .track-button-counter{background:rgba(140,158,255,.6)}.track-button.is-hover .track-inner{background:#f77066;color:#EEE;transition:background .2s}.track-button.is-hover .icon{fill:#ff5252}.track-button.is-hover .track-button-counter{background:#f44336;color:#EEE;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#EEE;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#e1e1e1;transition:background .3s}.track-icon{fill:#424242;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#e1e1e1;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#EEE;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#e1e1e1;transition:background .3s}.watch-options{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{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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#8c9eff}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#BDBDBD;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#1a237e;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;transition:all .3s}.upvote-btn a.active svg{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#EEE}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242;margin-left:.5rem}.upvote-btn a.is-hover svg{fill:#ff5252;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#BDBDBD;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.assigned-to-list .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex}.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#424242;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#f44336}.ticket-watchers .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#f44336;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#BDBDBD;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#3f51b5}.admin-common .admin-subtitle a:hover{color:#8c9eff}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#EEE;color:#424242;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;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 #EEE}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(140,158,255,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;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:#BDBDBD}.custom-fields-table .single-custom-field{border-bottom:1px solid #EEE;color:#757575}.custom-fields-table .icon-drag{fill:#BDBDBD;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#BDBDBD;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#3f51b5;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff5252}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#3f51b5;fill:#3f51b5}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#BDBDBD}.admin-functionalities .module-name{font-size:1.2rem;color:#BDBDBD;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#BDBDBD}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#3f51b5}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff5252;display:inline-block;padding-left:.3rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-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:#EEE}.admin-membership-table .resend{background-color:#3f51b5;color:#fff}.admin-membership-table .resend:hover{background-color:#8c9eff;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#BDBDBD;transition:fill .2s}.admin-membership-table .delete:hover{fill:#f44336}.admin-membership-table .pending{color:#ff5252}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #d5d5d5}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.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{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#BDBDBD;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#f44336}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink: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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #EEE;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #EEE;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.5rem}.project-details .get-feedback-inner .check,.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{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.backlog-table-body .loading img,.lightbox-generic-loading .spin img,.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#BDBDBD;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;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 .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#424242;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(140,158,255,.4);color:#424242}.project-privacy-settings label:hover svg{fill:#424242}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#424242;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#8c9eff;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#BDBDBD}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#3f51b5}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff5252;border-radius:6px;color:#ff5252;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#3f51b5}.admin-project-profile-owner-actions a:hover{color:#8c9eff;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#BDBDBD}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#424242}.admin-roles .icon:hover{fill:#3f51b5;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#BDBDBD;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#BDBDBD;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#EEE;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#f44336;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#1d278b;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#232fa8;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #EEE}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#BDBDBD;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#3f51b5;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#8c9eff}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#BDBDBD}.admin-webhooks .webhook-options svg:hover{fill:#3f51b5;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #EEE;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(140,158,255,.1);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{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#8c9eff}.admin-webhooks .history-response-icon.history-error{background:#f44336}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#BDBDBD}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#BDBDBD}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#8c9eff;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{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-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{font-size:.9rem;color:#BDBDBD;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.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 #EEE;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.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{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#BDBDBD;opacity:0}.project-values-row .icon:hover{fill:#424242;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #EEE}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#fff;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff5252}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.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{color:#424242;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#424242;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#BDBDBD}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#BDBDBD}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#8c9eff;fill:#8c9eff}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.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{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#212121;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;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:#212121;color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#8c9eff;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#212121;bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#212121;position:absolute}.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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #424242;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{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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;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 .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:#8c9eff;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #BDBDBD;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#BDBDBD}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #e4e4e4;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#fff;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#BDBDBD;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#EEE}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#fff;transition:background .2s ease-in}.backlog-table-body input:checked{color:#8c9eff;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.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{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff5252;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#f44336;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 .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#8c9eff}.backlog-table-body .icon-drag{cursor:move;fill:#BDBDBD;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#3f51b5;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#8c9eff}.sprints .add-sprint svg{fill:#EEE;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#BDBDBD}.sprints .sprint svg:hover{fill:#3f51b5;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#8c9eff;transition:color .2s}.sprints .sprint-progress-bar{background:#BDBDBD;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#3f51b5;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#e1e1e1;border:2px dashed #d7d7d7;color:#757575;padding:1rem;text-align:center}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #BDBDBD}.sprints .sprint-table .row{border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(189,189,189,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #BDBDBD}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#dcdcdc;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#cacaca}.sprints .sprint-table .us-name.blocked{color:#f44336}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#cacaca}.sprints .sprint-table .column-points.blocked{color:#f44336}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.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{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#BDBDBD}.sprint-closed .sprint-progress-bar .current-progress{background:#a4a4a4}.sprint-closed .button-gray{background:#BDBDBD}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#3f51b5}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items: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-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(244,67,54,.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 svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(244,67,54,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#BDBDBD}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#3f51b5}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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:#424242;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-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:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#3f51b5;cursor:default}.category-config .resume,.colors-table .row.edition .current-color,.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{cursor:pointer;fill:#f44336;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#3f51b5}.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:#3f51b5}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#BDBDBD;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#BDBDBD;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#3f51b5}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#EEE;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #EEE}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(255,255,255,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-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{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.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:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#EEE;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#BDBDBD;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#8c9eff;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#3f51b5;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#3f51b5;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff5252}.colors-table .gu-mirror{background:#fff;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#BDBDBD}.duty-custom-fields .custom-field-options svg:hover{fill:#3f51b5}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-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{font-size:.9rem;color:#a8a8a8;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff5252}.external-reference{font-size:.9rem;color:#BDBDBD;margin-top:.5rem}.external-reference a{border-left:1px solid #BDBDBD;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#3f51b5}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff5252}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#EEE}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#424242;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#424242;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#8c9eff;border:1px solid #3f51b5}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff5252;border:1px solid #f44336}.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:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#BDBDBD;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#f44336}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.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-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#f44336;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .subtitle{white-space:pre-line}.lightbox-generic-ask .options{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{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-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{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow: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{margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#e1e1e1;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#8c9eff;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e1e1e1;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#3f51b5}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-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-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff5252}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.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{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#BDBDBD;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#8c9eff;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{fill:#fff;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 .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#8c9eff}.main-nav .active svg path{fill:#8c9eff;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#8c9eff}.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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-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 .iocaine{background:rgba(140,158,255,.1);border-left:10px solid #8c9eff}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;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 .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#424242}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #EEE;color:#EEE}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#EEE}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#EEE;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#424242}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#3f51b5}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff5252}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;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{width:.8rem;height:.8rem;fill:#BDBDBD;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #424242;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(140,158,255,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#bbb;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#d5d5d5;transition:background .2s ease-in}.ticket-status .type-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#BDBDBD;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#8c9eff}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#f44336;color:#EEE;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff5252}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#8c9eff}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff5252}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-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:#BDBDBD;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;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:#757575}.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:#ff5252}.ticket-detail-settings .item-unblock:hover{background:#f44336}.ticket-detail-settings .button-delete{background:#ff5252}.ticket-detail-settings .button-delete:hover{background:#f44336}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(238,238,238,.2) 100%);background-color:#EEE}.introjs-helperLayer{border:1px solid rgba(140,158,255,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(66,66,66,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#8c9eff}.introjs-button{background-color:#3f51b5;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:#8c9eff;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{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{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-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:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#BDBDBD}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{-ms-flex:1;flex:1;-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 .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#fff;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffb8b8}.issues-table .row.is-blocked .blocked-text{color:#f44336;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e4e4}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#8c9eff;transition:all .2s linear}.issues-table .votes:hover svg{fill:#8c9eff;transition:all .2s linear}.issues-table .votes.inactive{color:#BDBDBD}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#8c9eff;transition:all .2s linear}.issues-table .is-voted svg{fill:#8c9eff;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff5252}.issues-table .is-voted:hover svg{fill:#ff5252;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-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;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{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;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}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-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{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#BDBDBD;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#3f51b5}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#BDBDBD;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#f44336;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #8c9eff,2px 2px 4px #d5d5d5}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#e9e9e9;border:1px dashed #dadada;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #EEE}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#dadada}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#BDBDBD;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #EEE;border-right:1px solid #EEE;color:#424242;position:relative;top:1px}.search-filter a.active .icon{fill:#8c9eff}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#424242;color:#fff}.search-in input::-webkit-input-placeholder{color:#BDBDBD}.search-in input::-moz-placeholder{color:#BDBDBD}.search-in input:-moz-placeholder{color:#BDBDBD}.search-in input:-ms-input-placeholder{color:#BDBDBD}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#BDBDBD}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#fff;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.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{font-size:1rem;color:#BDBDBD}.search-result-table .user-story-name .icon:hover{color:#424242;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #EEE}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;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}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#3f51b5;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#424242}.table-team .attribute .top{fill:#8c9eff;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff5252}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#f44336}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #EEE;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data 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 .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#BDBDBD}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#8c9eff;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #BDBDBD}.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{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#3f51b5;transition:background .3s linear}.policy-table label{background:#BDBDBD;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#8c9eff;cursor:pointer;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-Regular,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{max-width:780px}.user-profile form{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{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.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;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#f44336}.user-profile .project-details-form-data{-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{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#8c9eff}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#BDBDBD;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #BDBDBD}.wiki-nav input[type=text]{background:#EEE;color:#424242;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#BDBDBD}.wiki-nav input[type=text]::-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-ms-input-placeholder{color:#BDBDBD}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#BDBDBD;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#f44336}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#BDBDBD;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff5252}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-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-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#BDBDBD}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff5252}.attachment-gallery .icon-delete:hover svg{color:#f44336}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#BDBDBD}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-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{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#BDBDBD;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#3f51b5}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#f44336}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{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{margin-bottom:4rem}.attachments .gu-transit{background:#EEE;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#424242;line-height:36px;padding:0 1rem}.attachments-header .options{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;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#8c9eff}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.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;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #BDBDBD;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#3f51b5;margin-left:.5rem}.more-attachments:hover{background:#fff;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#BDBDBD}.attachment-preview .attachment-preview-container svg:hover{fill:#8c9eff;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #EEE;cursor:pointer}.assignable-member-single:hover{background:rgba(140,158,255,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(140,158,255,.05);border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff5252;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#f44336}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#1c2586}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-ms-fill-lower{background:#EEE}.range-slider:focus::-ms-fill-upper{background:#f3f3f3}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#e9e9e9;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#EEE;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #d5d5d5;cursor:move;display:block;margin:0 .6rem .6rem;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #d5d5d5}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff5252}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,82,82,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#BDBDBD}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#8c9eff}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem 1rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#BDBDBD;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-statistics{font-size:.9rem;color:#fdfdfd;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#8c9eff}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .icon{width:.75rem;height:.75rem;fill:#fdfdfd;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#EEE;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#8c9eff;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#EEE}.card-tasks{border-top:1px solid #EEE;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #EEE}.card-task a{color:#BDBDBD;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff5252}.card-task a.closed-task{color:#BDBDBD;text-decoration:line-through}.card-task a:hover{color:#3f51b5}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(140,158,255,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #BDBDBD;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#f44336;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#BDBDBD;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg{width:1.25rem;height:1.25rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.edit-title-wrapper .edit-title-button:hover{fill:#3f51b5}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav a{display:inline-block}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(63,81,181,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#424242;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#BDBDBD}tg-filter input::-moz-placeholder{color:#BDBDBD}tg-filter input:-moz-placeholder{color:#BDBDBD}tg-filter input:-ms-input-placeholder{color:#BDBDBD}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #BDBDBD;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#3f51b5}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#424242;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#d5d5d5;color:#424242;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#e1e1e1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#dadada;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#424242;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#bbb;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#f44336}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-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 .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.tag,.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#BDBDBD;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#424242;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#3f51b5}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #BDBDBD;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#fff;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#BDBDBD;cursor:pointer}.add-tag-button:hover{color:#8c9eff}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.add-tag-button .add-tag-text{font-size:.9rem}.tag{font-size:.9rem;background:#f5f5f5;border-radius:0 5px 5px 0;color:#424242;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff5252;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(66,66,66,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff5252;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#f44336}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#3f51b5;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-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 a{color:#3f51b5;cursor:pointer}.wysiwyg a:hover{color:#8c9eff}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#EEE;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #BDBDBD;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.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}.wysiwyg hr{border:1px solid #EEE}.medium-editor-mention-panel{background-color:#fff;border:1px solid #BDBDBD;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #BDBDBD;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#1a237e;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#f44336}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#BDBDBD}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#BDBDBD;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#BDBDBD;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#BDBDBD;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #BDBDBD}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#8c9eff}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#8c9eff}.discover-header{background:url(../images/discover.png) bottom left repeat-x #EEE;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 .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#3f51b5}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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:#8c9eff}.discover-header input[type=text]:-webkit-autofill{background:rgba(26,35,126,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#BDBDBD;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#3f51b5}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#BDBDBD;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#3f51b5}.filter-discover-search .discover-search-filter.active svg{fill:#3f51b5}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff5252;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#f44336}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#BDBDBD;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#8c9eff;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#424242;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #EEE;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#3f51b5}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.featured-project .project-card-name a:hover{color:#8c9eff}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-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{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#BDBDBD;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#BDBDBD;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#424242;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-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 #EEE;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#BDBDBD;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;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 .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(140,158,255,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-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{-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{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#3f51b5}.highlighted-project .project-title a:hover{color:#8c9eff}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#BDBDBD;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#3f51b5}.highlighted-project .statistic.active svg{fill:#3f51b5}.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:#BDBDBD;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#8c9eff;color:#fff}.discover-search .searchbox-filters label:hover{background:#EEE;color:#757575}.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 #BDBDBD;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#BDBDBD;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#3f51b5}.discover-results .statistic.active svg{fill:#3f51b5}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#BDBDBD;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#8c9eff;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff5252;border:1px solid #f44336}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(140,158,255,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,82,82,.5)}.epic-row.is-closed .name a{color:#e3e3e3;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#8c9eff;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#BDBDBD}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #424242;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#8c9eff;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#3f51b5;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #EEE;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(140,158,255,.05)}.story-row.is-blocked{background:rgba(255,82,82,.5)}.story-row.is-closed .name{color:#BDBDBD;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#8c9eff;width:10vw}.story-row .vote{color:#757575}.story-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#8c9eff;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#8c9eff}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(238,238,238,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(140,158,255,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#8c9eff;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#424242;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#8c9eff;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#8c9eff}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(140,158,255,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #EEE;color:#EEE}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#EEE}tg-related-userstory-row .closed .userstory-name a{color:#EEE;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff5252}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.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:-ms-flexbox;display:flex}.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 h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;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%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #BDBDBD;height:55px}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#3f51b5;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#BDBDBD}.comment .comment-edited{font-size:.9rem;background:#EEE;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#3f51b5;fill:#3f51b5}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:#f44336}.comment .comment-options .icon-trash{fill:#ff5252}.comment .comment-options .icon-trash:hover{fill:#f44336}.comment .deleted-comment-wrapper{border-bottom:1px solid #EEE;padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#BDBDBD;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#3f51b5;fill:#3f51b5;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#3f51b5;fill:#3f51b5}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#3f51b5;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#BDBDBD}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#3f51b5;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#EEE;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#BDBDBD;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(242,244,255,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,82,82,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#3f51b5;margin-right:.5rem}.activity .activity-date{color:#BDBDBD}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #EEE;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(140,158,255,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,82,82,.2);color:#f44336}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #EEE;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#3f51b5}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.home-project .project-card-name a:hover{color:#8c9eff}.home-project:hover{border:1px solid rgba(140,158,255,.2);box-shadow:0 0 5px #EEE}.home-project.blocked-project{border:#EEE}.home-project.blocked-project:hover{border:#EEE;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#EEE;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.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 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #EEE;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e1e1e1;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #EEE;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff5252;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#f44336}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#424242;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#8c9eff}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#BDBDBD;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#424242;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(140,158,255,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(26,35,126,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg{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;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{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}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff5252;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#BDBDBD;display:block;padding:.8rem .5rem}.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{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #EEE}.profile-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-contacts,.profile-content-tabs{border-top:1px solid #EEE}.profile-filter .searchbox input:focus{border-bottom:1px solid #BDBDBD;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#BDBDBD;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;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 .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-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{fill:#EEE;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#BDBDBD;font-size:.9rem;margin:0}.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);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);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:#BDBDBD;transition:all .2s linear}.profile-bar .flag:hover path{fill:#f44336;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#757575;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#BDBDBD;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#BDBDBD}.profile-bar .profile-stats{border-bottom:1px solid #EEE;border-top:1px solid #EEE;color:#757575;display:-ms-flexbox;display:flex;-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{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#BDBDBD;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#8c9eff}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #EEE;border-right:1px solid #EEE;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#3f51b5}.profile-content-tabs .icon{fill:#BDBDBD;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#BDBDBD;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#BDBDBD}.profile-sidebar a{color:#3f51b5}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#3f51b5;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#8c9eff}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#BDBDBD;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-import-type input:disabled+label .icon{color:#e3e3e3}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-privacity input:disabled+label .icon{color:#e3e3e3}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #EEE}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#8c9eff}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #EEE}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#8c9eff}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#EEE;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#f44336}.import-project-members-match{color:#BDBDBD}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #3f51b5;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(140,158,255,.3)}.import-project-members-match-true svg{fill:#3f51b5}.import-project-members-match-false{border:1px solid #f44336;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(244,67,54,.3)}.import-project-members-match-false svg{fill:#f44336}.import-project-members-choose{color:#3f51b5;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#8c9eff}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #EEE;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(63,81,181,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #EEE}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#3f51b5;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#3f51b5;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#424242;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#424242;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #EEE}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#8c9eff}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(63,81,181,.6);stroke:rgba(63,81,181,.1)}.create-project-type-issues-subform-radiogr svg{fill:#EEE;stroke:#d5d5d5;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#f44336;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff5252;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#3f51b5}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #EEE}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#8c9eff}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #EEE}.import-project-trello-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#424242}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#8c9eff}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#BDBDBD;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(140,158,255,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#BDBDBD;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#f6f6f6;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#fff;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#BDBDBD;margin-right:.5rem}.transfer-project-statistics svg{fill:#BDBDBD;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#3f51b5;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#8c9eff}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#BDBDBD}.transfer-project-comment-header .icon-close:hover{fill:#ff5252;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #EEE;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:#3f51b5}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#8c9eff}.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{-ms-flex-align:center;align-items:center;color:#BDBDBD;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#BDBDBD;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;-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#BDBDBD}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#424242;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}@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=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;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=url]::-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=url]::-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=url]:-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=url]:-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=url].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}.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:#f5f5f5;border-top:3px solid #3f51b5}.taskboard-table-header .task-colum-name .icon{fill:#3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.kanban-table-header .task-colum-name{background:#fbfbfb;border-top:3px solid #3f51b5}.kanban-table-header .task-colum-name .icon{color:#3f51b5}.kanban-table-body .kanban-uses-box{background:#fbfbfb} \ No newline at end of file + */.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}.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}.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-select{display:inline-block}.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}.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}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.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}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.backlog-filter,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}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{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{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:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@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 b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#BDBDBD}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}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{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.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}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#8c9eff;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#8c9eff;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],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=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{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}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#3f51b5;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #EEE}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#8c9eff;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(255,255,255,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#1a237e;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.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-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#BDBDBD;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#BDBDBD}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;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;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.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{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#8c9eff;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#BDBDBD;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff}.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)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#EEE}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-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}.error-main a{color:#8c9eff}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#BDBDBD}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e4e4;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#BDBDBD}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#EEE;color:#757575}.menu-button span,.menu-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-bulk{background:#3f51b5;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.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}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#3f51b5;display:inline-block;margin-top:.5rem}.button-filter{background:#EEE;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#BDBDBD;fill:#EEE}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#f44336;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#e9e9e9;border:1px dashed #dadada;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#dadada;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;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:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;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%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#BDBDBD}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-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}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff5252;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#8c9eff;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#BDBDBD;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#3f51b5}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.2);color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.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:currentColor;fill:currentColor}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;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;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;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;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#3f51b5}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#BDBDBD;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #424242;color:#424242}.history-tabs .order-comments{color:#424242}.level{background-color:#BDBDBD;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#BDBDBD}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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 .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-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 .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #EEE;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#BDBDBD}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#BDBDBD}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#f44336;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#BDBDBD}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{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;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.25rem}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;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);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#BDBDBD;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;transition:all .3s linear}.paginator .active span{background:#8c9eff}.select-color,.select-color:after{background:#212121;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#BDBDBD;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;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;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;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 .empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#EEE;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;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{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#8c9eff;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#3f51b5}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#8a8a8a;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.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{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-ms-flex-line-pack:center;align-content:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#3f51b5;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#1a237e;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#1a237e;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(140,158,255,.4)}.track-button.active .icon{fill:#3f51b5}.track-button.active .track-button-counter{background:rgba(140,158,255,.6)}.track-button.is-hover .track-inner{background:#f77066;color:#EEE;transition:background .2s}.track-button.is-hover .icon{fill:#ff5252}.track-button.is-hover .track-button-counter{background:#f44336;color:#EEE;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#EEE;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#e1e1e1;transition:background .3s}.track-icon{fill:#424242;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#e1e1e1;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#EEE;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#e1e1e1;transition:background .3s}.watch-options{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{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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#8c9eff}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#BDBDBD;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#1a237e;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;transition:all .3s}.upvote-btn a.active svg{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#EEE}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242;margin-left:.5rem}.upvote-btn a.is-hover svg{fill:#ff5252;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#BDBDBD;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.assigned-to-list .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex}.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#424242;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#f44336}.ticket-watchers .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#f44336;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#BDBDBD;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#3f51b5}.admin-common .admin-subtitle a:hover{color:#8c9eff}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#EEE;color:#424242;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;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 #EEE}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(140,158,255,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;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:#BDBDBD}.custom-fields-table .single-custom-field{border-bottom:1px solid #EEE;color:#757575}.custom-fields-table .icon-drag{fill:#BDBDBD;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#BDBDBD;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#3f51b5;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff5252}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#3f51b5;fill:#3f51b5}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#BDBDBD}.admin-functionalities .module-name{font-size:1.2rem;color:#BDBDBD;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#BDBDBD}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#3f51b5}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff5252;display:inline-block;padding-left:.3rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-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:#EEE}.admin-membership-table .resend{background-color:#3f51b5;color:#fff}.admin-membership-table .resend:hover{background-color:#8c9eff;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#BDBDBD;transition:fill .2s}.admin-membership-table .delete:hover{fill:#f44336}.admin-membership-table .pending{color:#ff5252}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #d5d5d5}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.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{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#BDBDBD;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#f44336}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink: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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #EEE;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #EEE;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.5rem}.project-details .get-feedback-inner .check,.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{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.backlog-table-body .loading img,.lightbox-generic-loading .spin img,.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#BDBDBD;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;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 .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#424242;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(140,158,255,.4);color:#424242}.project-privacy-settings label:hover svg{fill:#424242}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#424242;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#8c9eff;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#BDBDBD}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#3f51b5}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff5252;border-radius:6px;color:#ff5252;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#3f51b5}.admin-project-profile-owner-actions a:hover{color:#8c9eff;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#BDBDBD}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#424242}.admin-roles .icon:hover{fill:#3f51b5;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#BDBDBD;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#BDBDBD;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#EEE;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#f44336;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#1d278b;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#232fa8;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #EEE}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#BDBDBD;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#3f51b5;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#8c9eff}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#BDBDBD}.admin-webhooks .webhook-options svg:hover{fill:#3f51b5;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #EEE;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(140,158,255,.1);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{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#8c9eff}.admin-webhooks .history-response-icon.history-error{background:#f44336}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#BDBDBD}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#BDBDBD}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#8c9eff;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{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-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{font-size:.9rem;color:#BDBDBD;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.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 #EEE;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.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{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#BDBDBD;opacity:0}.project-values-row .icon:hover{fill:#424242;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #EEE}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#fff;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff5252}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.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{color:#424242;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#424242;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#BDBDBD}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#BDBDBD}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#8c9eff;fill:#8c9eff}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.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{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#212121;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;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:#212121;color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#8c9eff;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#212121;bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#212121;position:absolute}.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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #424242;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{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:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;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:#212121;content:'';height:15px;position:absolute;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 .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:#8c9eff;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #BDBDBD;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#BDBDBD}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #e4e4e4;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#fff;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#BDBDBD;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#EEE}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#fff;transition:background .2s ease-in}.backlog-table-body input:checked{color:#8c9eff;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.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{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff5252;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#f44336;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 .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#8c9eff}.backlog-table-body .icon-drag{cursor:move;fill:#BDBDBD;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#3f51b5;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#8c9eff}.sprints .add-sprint svg{fill:#EEE;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#BDBDBD}.sprints .sprint svg:hover{fill:#3f51b5;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#8c9eff;transition:color .2s}.sprints .sprint-progress-bar{background:#BDBDBD;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#3f51b5;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#e1e1e1;border:2px dashed #d7d7d7;color:#757575;padding:1rem;text-align:center}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #BDBDBD}.sprints .sprint-table .row{border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(189,189,189,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #BDBDBD}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#dcdcdc;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#cacaca}.sprints .sprint-table .us-name.blocked{color:#f44336}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#cacaca}.sprints .sprint-table .column-points.blocked{color:#f44336}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.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{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#BDBDBD}.sprint-closed .sprint-progress-bar .current-progress{background:#a4a4a4}.sprint-closed .button-gray{background:#BDBDBD}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#3f51b5}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items: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-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(244,67,54,.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 svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(244,67,54,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#BDBDBD}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#3f51b5}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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:#424242;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-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:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#3f51b5;cursor:default}.category-config .resume,.colors-table .row.edition .current-color,.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{cursor:pointer;fill:#f44336;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#3f51b5}.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:#3f51b5}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#BDBDBD;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#BDBDBD;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#3f51b5}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#EEE;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #EEE}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(255,255,255,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-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{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.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:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#EEE;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#BDBDBD;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#8c9eff;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#3f51b5;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#3f51b5;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff5252}.colors-table .gu-mirror{background:#fff;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#BDBDBD}.duty-custom-fields .custom-field-options svg:hover{fill:#3f51b5}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-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{font-size:.9rem;color:#a8a8a8;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff5252}.external-reference{font-size:.9rem;color:#BDBDBD;margin-top:.5rem}.external-reference a{border-left:1px solid #BDBDBD;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#3f51b5}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff5252}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#EEE}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#424242;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#424242;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#8c9eff;border:1px solid #3f51b5}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff5252;border:1px solid #f44336}.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:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#BDBDBD;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#f44336}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.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-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#f44336;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .subtitle{white-space:pre-line}.lightbox-generic-ask .options{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{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-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{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow: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{margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#e1e1e1;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#8c9eff;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e1e1e1;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#3f51b5}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-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-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff5252}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.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{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#BDBDBD;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#8c9eff;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{fill:#fff;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 .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#8c9eff}.main-nav .active svg path{fill:#8c9eff;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#8c9eff}.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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-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 .iocaine{background:rgba(140,158,255,.1);border-left:10px solid #8c9eff}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;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 .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#424242}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #EEE;color:#EEE}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#EEE}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#EEE;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#424242}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#3f51b5}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff5252}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;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{width:.8rem;height:.8rem;fill:#BDBDBD;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #424242;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(140,158,255,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#bbb;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#d5d5d5;transition:background .2s ease-in}.ticket-status .type-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #424242;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:#8c9eff;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#BDBDBD;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#8c9eff}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#f44336;color:#EEE;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff5252}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#8c9eff}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff5252}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-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:#BDBDBD;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;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:#757575}.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:#ff5252}.ticket-detail-settings .item-unblock:hover{background:#f44336}.ticket-detail-settings .button-delete{background:#ff5252}.ticket-detail-settings .button-delete:hover{background:#f44336}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(238,238,238,.2) 100%);background-color:#EEE}.introjs-helperLayer{border:1px solid rgba(140,158,255,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(66,66,66,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#8c9eff}.introjs-button{background-color:#3f51b5;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:#8c9eff;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{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{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-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:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#BDBDBD}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{-ms-flex:1;flex:1;-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 .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#fff;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffb8b8}.issues-table .row.is-blocked .blocked-text{color:#f44336;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e4e4}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#8c9eff;transition:all .2s linear}.issues-table .votes:hover svg{fill:#8c9eff;transition:all .2s linear}.issues-table .votes.inactive{color:#BDBDBD}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#8c9eff;transition:all .2s linear}.issues-table .is-voted svg{fill:#8c9eff;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff5252}.issues-table .is-voted:hover svg{fill:#ff5252;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-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;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{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;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}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-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{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#BDBDBD;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#3f51b5}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#BDBDBD;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#f44336;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #8c9eff,2px 2px 4px #d5d5d5}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#e9e9e9;border:1px dashed #dadada;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #EEE}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#dadada}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#BDBDBD;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #EEE;border-right:1px solid #EEE;color:#424242;position:relative;top:1px}.search-filter a.active .icon{fill:#8c9eff}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#424242;color:#fff}.search-in input::-webkit-input-placeholder{color:#BDBDBD}.search-in input::-moz-placeholder{color:#BDBDBD}.search-in input:-moz-placeholder{color:#BDBDBD}.search-in input:-ms-input-placeholder{color:#BDBDBD}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#BDBDBD}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#fff;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.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{font-size:1rem;color:#BDBDBD}.search-result-table .user-story-name .icon:hover{color:#424242;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #EEE}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;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}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#3f51b5;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#424242}.table-team .attribute .top{fill:#8c9eff;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff5252}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#f44336}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #EEE;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data 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 .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#BDBDBD}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#8c9eff;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #BDBDBD}.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{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#3f51b5;transition:background .3s linear}.policy-table label{background:#BDBDBD;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#8c9eff;cursor:pointer;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-Regular,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{max-width:780px}.user-profile form{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{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{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{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.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;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#f44336}.user-profile .project-details-form-data{-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{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#8c9eff}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#BDBDBD;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #BDBDBD}.wiki-nav input[type=text]{background:#EEE;color:#424242;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#BDBDBD}.wiki-nav input[type=text]::-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-ms-input-placeholder{color:#BDBDBD}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#BDBDBD;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#f44336}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#BDBDBD;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff5252}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-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-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#BDBDBD}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff5252}.attachment-gallery .icon-delete:hover svg{color:#f44336}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#BDBDBD}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-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{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#BDBDBD;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#3f51b5}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#f44336}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{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{margin-bottom:4rem}.attachments .gu-transit{background:#EEE;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#424242;line-height:36px;padding:0 1rem}.attachments-header .options{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;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#8c9eff}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.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;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #BDBDBD;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#3f51b5;margin-left:.5rem}.more-attachments:hover{background:#fff;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#BDBDBD}.attachment-preview .attachment-preview-container svg:hover{fill:#8c9eff;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #EEE;cursor:pointer}.assignable-member-single:hover{background:rgba(140,158,255,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(140,158,255,.05);border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff5252;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#f44336}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#1c2586}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-ms-fill-lower{background:#EEE}.range-slider:focus::-ms-fill-upper{background:#f3f3f3}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#e9e9e9;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#EEE;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #d5d5d5;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #d5d5d5}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff5252}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,82,82,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#BDBDBD}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#8c9eff}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem 1rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#BDBDBD;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-statistics{font-size:.9rem;color:#fdfdfd;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#8c9eff}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .icon{width:.75rem;height:.75rem;fill:#fdfdfd;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#EEE;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#8c9eff;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#EEE}.card-tasks{border-top:1px solid #EEE;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #EEE}.card-task a{color:#BDBDBD;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff5252}.card-task a.closed-task{color:#BDBDBD;text-decoration:line-through}.card-task a:hover{color:#3f51b5}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(140,158,255,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #BDBDBD;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#f44336;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#BDBDBD;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg{width:1.25rem;height:1.25rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.edit-title-wrapper .edit-title-button:hover{fill:#3f51b5}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav a{display:inline-block}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(63,81,181,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#424242;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#BDBDBD}tg-filter input::-moz-placeholder{color:#BDBDBD}tg-filter input:-moz-placeholder{color:#BDBDBD}tg-filter input:-ms-input-placeholder{color:#BDBDBD}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #BDBDBD;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#3f51b5}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#424242;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#d5d5d5;color:#424242;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#e1e1e1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#dadada;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#424242;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#bbb;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#f44336}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-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 .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.tag,.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#BDBDBD;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#424242;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#3f51b5}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #BDBDBD;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#fff;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#BDBDBD;cursor:pointer}.add-tag-button:hover{color:#8c9eff}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.add-tag-button .add-tag-text{font-size:.9rem}.tag{font-size:.9rem;background:#f5f5f5;border-radius:0 5px 5px 0;color:#424242;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff5252;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(66,66,66,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff5252;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#f44336}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#3f51b5;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-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 a{color:#3f51b5;cursor:pointer}.wysiwyg a:hover{color:#8c9eff}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#EEE;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #BDBDBD;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.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}.wysiwyg hr{border:1px solid #EEE}.medium-editor-mention-panel{background-color:#fff;border:1px solid #BDBDBD;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #BDBDBD;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#1a237e;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#f44336}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#BDBDBD}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#BDBDBD;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#BDBDBD;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#BDBDBD;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #BDBDBD}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#8c9eff}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#8c9eff}.discover-header{background:url(../images/discover.png) bottom left repeat-x #EEE;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 .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#3f51b5}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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:#8c9eff}.discover-header input[type=text]:-webkit-autofill{background:rgba(26,35,126,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#BDBDBD;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#3f51b5}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#BDBDBD;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#3f51b5}.filter-discover-search .discover-search-filter.active svg{fill:#3f51b5}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff5252;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#f44336}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#BDBDBD;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#8c9eff;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#424242;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #EEE;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#3f51b5}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.featured-project .project-card-name a:hover{color:#8c9eff}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-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{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#BDBDBD;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#BDBDBD;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#424242;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-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 #EEE;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#BDBDBD;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;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 .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(140,158,255,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-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{-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{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#3f51b5}.highlighted-project .project-title a:hover{color:#8c9eff}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#BDBDBD;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#3f51b5}.highlighted-project .statistic.active svg{fill:#3f51b5}.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:#BDBDBD;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#8c9eff;color:#fff}.discover-search .searchbox-filters label:hover{background:#EEE;color:#757575}.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 #BDBDBD;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#BDBDBD;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#3f51b5}.discover-results .statistic.active svg{fill:#3f51b5}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#BDBDBD;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#8c9eff;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff5252;border:1px solid #f44336}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(140,158,255,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,82,82,.5)}.epic-row.is-closed .name a{color:#e3e3e3;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#8c9eff;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#BDBDBD}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #424242;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#8c9eff;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#3f51b5;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #EEE;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(140,158,255,.05)}.story-row.is-blocked{background:rgba(255,82,82,.5)}.story-row.is-closed .name{color:#BDBDBD;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#8c9eff;width:10vw}.story-row .vote{color:#757575}.story-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#8c9eff;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#8c9eff}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(238,238,238,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(140,158,255,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#8c9eff;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#424242;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#8c9eff;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#8c9eff}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(140,158,255,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #EEE;color:#EEE}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#EEE}tg-related-userstory-row .closed .userstory-name a{color:#EEE;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff5252}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.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:-ms-flexbox;display:flex}.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 h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;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%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #BDBDBD;height:55px}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#3f51b5;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#BDBDBD}.comment .comment-edited{font-size:.9rem;background:#EEE;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#3f51b5;fill:#3f51b5}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:#f44336}.comment .comment-options .icon-trash{fill:#ff5252}.comment .comment-options .icon-trash:hover{fill:#f44336}.comment .deleted-comment-wrapper{border-bottom:1px solid #EEE;padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#BDBDBD;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#3f51b5;fill:#3f51b5;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#3f51b5;fill:#3f51b5}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#3f51b5;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#BDBDBD}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#3f51b5;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#EEE;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#BDBDBD;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(242,244,255,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,82,82,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#3f51b5;margin-right:.5rem}.activity .activity-date{color:#BDBDBD}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #EEE;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(140,158,255,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,82,82,.2);color:#f44336}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #EEE;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#3f51b5}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.home-project .project-card-name a:hover{color:#8c9eff}.home-project:hover{border:1px solid rgba(140,158,255,.2);box-shadow:0 0 5px #EEE}.home-project.blocked-project{border:#EEE}.home-project.blocked-project:hover{border:#EEE;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#EEE;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.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 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #EEE;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e1e1e1;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #EEE;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff5252;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#f44336}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#424242;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#8c9eff}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#BDBDBD;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#424242;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(140,158,255,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(26,35,126,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg{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;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{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}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff5252;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#BDBDBD;display:block;padding:.8rem .5rem}.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{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #EEE}.profile-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-contacts,.profile-content-tabs{border-top:1px solid #EEE}.profile-filter .searchbox input:focus{border-bottom:1px solid #BDBDBD;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#BDBDBD;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;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 .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-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{fill:#EEE;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#BDBDBD;font-size:.9rem;margin:0}.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);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);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:#BDBDBD;transition:all .2s linear}.profile-bar .flag:hover path{fill:#f44336;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#757575;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#BDBDBD;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#BDBDBD}.profile-bar .profile-stats{border-bottom:1px solid #EEE;border-top:1px solid #EEE;color:#757575;display:-ms-flexbox;display:flex;-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{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#BDBDBD;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#8c9eff}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #EEE;border-right:1px solid #EEE;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#3f51b5}.profile-content-tabs .icon{fill:#BDBDBD;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#BDBDBD;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#BDBDBD}.profile-sidebar a{color:#3f51b5}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#3f51b5;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#8c9eff}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#BDBDBD;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-import-type input:disabled+label .icon{color:#e3e3e3}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-privacity input:disabled+label .icon{color:#e3e3e3}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #EEE}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#8c9eff}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #EEE}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#8c9eff}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#EEE;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#f44336}.import-project-members-match{color:#BDBDBD}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #3f51b5;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(140,158,255,.3)}.import-project-members-match-true svg{fill:#3f51b5}.import-project-members-match-false{border:1px solid #f44336;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(244,67,54,.3)}.import-project-members-match-false svg{fill:#f44336}.import-project-members-choose{color:#3f51b5;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#8c9eff}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #EEE;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(63,81,181,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #EEE}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#3f51b5;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#3f51b5;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#424242;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#424242;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #EEE}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#8c9eff}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(63,81,181,.6);stroke:rgba(63,81,181,.1)}.create-project-type-issues-subform-radiogr svg{fill:#EEE;stroke:#d5d5d5;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#f44336;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff5252;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#3f51b5}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #EEE}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#8c9eff}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #EEE}.import-project-trello-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#424242}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#8c9eff}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#BDBDBD;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(140,158,255,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#BDBDBD;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#f6f6f6;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#fff;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#BDBDBD;margin-right:.5rem}.transfer-project-statistics svg{fill:#BDBDBD;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#3f51b5;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#8c9eff}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#BDBDBD}.transfer-project-comment-header .icon-close:hover{fill:#ff5252;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #EEE;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:#3f51b5}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#8c9eff}.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{-ms-flex-align:center;align-items:center;color:#BDBDBD;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#BDBDBD;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;-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#BDBDBD}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#424242;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}@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=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;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=url]::-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=url]::-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=url]:-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=url]:-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=url].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}.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:#f5f5f5;border-top:3px solid #3f51b5}.taskboard-table-header .task-colum-name .icon{fill:#3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.kanban-table-header .task-colum-name{background:#fbfbfb;border-top:3px solid #3f51b5}.kanban-table-header .task-colum-name .icon{color:#3f51b5}.kanban-table-body .kanban-uses-box{background:#fbfbfb} \ No newline at end of file diff --git a/dist/v-1520418874500/styles/theme-taiga.css b/dist/v-1521124836513/styles/theme-taiga.css similarity index 90% rename from dist/v-1520418874500/styles/theme-taiga.css rename to dist/v-1521124836513/styles/theme-taiga.css index d16e66c..6e97145 100644 --- a/dist/v-1520418874500/styles/theme-taiga.css +++ b/dist/v-1521124836513/styles/theme-taiga.css @@ -1,4 +1,4 @@ @charset "UTF-8";.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;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!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;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.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;content:'';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-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;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-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{box-sizing:content-box;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-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.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-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.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;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;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}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.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}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}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}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{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}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}.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}.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-select{display:inline-block}.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}.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}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.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}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.backlog-filter,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}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{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{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:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@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 b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#5b8200}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#767676}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}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{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.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:#5b8200;border-radius:0!important;box-shadow:inset 0 1px 3px #5b8200}.pika-single .is-today .pika-button{color:#5b8200}.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}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#9dce0a;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#9dce0a;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],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=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{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}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#555;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#5b8200;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #555;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #e4e3e3}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#050505;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#9dce0a;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(216,248,121,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#879b89;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.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-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#767676;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#767676}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;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;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.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{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(91,130,0,.9);stroke:#9dce0a;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#050505;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #555;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#9dce0a;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#767676;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff}.invitation-main .register-text a{color:#5b8200}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#5b8200}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#e4e3e3}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-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}.error-main a{color:#9dce0a}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#5b8200}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;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:#767676}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#555}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #dad9d9;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#767676}.menu-button,.trans-button:visited{color:#050505}.trans-button .icon,.trans-button span{color:#050505;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#e4e3e3;color:#555}.menu-button span,.menu-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#5b8200}.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:#e4e3e3}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#5b8200;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.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}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#5b8200;display:inline-block;margin-top:.5rem}.button-filter{background:#e4e3e3;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#767676;fill:#e4e3e3}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:red;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#dfdede;border:1px dashed #d0cece;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#d0cece;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#d0cece;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;margin:0}.check{background-color:#cbc9c9;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#555;height:25px;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%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#767676}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-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:#5b8200}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff8282;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#555}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#9dce0a;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#767676;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#5b8200}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(118,118,118,.2);color:#767676;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(157,206,10,.9);color:#e4e3e3}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(135,155,137,.5);border-bottom:0;color:#e4e3e3}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;left:10px;position:absolute;top:-5px;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;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;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;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#5b8200}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#767676;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #444;color:#444}.history-tabs .order-comments{color:#444}.level{background-color:#767676;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#767676}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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 .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-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 .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #e4e3e3;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#767676}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#767676}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:red;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#767676}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#555;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#555;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#bbe831}.loading-bar .item-1{animation-delay:1s;background:#237400}.loading-bar .item-2{animation-delay:2s;background:#e43050}.loading-bar .item-3{animation-delay:3s;background:#810061}.loading-bar .item-4{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;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#767676;margin-left:.25rem}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;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);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(118,118,118,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#767676;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;transition:all .3s linear}.paginator .active span{background:#9dce0a}.select-color,.select-color:after{background:#050505;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#767676;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;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;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;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:#767676;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#e4e3e3;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.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:#767676;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;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{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#9dce0a;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#5b8200}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#434343;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.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{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-ms-flex-line-pack:center;align-content:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #050505;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #555;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#5b8200;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#5b8200;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#879b89;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#879b89;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(157,206,10,.4)}.track-button.active .icon{fill:#5b8200}.track-button.active .track-button-counter{background:rgba(157,206,10,.6)}.track-button.is-hover .track-inner{background:#f33;color:#e4e3e3;transition:background .2s}.track-button.is-hover .icon{fill:#ff8282}.track-button.is-hover .track-button-counter{background:red;color:#e4e3e3;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#e4e3e3;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#d7d6d6;transition:background .3s}.track-icon{fill:#444;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#d7d6d6;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#e4e3e3;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#d7d6d6;transition:background .3s}.watch-options{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{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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(118,118,118,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#9dce0a}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#767676;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#5b8200;transition:all .3s}.upvote-btn a.active svg{fill:#5b8200}.upvote-btn a.is-hover{background:red;color:#e4e3e3}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444;margin-left:.5rem}.upvote-btn a.is-hover svg{fill:#ff8282;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#767676;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.assigned-to-list .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:flex}.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#444;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:red}.ticket-watchers .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:red;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#767676;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#5b8200}.admin-common .admin-subtitle a:hover{color:#9dce0a}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#e4e3e3;color:#444;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;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 #e4e3e3}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;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:#767676}.custom-fields-table .single-custom-field{border-bottom:1px solid #e4e3e3;color:#555}.custom-fields-table .icon-drag{fill:#767676;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#767676;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#5b8200;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff8282}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#5b8200;fill:#5b8200}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#767676}.admin-functionalities .module-name{font-size:1.2rem;color:#767676;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#767676;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#767676}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#5b8200}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff8282;display:inline-block;padding-left:.3rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-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:#e4e3e3}.admin-membership-table .resend{background-color:#5b8200;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#767676;transition:fill .2s}.admin-membership-table .delete:hover{fill:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #cbc9c9}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.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{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#767676;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink: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{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #e4e3e3;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #e4e3e3;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#767676;margin-left:.5rem}.project-details .get-feedback-inner .check,.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{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.backlog-table-body .loading img,.lightbox-generic-loading .spin img,.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#767676;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;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 .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;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[disabled]+label{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#767676}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#5b8200}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff8282;border-radius:6px;color:#ff8282;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#5b8200}.admin-project-profile-owner-actions a:hover{color:#9dce0a;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#767676}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .icon:hover{fill:#5b8200;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#767676;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#767676;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#e4e3e3;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-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 .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #e4e3e3}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#767676;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#5b8200;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#767676}.admin-webhooks .webhook-options svg:hover{fill:#5b8200;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #e4e3e3;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);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{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition: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;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#767676}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#767676}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;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{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-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{font-size:.9rem;color:#767676;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.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 #e4e3e3;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.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{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#767676;opacity:0}.project-values-row .icon:hover{fill:#444;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #e4e3e3}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#e9ffb5;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff8282}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.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{color:#444;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#555;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#767676}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#767676}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#9dce0a;fill:#9dce0a}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#555;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.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{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;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;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;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%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;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;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;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;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#050505;position:absolute}.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;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;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;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{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;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;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;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;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 .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;font-size:1rem;border-bottom:2px solid #767676;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#767676}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #dad9d9;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#e9ffb5;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#767676;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#e4e3e3}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#e9ffb5;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.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{font-size:.9rem;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;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 .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#9dce0a}.backlog-table-body .icon-drag{cursor:move;fill:#767676;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#5b8200;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{fill:#e4e3e3;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#767676}.sprints .sprint svg:hover{fill:#5b8200;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#767676;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#9dce0a;transition:color .2s}.sprints .sprint-progress-bar{background:#767676;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#5b8200;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#d7d6d6;border:2px dashed #909090;color:#555;padding:1rem;text-align:center}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #767676}.sprints .sprint-table .row{border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(118,118,118,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #767676}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#959595;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#838383}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#838383}.sprints .sprint-table .column-points.blocked{color:red}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.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{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#767676}.sprint-closed .sprint-progress-bar .current-progress{background:#5d5d5d}.sprint-closed .button-gray{background:#767676}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#5b8200}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items: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-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.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 svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;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{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#767676}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#5b8200}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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{-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}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#5b8200;cursor:default}.category-config .resume,.colors-table .row.edition .current-color,.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#555;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{cursor:pointer;fill:red;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#5b8200}.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:#5b8200}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#767676;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#767676;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#5b8200}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#e4e3e3;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #e4e3e3}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(216,248,121,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-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{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.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:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#e4e3e3;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#767676;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#9dce0a;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#5b8200;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#5b8200;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff8282}.colors-table .gu-mirror{background:#e9ffb5;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#767676}.duty-custom-fields .custom-field-options svg:hover{fill:#5b8200}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-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{font-size:.9rem;color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#767676;margin-top:.5rem}.external-reference a{border-left:1px solid #767676;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#5b8200}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#555;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff8282}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#e4e3e3}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #767676;color:#444;cursor:pointer;display:block;padding:7px 30px;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:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #5b8200}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.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:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-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-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#767676;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.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-sprint-add-edit .delete-sprint{font-size:.9rem;color:#555;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:red;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .subtitle{white-space:pre-line}.lightbox-generic-ask .options{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{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-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{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow: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{margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#d7d6d6;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#d7d6d6;bottom:35px;color:#555;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#5b8200}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-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-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#555;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff8282}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.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{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#767676;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#9dce0a;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);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 .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-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 .iocaine{background:rgba(157,206,10,.1);border-left:10px solid #9dce0a}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;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 .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #e4e3e3;color:#e4e3e3}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#e4e3e3}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#e4e3e3;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#555}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#444}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#5b8200}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff8282}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;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{width:.8rem;height:.8rem;fill:#767676;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#b2afaf;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#cbc9c9;transition:background .2s ease-in}.ticket-status .type-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;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;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;width:0}.ticket-status .severity-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;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;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;width:0}.ticket-status .priority-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;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;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#767676;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{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:#e4e3e3;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-detail-settings{display:-ms-flexbox;display:flex;-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:#767676;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;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%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(228,227,227,.2) 100%);background-color:#e4e3e3}.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-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#5b8200;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:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{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{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#5b8200;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-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:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#5b8200}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#767676}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{-ms-flex:1;flex:1;-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 .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f0ffcf;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #dad9d9}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#555;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#9dce0a;transition:all .2s linear}.issues-table .votes:hover svg{fill:#9dce0a;transition:all .2s linear}.issues-table .votes.inactive{color:#767676}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#767676;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#9dce0a;transition:all .2s linear}.issues-table .is-voted svg{fill:#9dce0a;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff8282}.issues-table .is-voted:hover svg{fill:#ff8282;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-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;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{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;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;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;height:15px;position:absolute;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}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-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{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#767676;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#5b8200}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#767676;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-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #9dce0a,2px 2px 4px #cbc9c9}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#dfdede;border:1px dashed #d0cece;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #e4e3e3}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#d0cece}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#767676;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;color:#444;position:relative;top:1px}.search-filter a.active .icon{fill:#9dce0a}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#767676}.search-in input::-moz-placeholder{color:#767676}.search-in input:-moz-placeholder{color:#767676}.search-in input:-ms-input-placeholder{color:#767676}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#767676}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#e9ffb5;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.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{font-size:1rem;color:#767676}.search-result-table .user-story-name .icon:hover{color:#444;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e3e3}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;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}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#050505;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#5b8200;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#555}.table-team .attribute .points{font-size:1.6rem;color:#444}.table-team .attribute .top{fill:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff8282}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:red}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #e4e3e3;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data 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 .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#767676}.table-team .popover{font-size:.9rem;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;text-align:"center"}.table-team .popover a{font-size:.9rem;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;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #767676}.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{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#5b8200;transition:background .3s linear}.policy-table label{background:#767676;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;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-Regular,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{max-width:780px}.user-profile form{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{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{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{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.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;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-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{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#9dce0a}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#767676;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #767676}.wiki-nav input[type=text]{background:#e4e3e3;color:#444;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#767676}.wiki-nav input[type=text]::-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-ms-input-placeholder{color:#767676}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#767676;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:red}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#555}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#767676;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff8282}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-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-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#767676}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff8282}.attachment-gallery .icon-delete:hover svg{color:red}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#767676}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-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{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#767676;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#5b8200}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:red}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#767676}.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(91,130,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#e4e3e3;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#444;line-height:36px;padding:0 1rem}.attachments-header .options{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;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#9dce0a}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.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:#767676;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments span,.single-attachment .attachment-size{color:#767676}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #e4e3e3;color:#767676;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#555;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #767676;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#5b8200;margin-left:.5rem}.more-attachments:hover{background:#e9ffb5;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#767676}.attachment-preview .attachment-preview-container svg:hover{fill:#9dce0a;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer}.assignable-member-single:hover{background:rgba(157,206,10,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(157,206,10,.05);border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff8282;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:red}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#8da08e}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-ms-fill-lower{background:#e4e3e3}.range-slider:focus::-ms-fill-upper{background:#e9e8e8}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#dfdede;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#e4e3e3;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #cbc9c9;cursor:move;display:block;margin:0 .6rem .6rem;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #cbc9c9}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff8282}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,130,130,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#767676}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#9dce0a}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem 1rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#767676;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-statistics{font-size:.9rem;color:#b6b6b6;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#9dce0a}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b6b6b6;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#810061}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#e4e3e3;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#9dce0a;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#050505;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#e4e3e3}.card-tasks{border-top:1px solid #e4e3e3;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #e4e3e3}.card-task a{color:#767676;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff8282}.card-task a.closed-task{color:#767676;text-decoration:line-through}.card-task a:hover{color:#5b8200}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(157,206,10,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #767676;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#050505;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:red;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#767676;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#555;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg{width:1.25rem;height:1.25rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.edit-title-wrapper .edit-title-button:hover{fill:#5b8200}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav a{display:inline-block}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(91,130,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#444;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#767676}tg-filter input::-moz-placeholder{color:#767676}tg-filter input:-moz-placeholder{color:#767676}tg-filter input:-ms-input-placeholder{color:#767676}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #767676;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#5b8200}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#444;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#cbc9c9;color:#444;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#d7d6d6;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#d0cece;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#444;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#b2afaf;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#555;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:red}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-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 .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.tag,.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#767676;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#444;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#5b8200}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #767676;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#f4fdda;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#767676;cursor:pointer}.add-tag-button:hover{color:#9dce0a}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.add-tag-button .add-tag-text{font-size:.9rem}.tag{font-size:.9rem;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff8282;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(68,68,68,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff8282;transition:all .2s}.tribe-linked.is-active svg:hover{fill:red}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#5b8200;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-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 a{color:#5b8200;cursor:pointer}.wysiwyg a:hover{color:#9dce0a}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#e4e3e3;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #767676;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#767676 1px solid}.wysiwyg th{border-right:#767676 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#767676 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #e4e3e3}.medium-editor-mention-panel{background-color:#fff;border:1px solid #767676;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #767676;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#879b89;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:red}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#767676}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#767676;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#767676;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#767676;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #767676}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#9dce0a}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#9dce0a}.discover-header{background:url(../images/discover.png) bottom left repeat-x #e4e3e3;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 .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#5b8200}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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{width:1.5rem;height:1.5rem;fill:#767676;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#5b8200}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#767676;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#5b8200}.filter-discover-search .discover-search-filter.active svg{fill:#5b8200}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff8282;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#767676;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#444;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#5b8200}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#5b8200}.featured-project .project-card-name a:hover{color:#9dce0a}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-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{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#767676;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#767676;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#444;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-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 #e4e3e3;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#767676;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;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 .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-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{-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{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#5b8200}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .project-description{font-size:.9rem;color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#767676;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#5b8200}.highlighted-project .statistic.active svg{fill:#5b8200}.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:#767676;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#e4e3e3;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 #767676;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#767676;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#5b8200}.discover-results .statistic.active svg{fill:#5b8200}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:red;border:1px solid red;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #767676;color:#767676;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#9dce0a;border:1px solid #5b8200;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff8282;border:1px solid red}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(157,206,10,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,130,130,.5)}.epic-row.is-closed .name a{color:#9c9c9c;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#767676;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#9dce0a;width:10vw}.epic-row .vote{color:#555}.epic-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#767676}.epic-row .epic-statuses{font-size:.9rem;background:rgba(5,5,5,.9);border-bottom:1px solid #444;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#9dce0a;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#5b8200;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #e4e3e3;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(157,206,10,.05)}.story-row.is-blocked{background:rgba(255,130,130,.5)}.story-row.is-closed .name{color:#767676;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#9dce0a;width:10vw}.story-row .vote{color:#555}.story-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#9dce0a;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#9dce0a}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(228,227,227,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(157,206,10,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#9dce0a;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#444;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#9dce0a;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#9dce0a}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(157,206,10,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #e4e3e3;color:#e4e3e3}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#e4e3e3}tg-related-userstory-row .closed .userstory-name a{color:#e4e3e3;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#555}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff8282}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.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:-ms-flexbox;display:flex}.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 h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;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%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #767676;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #e4e3e3}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#5b8200;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#767676}.comment .comment-edited{font-size:.9rem;background:#e4e3e3;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#5b8200;fill:#5b8200}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#555}.comment .comment-options .icon-close{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:red}.comment .comment-options .icon-trash{fill:#ff8282}.comment .comment-options .icon-trash:hover{fill:red}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#767676;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#5b8200;fill:#5b8200;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#5b8200;fill:#5b8200}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#5b8200;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#767676}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#5b8200;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e4e3e3;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#767676;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(203,246,72,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,130,130,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#5b8200;margin-right:.5rem}.activity .activity-date{color:#767676}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #e4e3e3;cursor:pointer;transition:background .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{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.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{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#555}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#5b8200}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#5b8200}.home-project .project-card-name a:hover{color:#9dce0a}.home-project:hover{border:1px solid rgba(157,206,10,.2);box-shadow:0 0 5px #e4e3e3}.home-project.blocked-project{border:#e4e3e3}.home-project.blocked-project:hover{border:#e4e3e3;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#e4e3e3;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.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 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #e4e3e3;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#d7d6d6;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #e4e3e3;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff8282;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:red}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#444;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#9dce0a}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#767676;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#444;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#050505}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(157,206,10,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(135,155,137,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg{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;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{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}.navbar-dropdown ul:after{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff8282;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#767676;display:block;padding:.8rem .5rem}.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{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#555}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #e4e3e3}.profile-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#555;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #e4e3e3}.profile-filter .searchbox input:focus{border-bottom:1px solid #767676;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#767676;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;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 .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-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{fill:#e4e3e3;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#767676;font-size:.9rem;margin:0}.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);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);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:#767676;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#767676;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#767676}.profile-bar .profile-stats{border-bottom:1px solid #e4e3e3;color:#555;display:-ms-flexbox;display:flex;-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{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#767676;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#555;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#9dce0a}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#5b8200}.profile-content-tabs .icon{fill:#767676;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#767676;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#767676}.profile-sidebar a{color:#5b8200}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#5b8200;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#767676;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#9dce0a}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#767676;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-import-type input:disabled+label .icon{color:#9c9c9c}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-privacity input:disabled+label .icon{color:#9c9c9c}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #e4e3e3}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#9dce0a}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#767676;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#9dce0a}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#e4e3e3;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:red}.import-project-members-match{color:#767676}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #5b8200;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(157,206,10,.3)}.import-project-members-match-true svg{fill:#5b8200}.import-project-members-match-false{border:1px solid red;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,0,0,.3)}.import-project-members-match-false svg{fill:red}.import-project-members-choose{color:#5b8200;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#9dce0a}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #e4e3e3;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#555;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(91,130,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #e4e3e3}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#5b8200;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#5b8200;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#444;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#444;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#767676;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#9dce0a}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(91,130,0,.6);stroke:rgba(91,130,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#e4e3e3;stroke:#cbc9c9;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:red;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff8282;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#5b8200}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#767676;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#9dce0a}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #e4e3e3}.import-project-trello-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#444}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#9dce0a}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#767676;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(157,206,10,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#767676;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#ecebeb;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#edffc4;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#767676;margin-right:.5rem}.transfer-project-statistics svg{fill:#767676;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#5b8200;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#9dce0a}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#767676}.transfer-project-comment-header .icon-close:hover{fill:#ff8282;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #e4e3e3;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:#5b8200}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;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{-ms-flex-align:center;align-items:center;color:#767676;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#767676;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;-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#767676}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#444;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#5b8200}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#767676;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#909090}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#909090}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#909090}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#909090}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].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}.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{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #767676}.taskboard-table-header .task-colum-name .icon{fill:#767676}.kanban-table-header .task-colum-name{border-top:3px solid #767676}.kanban-table-header .task-colum-name .icon{color:#767676} \ No newline at end of file + */.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}.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}.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-select{display:inline-block}.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}.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}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.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}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.backlog-filter,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}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{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{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:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@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 b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#5b8200}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#767676}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}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{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.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:#5b8200;border-radius:0!important;box-shadow:inset 0 1px 3px #5b8200}.pika-single .is-today .pika-button{color:#5b8200}.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}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#9dce0a;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#9dce0a;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],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=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{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}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#555;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#5b8200;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #555;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #e4e3e3}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#050505;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#9dce0a;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(216,248,121,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#879b89;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.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-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#767676;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#767676}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;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;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.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{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(91,130,0,.9);stroke:#9dce0a;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#050505;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #555;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#9dce0a;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#767676;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff}.invitation-main .register-text a{color:#5b8200}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#5b8200}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#e4e3e3}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-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}.error-main a{color:#9dce0a}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%}.team h2{margin:1rem 0}.team h2 span:last-child{color:#5b8200}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;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:#767676}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#555}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #dad9d9;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#767676}.menu-button,.trans-button:visited{color:#050505}.trans-button .icon,.trans-button span{color:#050505;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#e4e3e3;color:#555}.menu-button span,.menu-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#5b8200}.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:#e4e3e3}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#5b8200;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.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}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#5b8200;display:inline-block;margin-top:.5rem}.button-filter{background:#e4e3e3;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#767676;fill:#e4e3e3}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:red;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#dfdede;border:1px dashed #d0cece;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#d0cece;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#d0cece;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;margin:0}.check{background-color:#cbc9c9;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#555;height:25px;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%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#767676}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-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:#5b8200}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff8282;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#555}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#9dce0a;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#767676;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#5b8200}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(118,118,118,.2);color:#767676;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(157,206,10,.9);color:#e4e3e3}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(135,155,137,.5);border-bottom:0;color:#e4e3e3}.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:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;left:10px;position:absolute;top:-5px;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;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;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;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#5b8200}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#767676;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #444;color:#444}.history-tabs .order-comments{color:#444}.level{background-color:#767676;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#767676}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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 .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-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 .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #e4e3e3;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#767676}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#767676}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:red;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#767676}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#555;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#555;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#bbe831}.loading-bar .item-1{animation-delay:1s;background:#237400}.loading-bar .item-2{animation-delay:2s;background:#e43050}.loading-bar .item-3{animation-delay:3s;background:#810061}.loading-bar .item-4{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;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#767676;margin-left:.25rem}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;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);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(118,118,118,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#767676;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;transition:all .3s linear}.paginator .active span{background:#9dce0a}.select-color,.select-color:after{background:#050505;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#767676;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;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;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;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:#767676;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#e4e3e3;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.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:#767676;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;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{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#9dce0a;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#5b8200}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#434343;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.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{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-ms-flex-line-pack:center;align-content:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #050505;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #555;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#5b8200;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#5b8200;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#879b89;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#879b89;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(157,206,10,.4)}.track-button.active .icon{fill:#5b8200}.track-button.active .track-button-counter{background:rgba(157,206,10,.6)}.track-button.is-hover .track-inner{background:#f33;color:#e4e3e3;transition:background .2s}.track-button.is-hover .icon{fill:#ff8282}.track-button.is-hover .track-button-counter{background:red;color:#e4e3e3;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#e4e3e3;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#d7d6d6;transition:background .3s}.track-icon{fill:#444;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#d7d6d6;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#e4e3e3;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#d7d6d6;transition:background .3s}.watch-options{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{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{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid rgba(118,118,118,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#9dce0a}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#767676;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#5b8200;transition:all .3s}.upvote-btn a.active svg{fill:#5b8200}.upvote-btn a.is-hover{background:red;color:#e4e3e3}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444;margin-left:.5rem}.upvote-btn a.is-hover svg{fill:#ff8282;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#767676;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single,.ticket-watchers .user-list-single{display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.assigned-to-list .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:flex}.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#444;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:red}.ticket-watchers .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:red;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#767676;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#5b8200}.admin-common .admin-subtitle a:hover{color:#9dce0a}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#e4e3e3;color:#444;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;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 #e4e3e3}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;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:#767676}.custom-fields-table .single-custom-field{border-bottom:1px solid #e4e3e3;color:#555}.custom-fields-table .icon-drag{fill:#767676;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#767676;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#5b8200;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff8282}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#5b8200;fill:#5b8200}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#767676}.admin-functionalities .module-name{font-size:1.2rem;color:#767676;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#767676;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#767676}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#5b8200}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff8282;display:inline-block;padding-left:.3rem}.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{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-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:#e4e3e3}.admin-membership-table .resend{background-color:#5b8200;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#767676;transition:fill .2s}.admin-membership-table .delete:hover{fill:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #cbc9c9}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.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{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#767676;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink: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{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #e4e3e3;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #e4e3e3;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#767676;margin-left:.5rem}.project-details .get-feedback-inner .check,.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{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.backlog-table-body .loading img,.lightbox-generic-loading .spin img,.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#767676;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;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 .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;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[disabled]+label{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#767676}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#5b8200}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff8282;border-radius:6px;color:#ff8282;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#5b8200}.admin-project-profile-owner-actions a:hover{color:#9dce0a;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#767676}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .icon:hover{fill:#5b8200;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#767676;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#767676;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#e4e3e3;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.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;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-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 .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #e4e3e3}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#767676;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#5b8200;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#767676}.admin-webhooks .webhook-options svg:hover{fill:#5b8200;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #e4e3e3;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);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{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition: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;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#767676}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#767676}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;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{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-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{font-size:.9rem;color:#767676;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.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 #e4e3e3;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.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{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#767676;opacity:0}.project-values-row .icon:hover{fill:#444;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #e4e3e3}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#e9ffb5;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff8282}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.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{color:#444;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#555;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#767676}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#767676}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#9dce0a;fill:#9dce0a}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#555;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.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{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;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;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;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%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;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;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;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;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#050505;position:absolute}.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;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;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;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{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;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;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;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;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 .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;font-size:1rem;border-bottom:2px solid #767676;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#767676}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #dad9d9;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#e9ffb5;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#767676;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#e4e3e3}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#e9ffb5;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.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{font-size:.9rem;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;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 .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#9dce0a}.backlog-table-body .icon-drag{cursor:move;fill:#767676;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#5b8200;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{fill:#e4e3e3;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#767676}.sprints .sprint svg:hover{fill:#5b8200;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#767676;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#9dce0a;transition:color .2s}.sprints .sprint-progress-bar{background:#767676;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#5b8200;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#d7d6d6;border:2px dashed #909090;color:#555;padding:1rem;text-align:center}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #767676}.sprints .sprint-table .row{border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(118,118,118,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #767676}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#959595;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#838383}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#838383}.sprints .sprint-table .column-points.blocked{color:red}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.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{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#767676}.sprint-closed .sprint-progress-bar .current-progress{background:#5d5d5d}.sprint-closed .button-gray{background:#767676}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#5b8200}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items: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-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.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 svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;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{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#767676}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#5b8200}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-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{-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}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#5b8200;cursor:default}.category-config .resume,.colors-table .row.edition .current-color,.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#555;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{cursor:pointer;fill:red;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#5b8200}.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:#5b8200}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#767676;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#767676;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#5b8200}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#e4e3e3;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #e4e3e3}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(216,248,121,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-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{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.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:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#e4e3e3;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#767676;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#9dce0a;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#5b8200;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#5b8200;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff8282}.colors-table .gu-mirror{background:#e9ffb5;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#767676}.duty-custom-fields .custom-field-options svg:hover{fill:#5b8200}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-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{font-size:.9rem;color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#767676;margin-top:.5rem}.external-reference a{border-left:1px solid #767676;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#5b8200}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#555;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff8282}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#e4e3e3}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #767676;color:#444;cursor:pointer;display:block;padding:7px 30px;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:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #5b8200}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.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:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-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-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#767676;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.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-sprint-add-edit .delete-sprint{font-size:.9rem;color:#555;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:red;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .subtitle{white-space:pre-line}.lightbox-generic-ask .options{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{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-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 .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-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:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-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{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow: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{margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#d7d6d6;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#d7d6d6;bottom:35px;color:#555;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#5b8200}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-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-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#555;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff8282}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.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{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#767676;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#9dce0a;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);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 .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;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{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-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 .iocaine{background:rgba(157,206,10,.1);border-left:10px solid #9dce0a}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;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 .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #e4e3e3;color:#e4e3e3}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#e4e3e3}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#e4e3e3;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#555}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#444}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#5b8200}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff8282}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;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{width:.8rem;height:.8rem;fill:#767676;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#b2afaf;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#cbc9c9;transition:background .2s ease-in}.ticket-status .type-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;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;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;width:0}.ticket-status .severity-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;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;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;width:0}.ticket-status .priority-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;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;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#767676;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{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:#e4e3e3;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-detail-settings{display:-ms-flexbox;display:flex;-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:#767676;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;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%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(228,227,227,.2) 100%);background-color:#e4e3e3}.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-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#5b8200;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:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{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{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#5b8200;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-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:-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:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#5b8200}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#767676}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{-ms-flex:1;flex:1;-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 .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f0ffcf;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #dad9d9}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#555;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#9dce0a;transition:all .2s linear}.issues-table .votes:hover svg{fill:#9dce0a;transition:all .2s linear}.issues-table .votes.inactive{color:#767676}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#767676;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#9dce0a;transition:all .2s linear}.issues-table .is-voted svg{fill:#9dce0a;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff8282}.issues-table .is-voted:hover svg{fill:#ff8282;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-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;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{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;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;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;height:15px;position:absolute;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}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-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{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#767676;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#5b8200}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#767676;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-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #9dce0a,2px 2px 4px #cbc9c9}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#dfdede;border:1px dashed #d0cece;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #e4e3e3}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#d0cece}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#767676;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;color:#444;position:relative;top:1px}.search-filter a.active .icon{fill:#9dce0a}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#767676}.search-in input::-moz-placeholder{color:#767676}.search-in input:-moz-placeholder{color:#767676}.search-in input:-ms-input-placeholder{color:#767676}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#767676}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#e9ffb5;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.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{font-size:1rem;color:#767676}.search-result-table .user-story-name .icon:hover{color:#444;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e3e3}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;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}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#050505;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#5b8200;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#555}.table-team .attribute .points{font-size:1.6rem;color:#444}.table-team .attribute .top{fill:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff8282}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:red}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #e4e3e3;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data 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 .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#767676}.table-team .popover{font-size:.9rem;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;text-align:"center"}.table-team .popover a{font-size:.9rem;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;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #767676}.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{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#5b8200;transition:background .3s linear}.policy-table label{background:#767676;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;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-Regular,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{max-width:780px}.user-profile form{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{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{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{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.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;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-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{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#9dce0a}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#767676;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #767676}.wiki-nav input[type=text]{background:#e4e3e3;color:#444;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#767676}.wiki-nav input[type=text]::-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-ms-input-placeholder{color:#767676}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#767676;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:red}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#555}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#767676;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff8282}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-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-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#767676}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff8282}.attachment-gallery .icon-delete:hover svg{color:red}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#767676}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-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{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#767676;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#5b8200}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:red}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#767676}.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(91,130,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#e4e3e3;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#444;line-height:36px;padding:0 1rem}.attachments-header .options{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;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#9dce0a}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.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:#767676;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments span,.single-attachment .attachment-size{color:#767676}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #e4e3e3;color:#767676;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#555;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #767676;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#5b8200;margin-left:.5rem}.more-attachments:hover{background:#e9ffb5;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#767676}.attachment-preview .attachment-preview-container svg:hover{fill:#9dce0a;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer}.assignable-member-single:hover{background:rgba(157,206,10,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(157,206,10,.05);border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff8282;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:red}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#8da08e}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-ms-fill-lower{background:#e4e3e3}.range-slider:focus::-ms-fill-upper{background:#e9e8e8}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#dfdede;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#e4e3e3;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #cbc9c9;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #cbc9c9}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff8282}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,130,130,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#767676}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#9dce0a}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem 1rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#767676;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-statistics{font-size:.9rem;color:#b6b6b6;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#9dce0a}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b6b6b6;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#810061}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#e4e3e3;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#9dce0a;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#050505;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#e4e3e3}.card-tasks{border-top:1px solid #e4e3e3;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #e4e3e3}.card-task a{color:#767676;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff8282}.card-task a.closed-task{color:#767676;text-decoration:line-through}.card-task a:hover{color:#5b8200}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(157,206,10,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #767676;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#050505;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:red;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#767676;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#555;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg{width:1.25rem;height:1.25rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.edit-title-wrapper .edit-title-button:hover{fill:#5b8200}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav a{display:inline-block}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(91,130,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#444;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#767676}tg-filter input::-moz-placeholder{color:#767676}tg-filter input:-moz-placeholder{color:#767676}tg-filter input:-ms-input-placeholder{color:#767676}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #767676;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#5b8200}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#444;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#cbc9c9;color:#444;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#d7d6d6;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#d0cece;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#444;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#b2afaf;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#555;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:red}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-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 .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.tag,.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#767676;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#444;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#5b8200}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #767676;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#f4fdda;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#767676;cursor:pointer}.add-tag-button:hover{color:#9dce0a}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.add-tag-button .add-tag-text{font-size:.9rem}.tag{font-size:.9rem;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff8282;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(68,68,68,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff8282;transition:all .2s}.tribe-linked.is-active svg:hover{fill:red}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#5b8200;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-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 a{color:#5b8200;cursor:pointer}.wysiwyg a:hover{color:#9dce0a}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#e4e3e3;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #767676;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#767676 1px solid}.wysiwyg th{border-right:#767676 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#767676 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #e4e3e3}.medium-editor-mention-panel{background-color:#fff;border:1px solid #767676;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #767676;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#879b89;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:red}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#767676}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#767676;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#767676;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#767676;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #767676}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#9dce0a}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#9dce0a}.discover-header{background:url(../images/discover.png) bottom left repeat-x #e4e3e3;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 .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#5b8200}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.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{width:1.5rem;height:1.5rem;fill:#767676;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#5b8200}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#767676;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#5b8200}.filter-discover-search .discover-search-filter.active svg{fill:#5b8200}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff8282;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#767676;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#444;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#5b8200}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#5b8200}.featured-project .project-card-name a:hover{color:#9dce0a}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-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{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#767676;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#767676;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#444;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-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 #e4e3e3;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#767676;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;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 .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-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{-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{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#5b8200}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .project-description{font-size:.9rem;color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#767676;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#5b8200}.highlighted-project .statistic.active svg{fill:#5b8200}.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:#767676;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#e4e3e3;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 #767676;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#767676;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#5b8200}.discover-results .statistic.active svg{fill:#5b8200}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:red;border:1px solid red;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #767676;color:#767676;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#9dce0a;border:1px solid #5b8200;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff8282;border:1px solid red}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(157,206,10,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,130,130,.5)}.epic-row.is-closed .name a{color:#9c9c9c;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#767676;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#9dce0a;width:10vw}.epic-row .vote{color:#555}.epic-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#767676}.epic-row .epic-statuses{font-size:.9rem;background:rgba(5,5,5,.9);border-bottom:1px solid #444;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#9dce0a;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#5b8200;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #e4e3e3;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(157,206,10,.05)}.story-row.is-blocked{background:rgba(255,130,130,.5)}.story-row.is-closed .name{color:#767676;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#9dce0a;width:10vw}.story-row .vote{color:#555}.story-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#9dce0a;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#9dce0a}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(228,227,227,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(157,206,10,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#9dce0a;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#444;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#9dce0a;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#9dce0a}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(157,206,10,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #e4e3e3;color:#e4e3e3}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#e4e3e3}tg-related-userstory-row .closed .userstory-name a{color:#e4e3e3;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#555}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff8282}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.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:-ms-flexbox;display:flex}.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 h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;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%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #767676;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #e4e3e3}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#5b8200;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#767676}.comment .comment-edited{font-size:.9rem;background:#e4e3e3;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#5b8200;fill:#5b8200}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#555}.comment .comment-options .icon-close{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:red}.comment .comment-options .icon-trash{fill:#ff8282}.comment .comment-options .icon-trash:hover{fill:red}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#767676;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#5b8200;fill:#5b8200;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#5b8200;fill:#5b8200}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#5b8200;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#767676}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#5b8200;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e4e3e3;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#767676;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(203,246,72,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,130,130,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#5b8200;margin-right:.5rem}.activity .activity-date{color:#767676}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #e4e3e3;cursor:pointer;transition:background .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{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.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{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#555}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#5b8200}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-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:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#5b8200}.home-project .project-card-name a:hover{color:#9dce0a}.home-project:hover{border:1px solid rgba(157,206,10,.2);box-shadow:0 0 5px #e4e3e3}.home-project.blocked-project{border:#e4e3e3}.home-project.blocked-project:hover{border:#e4e3e3;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#e4e3e3;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.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 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #e4e3e3;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#d7d6d6;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #e4e3e3;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff8282;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:red}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#444;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#9dce0a}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#767676;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#444;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#050505}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(157,206,10,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-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{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(135,155,137,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg{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;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{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}.navbar-dropdown ul:after{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff8282;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#767676;display:block;padding:.8rem .5rem}.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{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#555}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #e4e3e3}.profile-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#555;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #e4e3e3}.profile-filter .searchbox input:focus{border-bottom:1px solid #767676;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#767676;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;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 .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-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{fill:#e4e3e3;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#767676;font-size:.9rem;margin:0}.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);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);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:#767676;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#767676;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#767676}.profile-bar .profile-stats{border-bottom:1px solid #e4e3e3;color:#555;display:-ms-flexbox;display:flex;-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{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#767676;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#555;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#9dce0a}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#5b8200}.profile-content-tabs .icon{fill:#767676;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#767676;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#767676}.profile-sidebar a{color:#5b8200}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#5b8200;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#767676;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#9dce0a}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#767676;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-import-type input:disabled+label .icon{color:#9c9c9c}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-privacity input:disabled+label .icon{color:#9c9c9c}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #e4e3e3}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#9dce0a}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#767676;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#9dce0a}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#e4e3e3;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:red}.import-project-members-match{color:#767676}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #5b8200;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(157,206,10,.3)}.import-project-members-match-true svg{fill:#5b8200}.import-project-members-match-false{border:1px solid red;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,0,0,.3)}.import-project-members-match-false svg{fill:red}.import-project-members-choose{color:#5b8200;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#9dce0a}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #e4e3e3;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#555;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(91,130,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #e4e3e3}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#5b8200;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#5b8200;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#444;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#444;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#767676;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#9dce0a}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(91,130,0,.6);stroke:rgba(91,130,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#e4e3e3;stroke:#cbc9c9;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:red;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff8282;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#5b8200}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#767676;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#9dce0a}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #e4e3e3}.import-project-trello-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#444}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-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;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#9dce0a}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#767676;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(157,206,10,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#767676;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#ecebeb;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#edffc4;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#767676;margin-right:.5rem}.transfer-project-statistics svg{fill:#767676;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#5b8200;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#9dce0a}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#767676}.transfer-project-comment-header .icon-close:hover{fill:#ff8282;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #e4e3e3;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:#5b8200}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;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{-ms-flex-align:center;align-items:center;color:#767676;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#767676;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;-ms-flex-preferred-size:2rem;flex-basis:2rem;-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-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#767676}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#444;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#5b8200}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#767676;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#909090}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#909090}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#909090}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#909090}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].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}.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{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #767676}.taskboard-table-header .task-colum-name .icon{fill:#767676}.kanban-table-header .task-colum-name{border-top:3px solid #767676}.kanban-table-header .task-colum-name .icon{color:#767676} \ No newline at end of file diff --git a/dist/v-1520418874500/svg/editor.svg b/dist/v-1521124836513/svg/editor.svg similarity index 100% rename from dist/v-1520418874500/svg/editor.svg rename to dist/v-1521124836513/svg/editor.svg diff --git a/dist/v-1520418874500/svg/icons/block-user.svg b/dist/v-1521124836513/svg/icons/block-user.svg similarity index 100% rename from dist/v-1520418874500/svg/icons/block-user.svg rename to dist/v-1521124836513/svg/icons/block-user.svg diff --git a/dist/v-1520418874500/svg/icons/multi-block-project.svg b/dist/v-1521124836513/svg/icons/multi-block-project.svg similarity index 100% rename from dist/v-1520418874500/svg/icons/multi-block-project.svg rename to dist/v-1521124836513/svg/icons/multi-block-project.svg diff --git a/dist/v-1520418874500/svg/icons/project-limit.svg b/dist/v-1521124836513/svg/icons/project-limit.svg similarity index 100% rename from dist/v-1520418874500/svg/icons/project-limit.svg rename to dist/v-1521124836513/svg/icons/project-limit.svg diff --git a/dist/v-1520418874500/svg/icons/team-question.svg b/dist/v-1521124836513/svg/icons/team-question.svg similarity index 100% rename from dist/v-1520418874500/svg/icons/team-question.svg rename to dist/v-1521124836513/svg/icons/team-question.svg diff --git a/dist/v-1520418874500/svg/logo-color.svg b/dist/v-1521124836513/svg/logo-color.svg similarity index 100% rename from dist/v-1520418874500/svg/logo-color.svg rename to dist/v-1521124836513/svg/logo-color.svg diff --git a/dist/v-1520418874500/svg/logo-moustache.svg b/dist/v-1521124836513/svg/logo-moustache.svg similarity index 100% rename from dist/v-1520418874500/svg/logo-moustache.svg rename to dist/v-1521124836513/svg/logo-moustache.svg diff --git a/dist/v-1520418874500/svg/logo-nav.svg b/dist/v-1521124836513/svg/logo-nav.svg similarity index 100% rename from dist/v-1520418874500/svg/logo-nav.svg rename to dist/v-1521124836513/svg/logo-nav.svg diff --git a/dist/v-1520418874500/svg/logo.svg b/dist/v-1521124836513/svg/logo.svg similarity index 100% rename from dist/v-1520418874500/svg/logo.svg rename to dist/v-1521124836513/svg/logo.svg diff --git a/dist/v-1520418874500/svg/pattern.svg b/dist/v-1521124836513/svg/pattern.svg similarity index 100% rename from dist/v-1520418874500/svg/pattern.svg rename to dist/v-1521124836513/svg/pattern.svg diff --git a/dist/v-1520418874500/svg/spinner-circle.svg b/dist/v-1521124836513/svg/spinner-circle.svg similarity index 100% rename from dist/v-1520418874500/svg/spinner-circle.svg rename to dist/v-1521124836513/svg/spinner-circle.svg diff --git a/dist/v-1520418874500/svg/spinner.svg b/dist/v-1521124836513/svg/spinner.svg similarity index 100% rename from dist/v-1520418874500/svg/spinner.svg rename to dist/v-1521124836513/svg/spinner.svg diff --git a/dist/v-1520418874500/svg/sprite.svg b/dist/v-1521124836513/svg/sprite.svg similarity index 100% rename from dist/v-1520418874500/svg/sprite.svg rename to dist/v-1521124836513/svg/sprite.svg