계단식 설정

계단식 설정 프레임워크를 사용하면 그룹이 조상(상위 그룹으로 올라가는 부모 그룹) 및 인스턴스 수준의 응용 프로그램 설정에서 설정 값을 본질적으로 상속할 수 있습니다. 또한 프레임워크는 계층 구조에서 아래쪽 그룹에 대해 설정 값을 강제로 적용할 수 있습니다.

계단식 설정은 현재 NamespaceSetting 내에서만 정의할 수 있지만 향후에 다른 객체로 확장될 수 있습니다.

새로운 계단식 설정 추가

설정은 기본적으로 계단식으로 되어있지 않습니다. 계단식 설정을 정의하려면 다음 단계를 따르세요:

  1. NamespaceSetting 모델에서 cascading_attr 도우미 메서드를 사용하여 새로운 속성을 정의합니다. 배열을 사용하여 한 줄에 여러 속성을 정의할 수 있습니다.

    class NamespaceSetting
      include CascadingNamespaceSettingAttribute
         
      cascading_attr :delayed_project_removal
    end
    
  2. 데이터베이스 열을 생성합니다.

    완전히 새로운 설정에 대한 데이터베이스 마이그레이션 도우미를 사용할 수 있습니다. 이 도우미는 namespace_settingsapplication_settings 각각 두 개의 열을 생성합니다.

    class AddDelayedProjectRemovalCascadingSetting < Gitlab::Database::Migration[2.1]
      include Gitlab::Database::MigrationHelpers::CascadingNamespaceSettings
         
      def up
        add_cascading_namespace_setting :delayed_project_removal, :boolean, default: false, null: false
      end
         
      def down
       remove_cascading_namespace_setting :delayed_project_removal
      end
    end
    

    기존 설정을 계단식 설정으로 변환하는 경우 개별 마이그레이션을 사용하여 열을 추가하고 기존 열을 변경해야 합니다. 필요한 경우 아래 사양을 사용하여 마이그레이션을 만드세요:

    1. namespace_settings 테이블의 열:
      • delayed_project_removal: 기본값 없음. Null 값 허용. 원하는 열 유형 사용.
      • lock_delayed_project_removal: 부울 열. 기본값은 false입니다. Null 값 허용되지 않음.
    2. application_settings 테이블의 열:
      • delayed_project_removal: namespace_settings에 생성된 열과 일치하는 유형. 필요한 대로 기본값 설정. Null 값 허용되지 않음.
      • lock_delayed_project_removal: 부울 열. 기본값은 false입니다. Null 값 허용되지 않음.

편리한 메서드

cascading_attr 메서드를 사용하여 속성을 정의하면 여러 편의 메서드가 자동으로 정의됩니다.

정의:

cascading_attr :delayed_project_removal

사용 가능한 편의 메서드:

  • delayed_project_removal
  • delayed_project_removal=
  • delayed_project_removal_locked?
  • delayed_project_removal_locked_by_ancestor?
  • delayed_project_removal_locked_by_application_setting?
  • delayed_project_removal? (부울 속성에만 해당)
  • delayed_project_removal_locked_ancestor (잠긴 네임스페이스 설정 오브젝트 [네임스페이스_ID]를 반환)

속성 리더 메서드 (delayed_project_removal)

속성 리더 메서드(delayed_project_removal)는 다음 기준을 사용하여 올바른 계층식 값을 반환합니다:

  1. 속성이 변경되었을 경우 변경된 값을 반환합니다. 이를 통해 표준 Rails 유효성 검사기를 사용할 수 있지만 nil 값이 허용되어야 합니다.
  2. 잠긴 조상값을 반환합니다.
  3. 잠긴 인스턴스 수준 응용 프로그램 설정 값을 반환합니다.
  4. 이 네임스페이스의 속성을 반환합니다(단, null이 아닌 경우).
  5. null이 아닌 경우 가장 가까운 조상에서 값을 반환합니다.
  6. 인스턴스 수준 응용 프로그램 설정을 반환합니다.

_locked? 메서드

기본적으로 _locked? 메서드(delayed_project_removal_locked?)는 그룹이나 응용 프로그램 설정의 조상이 속성을 잠그면 true를 반환합니다. 그룹에서 호출하는 경우 false를 반환합니다.

include_self: true가 지정된 경우 그룹에서 호출하는 경우 속성이 잠겨 있는지를 확인할 때true를 반환합니다. 예를 들어 프로젝트에서 속성이 잠겨 있는지 확인할 때 해당됩니다.

프론트엔드에서 계단식 설정 표시

프론트엔드에서 계단식 설정을 표시하기 위해 몇 가지 Rails 뷰 도우미, HAML 부분 및 JavaScript 함수를 사용할 수 있습니다.

Rails 뷰 도우미

cascading_namespace_setting_locked?

설정이 잠겨 있는지 확인하기 위해 _locked? 메서드를 통과하여 호출합니다.

인수 설명 유형 필수사항 (기본값)
attribute 설정의 이름. 예: :delayed_project_removal String 또는 Symbol true
group 현재 그룹. Group true
**args _locked? 메서드로 전달할 추가 인수   false

HAML 부분

_enforcement_checkbox.html.haml

강제 체크박스를 렌더링합니다.

로컬 설명 유형 필수사항 (기본값)
attribute 설정의 이름. 예: :delayed_project_removal String 또는 Symbol true
group 현재 그룹. Group true
form Rails Form Builder 객체 ActionView::Helpers::FormBuilder true
setting_locked 조상 그룹 또는 관리자 설정에 의해 설정이 잠겨 있는지 여부. cascading_namespace_setting_locked?로 계산할 수 있음. Boolean true
help_text 체크박스 아래에 표시되는 문자열 String false (하위 그룹은 이 설정을 변경할 수 없음.)

_setting_checkbox.html.haml

체크박스 설정의 레이블을 렌더링합니다.

로컬 설명 유형 필수사항 (기본값)
attribute 설정의 이름. 예: :delayed_project_removal String 또는 Symbol true
group 현재 그룹. Group true
form Rails Form Builder 객체 ActionView::Helpers::FormBuilder true
setting_locked 조상 그룹 또는 관리자 설정에 의해 설정이 잠겨 있는지 여부. cascading_namespace_setting_locked?로 계산할 수 있음. Boolean true
settings_path_helper 조상 설정까지의 경로를 생성하는 람다 함수. 예: settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') } Lambda true
help_text 체크박스 아래에 표시되는 문자열 String false (nil)

_setting_label_fieldset.html.haml

fieldset 설정의 레이블을 렌더링합니다.

로컬 설명 유형 필수사항 (기본값)
attribute 설정의 이름. 예: :delayed_project_removal String 또는 Symbol true
group 현재 그룹. Group true
setting_locked 설정이 잠겨 있는지 여부. cascading_namespace_setting_locked?로 계산할 수 있음. Boolean true
settings_path_helper 조상 설정까지의 경로를 생성하는 람다 함수. 예: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') } Lambda true
help_text 체크박스 아래에 표시되는 문자열 String false (nil)

_lock_popovers.html.haml

마우스를 잠금 아이콘 위로 올렸을 때 popover를 표시하는 데 필요한 마운트 엘리먼트를 렌더링합니다. 이 부분은 페이지당 한 번만 필요합니다.

JavaScript

initCascadingSettingsLockPopovers

{lock} 아이콘을 호버하면 팝오버를 표시하기 위해 필요한 JavaScript를 초기화합니다. 이 함수는 페이지별 JavaScript에서 가져와 호출되어야 합니다.

모두 함께 넣기

-# app/views/groups/edit.html.haml

= render 'shared/namespaces/cascading_settings/lock_popovers'

- delayed_project_removal_locked = cascading_namespace_setting_locked?(:delayed_project_removal, @group)
- merge_method_locked = cascading_namespace_setting_locked?(:merge_method, @group)

= form_for @group do |f|
  .form-group{ data: { testid: 'delayed-project-removal-form-group' } }
    = render 'shared/namespaces/cascading_settings/setting_checkbox', attribute: :delayed_project_removal,
        group: @group,
        form: f,
        setting_locked: delayed_project_removal_locked,
        settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') },
        help_text: s_('Settings|Projects will be permanently deleted after a 7-day delay. Inherited by subgroups.') do
      = s_('Settings|Enable delayed project deletion')
    = render 'shared/namespaces/cascading_settings/enforcement_checkbox',
        attribute: :delayed_project_removal,
        group: @group,
        form: f,
        setting_locked: delayed_project_removal_locked
  
  %fieldset.form-group
    = render 'shared/namespaces/cascading_settings/setting_label_fieldset', attribute: :merge_method,
        group: @group,
        setting_locked: merge_method_locked,
        settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') },
        help_text: s_('Settings|Determine what happens to the commit history when you merge a merge request.') do
      = s_('Settings|Merge method')
    
    .gl-form-radio.custom-control.custom-radio
      = f.gitlab_ui_radio_component :merge_method, :merge, s_('Settings|Merge commit'), help_text: s_('Settings|Every merge creates a merge commit.'), radio_options: { disabled: merge_method_locked }
    
    .gl-form-radio.custom-control.custom-radio
      = f.gitlab_ui_radio_component :merge_method, :rebase_merge, s_('Settings|Merge commit with semi-linear history'), help_text: s_('Settings|Every merge creates a merge commit.'), radio_options: { disabled: merge_method_locked }
    
    .gl-form-radio.custom-control.custom-radio
      = f.gitlab_ui_radio_component :merge_method, :ff, s_('Settings|Fast-forward merge'), help_text: s_('Settings|No merge commits are created.'), radio_options: { disabled: merge_method_locked }
    
    = render 'shared/namespaces/cascading_settings/enforcement_checkbox',
      attribute: :merge_method,
      group: @group,
      form: f,
      setting_locked: merge_method_locked
// app/assets/javascripts/pages/groups/edit/index.js

import { initCascadingSettingsLockPopovers } from '~/namespaces/cascading_settings';

initCascadingSettingsLockPopovers();