Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/deploy_freeze')
-rw-r--r--app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue25
-rw-r--r--app/assets/javascripts/deploy_freeze/components/deploy_freeze_table.vue121
-rw-r--r--app/assets/javascripts/deploy_freeze/store/index.js1
3 files changed, 93 insertions, 54 deletions
diff --git a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
index b13b0ede9f0..72d1ce9768a 100644
--- a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
+++ b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
@@ -1,6 +1,7 @@
<script>
import { GlFormGroup, GlFormInput, GlModal, GlSprintf, GlLink } from '@gitlab/ui';
import { isValidCron } from 'cron-validator';
+// eslint-disable-next-line no-restricted-imports
import { mapActions, mapState } from 'vuex';
import { __ } from '~/locale';
import TimezoneDropdown from '~/vue_shared/components/timezone_dropdown/timezone_dropdown.vue';
@@ -24,10 +25,10 @@ export default {
static: true,
lazy: true,
},
- translations: {
+ i18n: {
cronPlaceholder: '* * * * *',
cronSyntaxInstructions: __(
- 'Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}',
+ 'Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}.',
),
addTitle: __('Add deploy freeze'),
editTitle: __('Edit deploy freeze'),
@@ -81,9 +82,7 @@ export default {
return Boolean(this.selectedId);
},
modalTitle() {
- return this.isEditing
- ? this.$options.translations.editTitle
- : this.$options.translations.addTitle;
+ return this.isEditing ? this.$options.i18n.editTitle : this.$options.i18n.addTitle;
},
},
methods: {
@@ -104,6 +103,13 @@ export default {
this.addFreezePeriod();
}
},
+ focusFirstInput() {
+ if (this.$refs.freezeStartCron) {
+ setTimeout(() => {
+ this.$refs.freezeStartCron?.$el?.focus();
+ }, 250);
+ }
+ },
},
};
</script>
@@ -115,9 +121,10 @@ export default {
:action-primary="addDeployFreezeButton"
@primary="submit"
@canceled="resetModalHandler"
+ @change="focusFirstInput"
>
<p>
- <gl-sprintf :message="$options.translations.cronSyntaxInstructions">
+ <gl-sprintf :message="$options.i18n.cronSyntaxInstructions">
<template #cronSyntax="{ content }">
<gl-link href="https://crontab.guru/" target="_blank">{{ content }}</gl-link>
</template>
@@ -132,11 +139,13 @@ export default {
>
<gl-form-input
id="deploy-freeze-start"
+ ref="freezeStartCron"
v-model="freezeStartCron"
class="gl-font-monospace!"
data-qa-selector="deploy_freeze_start_field"
- :placeholder="$options.translations.cronPlaceholder"
+ :placeholder="$options.i18n.cronPlaceholder"
:state="freezeStartCronState"
+ autofocus
trim
/>
</gl-form-group>
@@ -152,7 +161,7 @@ export default {
v-model="freezeEndCron"
class="gl-font-monospace!"
data-qa-selector="deploy_freeze_end_field"
- :placeholder="$options.translations.cronPlaceholder"
+ :placeholder="$options.i18n.cronPlaceholder"
:state="freezeEndCronState"
trim
/>
diff --git a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_table.vue b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_table.vue
index 77767456f76..705b1871ec0 100644
--- a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_table.vue
+++ b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_table.vue
@@ -1,39 +1,49 @@
<script>
-import { GlTable, GlButton, GlModal, GlModalDirective, GlSprintf } from '@gitlab/ui';
+import {
+ GlCard,
+ GlTable,
+ GlButton,
+ GlIcon,
+ GlModal,
+ GlModalDirective,
+ GlSprintf,
+} from '@gitlab/ui';
+// eslint-disable-next-line no-restricted-imports
import { mapState, mapActions } from 'vuex';
-import { s__ } from '~/locale';
+import { __, s__ } from '~/locale';
export default {
fields: [
{
key: 'freezeStart',
label: s__('DeployFreeze|Freeze start'),
+ tdClass: 'gl-vertical-align-middle!',
},
{
key: 'freezeEnd',
label: s__('DeployFreeze|Freeze end'),
+ tdClass: 'gl-vertical-align-middle!',
},
{
key: 'cronTimezone',
label: s__('DeployFreeze|Time zone'),
+ tdClass: 'gl-vertical-align-middle!',
},
{
- key: 'edit',
- label: s__('DeployFreeze|Edit'),
- },
- {
- key: 'delete',
- label: s__('DeployFreeze|Delete'),
+ key: 'actions',
+ label: __('Actions'),
+ thClass: 'gl-text-right',
},
],
- translations: {
+ i18n: {
+ title: s__('DeployFreeze|Deploy freezes'),
addDeployFreeze: s__('DeployFreeze|Add deploy freeze'),
deleteDeployFreezeTitle: s__('DeployFreeze|Delete deploy freeze?'),
deleteDeployFreezeMessage: s__(
'DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be removed. Are you sure?',
),
emptyStateText: s__(
- 'DeployFreeze|No deploy freezes exist for this project. To add one, select %{strongStart}Add deploy freeze%{strongEnd}',
+ 'DeployFreeze|No deploy freezes exist for this project. To add one, select %{strongStart}Add deploy freeze%{strongEnd} above.',
),
},
modal: {
@@ -42,10 +52,16 @@ export default {
text: s__('DeployFreeze|Delete freeze period'),
attributes: { variant: 'danger', 'data-testid': 'modal-confirm' },
},
+ actionSecondary: {
+ text: __('Cancel'),
+ attributes: { variant: 'default' },
+ },
},
components: {
+ GlCard,
GlTable,
GlButton,
+ GlIcon,
GlModal,
GlSprintf,
},
@@ -80,65 +96,78 @@ export default {
</script>
<template>
- <div class="deploy-freeze-table">
+ <gl-card
+ class="gl-new-card deploy-freeze-table"
+ header-class="gl-new-card-header"
+ body-class="gl-new-card-body gl-px-0"
+ >
+ <template #header>
+ <div class="gl-new-card-title-wrapper">
+ <h3 class="gl-new-card-title">{{ $options.i18n.title }}</h3>
+ <span class="gl-new-card-count">
+ <gl-icon name="deployments" class="gl-mr-2" />
+ {{ freezePeriods.length }}
+ </span>
+ </div>
+ <div class="gl-new-card-actions">
+ <gl-button v-gl-modal.deploy-freeze-modal size="small" data-testid="add-deploy-freeze">{{
+ $options.i18n.addDeployFreeze
+ }}</gl-button>
+ </div>
+ </template>
+
<gl-table
data-testid="deploy-freeze-table"
:items="freezePeriods"
:fields="$options.fields"
show-empty
- stacked="lg"
+ stacked="md"
>
<template #cell(cronTimezone)="{ item }">
{{ item.cronTimezone.formattedTimezone }}
</template>
- <template #cell(edit)="{ item }">
- <gl-button
- v-gl-modal.deploy-freeze-modal
- icon="pencil"
- data-testid="edit-deploy-freeze"
- :aria-label="__('Edit deploy freeze')"
- @click="setFreezePeriod(item)"
- />
- </template>
- <template #cell(delete)="{ item }">
- <gl-button
- v-gl-modal="$options.modal.id"
- category="secondary"
- variant="danger"
- icon="remove"
- :aria-label="$options.modal.actionPrimary.text"
- :loading="item.isDeleting"
- data-testid="delete-deploy-freeze"
- @click="handleDeleteFreezePeriod(item)"
- />
+ <template #cell(actions)="{ item }">
+ <div class="gl-display-flex gl-justify-content-end gl-mt-n2 gl-mb-n2">
+ <gl-button
+ v-gl-modal.deploy-freeze-modal
+ icon="pencil"
+ data-testid="edit-deploy-freeze"
+ :aria-label="__('Edit deploy freeze')"
+ class="gl-mr-3"
+ @click="setFreezePeriod(item)"
+ />
+ <gl-button
+ v-gl-modal="$options.modal.id"
+ category="secondary"
+ variant="danger"
+ icon="remove"
+ :aria-label="$options.modal.actionPrimary.text"
+ :loading="item.isDeleting"
+ data-testid="delete-deploy-freeze"
+ @click="handleDeleteFreezePeriod(item)"
+ />
+ </div>
</template>
<template #empty>
- <p data-testid="empty-freeze-periods" class="gl-text-center text-plain">
- <gl-sprintf :message="$options.translations.emptyStateText">
+ <p data-testid="empty-freeze-periods" class="gl-text-secondary gl-text-center gl-mb-0">
+ <gl-sprintf :message="$options.i18n.emptyStateText">
<template #strong="{ content }">
- <strong>{{ content }}</strong>
+ {{ content }}
</template>
</gl-sprintf>
</p>
</template>
</gl-table>
- <gl-button
- v-gl-modal.deploy-freeze-modal
- data-testid="add-deploy-freeze"
- category="primary"
- variant="confirm"
- >
- {{ $options.translations.addDeployFreeze }}
- </gl-button>
<gl-modal
- :title="$options.translations.deleteDeployFreezeTitle"
+ :title="$options.i18n.deleteDeployFreezeTitle"
:modal-id="$options.modal.id"
:action-primary="$options.modal.actionPrimary"
+ :action-secondary="$options.modal.actionSecondary"
static
@primary="confirmDeleteFreezePeriod"
>
<template v-if="freezePeriodToDelete">
- <gl-sprintf :message="$options.translations.deleteDeployFreezeMessage">
+ <gl-sprintf :message="$options.i18n.deleteDeployFreezeMessage">
<template #start>
<code>{{ freezePeriodToDelete.freezeStart }}</code>
</template>
@@ -149,5 +178,5 @@ export default {
</gl-sprintf>
</template>
</gl-modal>
- </div>
+ </gl-card>
</template>
diff --git a/app/assets/javascripts/deploy_freeze/store/index.js b/app/assets/javascripts/deploy_freeze/store/index.js
index 2da7ed31a13..d8c35eac7ee 100644
--- a/app/assets/javascripts/deploy_freeze/store/index.js
+++ b/app/assets/javascripts/deploy_freeze/store/index.js
@@ -1,4 +1,5 @@
import Vue from 'vue';
+// eslint-disable-next-line no-restricted-imports
import Vuex from 'vuex';
import * as actions from './actions';
import mutations from './mutations';