diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-16 15:09:35 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-16 15:09:35 +0300 |
commit | 4c16d4ff4f92987f609e9853da5900a51f0ad1be (patch) | |
tree | 3ebc97c31f90db2f9c8fe4e5c5f33a502d68363d /app/assets/javascripts/vue_shared/components/settings | |
parent | 3b85f5e4a123538b14eb052ae0efb9d7dbcd4e9b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/vue_shared/components/settings')
-rw-r--r-- | app/assets/javascripts/vue_shared/components/settings/settings_block.stories.js | 26 | ||||
-rw-r--r-- | app/assets/javascripts/vue_shared/components/settings/settings_block.vue | 69 |
2 files changed, 86 insertions, 9 deletions
diff --git a/app/assets/javascripts/vue_shared/components/settings/settings_block.stories.js b/app/assets/javascripts/vue_shared/components/settings/settings_block.stories.js new file mode 100644 index 00000000000..5242743ad30 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/settings/settings_block.stories.js @@ -0,0 +1,26 @@ +import SettingsBlock from './settings_block.vue'; + +export default { + component: SettingsBlock, + title: 'vue_shared/components/settings/settings_block', +}; + +const Template = (args, { argTypes }) => ({ + components: { SettingsBlock }, + props: Object.keys(argTypes), + template: ` + <settings-block v-bind="$props"> + <template #title>Settings section title</template> + <template #description>Settings section description</template> + <template #default> + <p>Content</p> + <p>More content</p> + <p>Content</p> + <p>More content...</p> + <p>Content</p> + </template> + </settings-block> + `, +}); + +export const Default = Template.bind({}); diff --git a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue index e8f517f40a6..e75fedbb1d7 100644 --- a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue +++ b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue @@ -1,5 +1,7 @@ <script> import { GlButton } from '@gitlab/ui'; +import { uniqueId } from 'lodash'; + import { __ } from '~/locale'; export default { @@ -15,50 +17,99 @@ export default { default: false, required: false, }, + collapsible: { + type: Boolean, + default: true, + required: false, + }, }, data() { return { - sectionExpanded: false, + // Non-collapsible sections should always be expanded. + // For collapsible sections, fall back to defaultExpanded. + sectionExpanded: !this.collapsible || this.defaultExpanded, }; }, computed: { - expanded() { - return this.defaultExpanded || this.sectionExpanded; - }, toggleText() { - return this.expanded ? __('Collapse') : __('Expand'); + const { collapseText, expandText } = this.$options.i18n; + return this.sectionExpanded ? collapseText : expandText; + }, + settingsContentId() { + return uniqueId('settings_content_'); + }, + settingsLabelId() { + return uniqueId('settings_label_'); + }, + toggleButtonAriaLabel() { + const { collapseAriaLabel, expandAriaLabel } = this.$options.i18n; + return this.sectionExpanded ? collapseAriaLabel : expandAriaLabel; + }, + ariaExpanded() { + return String(this.sectionExpanded); }, }, methods: { toggleSectionExpanded() { this.sectionExpanded = !this.sectionExpanded; + + if (this.sectionExpanded) { + this.$refs.settingsContent.focus(); + } }, }, + i18n: { + collapseText: __('Collapse'), + expandText: __('Expand'), + collapseAriaLabel: __('Collapse settings section'), + expandAriaLabel: __('Expand settings section'), + }, }; </script> <template> - <section class="settings" :class="{ 'no-animate': !slideAnimated, expanded }"> + <section class="settings" :class="{ 'no-animate': !slideAnimated, expanded: sectionExpanded }"> <div class="settings-header"> <h4> <span + v-if="collapsible" + :id="settingsLabelId" role="button" tabindex="0" class="gl-cursor-pointer" - data-testid="section-title" + :aria-controls="settingsContentId" + :aria-expanded="ariaExpanded" + data-testid="section-title-button" @click="toggleSectionExpanded" + @keydown.enter.space="toggleSectionExpanded" > <slot name="title"></slot> </span> + <template v-else> + <slot name="title"></slot> + </template> </h4> - <gl-button @click="toggleSectionExpanded"> + <gl-button + v-if="collapsible" + :aria-controls="settingsContentId" + :aria-expanded="ariaExpanded" + :aria-label="toggleButtonAriaLabel" + @click="toggleSectionExpanded" + > {{ toggleText }} </gl-button> <p> <slot name="description"></slot> </p> </div> - <div class="settings-content"> + <div + :id="settingsContentId" + ref="settingsContent" + :aria-labelledby="settingsLabelId" + tabindex="-1" + role="region" + class="settings-content" + > <slot></slot> </div> </section> |