2020-06-22 08:08:47 -04:00
- page_title _("Value Stream Analytics")
2020-09-30 05:10:11 -04:00
- add_page_specific_style 'page_bundles/cycle_analytics'
2016-10-28 10:56:12 -04:00
2019-09-03 05:03:35 -04:00
#cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } }
2020-02-14 13:08:45 -05:00
%gl-loading-icon{ "v-show" => "isLoading", "size" => "lg" }
2016-12-26 05:47:16 -05:00
.wrapper{ "v-show" => "!isLoading && !hasError" }
2018-04-10 13:11:34 -04:00
.card
.card-header
2019-02-25 14:29:33 -05:00
{{ __('Recent Project Activity') }}
2020-04-21 11:21:10 -04:00
.d-flex.justify-content-between
.flex-grow.text-center{ "v-for" => "item in state.summary" }
%h3.header {{ item.value }}
%p.text {{ item.title }}
.flex-grow.align-self-center.text-center
.dropdown.inline.js-ca-dropdown
%button.dropdown-menu-toggle{ "data-toggle" => "dropdown", :type => "button" }
%span.dropdown-label {{ n__('Last %d day', 'Last %d days', 30) }}
2020-11-17 04:09:23 -05:00
= sprite_icon("chevron-down", css_class: "dropdown-menu-toggle-icon gl-top-3")
2020-04-21 11:21:10 -04:00
%ul.dropdown-menu.dropdown-menu-right
%li
%a{ "href" => "#", "data-value" => "7" }
{{ n__('Last %d day', 'Last %d days', 7) }}
%li
%a{ "href" => "#", "data-value" => "30" }
{{ n__('Last %d day', 'Last %d days', 30) }}
%li
%a{ "href" => "#", "data-value" => "90" }
{{ n__('Last %d day', 'Last %d days', 90) }}
2016-11-21 16:31:12 -05:00
.stage-panel-container
2018-04-10 13:11:34 -04:00
.card.stage-panel
2019-08-19 02:51:06 -04:00
.card-header.border-bottom-0
2016-11-21 16:31:12 -05:00
%nav.col-headers
%ul
2019-08-19 02:51:06 -04:00
%li.stage-header.pl-5
%span.stage-name.font-weight-bold
2017-05-10 11:40:46 -04:00
{{ s__('ProjectLifecycle|Stage') }}
2020-09-11 14:08:42 -04:00
%span.has-tooltip{ "data-placement" => "top", title: _("The phase of the development lifecycle."), "aria-hidden" => "true" }
= sprite_icon('question-o', css_class: 'gl-text-gray-500')
2016-11-21 16:31:12 -05:00
%li.median-header
2019-08-19 02:51:06 -04:00
%span.stage-name.font-weight-bold
2017-04-26 12:03:06 -04:00
{{ __('Median') }}
2020-09-11 14:08:42 -04:00
%span.has-tooltip{ "data-placement" => "top", title: _("The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."), "aria-hidden" => "true" }
= sprite_icon('question-o', css_class: 'gl-text-gray-500')
2019-08-19 02:51:06 -04:00
%li.event-header.pl-3
2020-12-11 07:09:43 -05:00
%span.stage-name.font-weight-bold{ "v-if" => "currentStage && currentStage.legend" }
2017-04-27 18:56:21 -04:00
{{ currentStage ? __(currentStage.legend) : __('Related Issues') }}
2020-09-11 14:08:42 -04:00
%span.has-tooltip{ "data-placement" => "top", title: _("The collection of events added to the data gathered for that stage."), "aria-hidden" => "true" }
= sprite_icon('question-o', css_class: 'gl-text-gray-500')
2019-08-19 02:51:06 -04:00
%li.total-time-header.pr-5.text-right
%span.stage-name.font-weight-bold
2020-01-06 07:07:56 -05:00
{{ __('Time') }}
2020-09-11 14:08:42 -04:00
%span.has-tooltip{ "data-placement" => "top", title: _("The time taken by each data entry gathered by that stage."), "aria-hidden" => "true" }
= sprite_icon('question-o', css_class: 'gl-text-gray-500')
2016-11-21 16:31:12 -05:00
.stage-panel-body
%nav.stage-nav
%ul
2019-08-19 02:51:06 -04:00
%stage-nav-item{ "v-for" => "stage in state.stages", ":key" => '`ca-stage-title-${stage.title}`', '@select' => 'selectStage(stage)', ":title" => "stage.title", ":is-user-allowed" => "stage.isUserAllowed", ":value" => "stage.value", ":is-active" => "stage.active" }
2020-05-05 08:09:31 -04:00
.section.stage-events.overflow-auto
2020-02-14 13:08:45 -05:00
%gl-loading-icon{ "v-show" => "isLoadingStage", "size" => "lg" }
2016-11-21 16:31:12 -05:00
%template{ "v-if" => "currentStage && !currentStage.isUserAllowed" }
= render partial: "no_access"
%template{ "v-else" => true }
%template{ "v-if" => "isEmptyStage && !isLoadingStage" }
= render partial: "empty_stage"
%template{ "v-if" => "state.events.length && !isLoadingStage && !isEmptyStage" }
%component{ ":is" => "currentStage.component", ":stage" => "currentStage", ":items" => "state.events" }