계단식 설정
계단식 설정 프레임워크를 사용하면 그룹이 조상(상위 그룹으로 올라가는 부모 그룹) 및 인스턴스 수준의 응용 프로그램 설정에서 설정 값을 본질적으로 상속할 수 있습니다. 또한 프레임워크는 계층 구조에서 아래쪽 그룹에 대해 설정 값을 강제로 적용할 수 있습니다.
계단식 설정은 현재 NamespaceSetting
내에서만 정의할 수 있지만 향후에 다른 객체로 확장될 수 있습니다.
새로운 계단식 설정 추가
설정은 기본적으로 계단식으로 되어있지 않습니다. 계단식 설정을 정의하려면 다음 단계를 따르세요:
-
NamespaceSetting
모델에서cascading_attr
도우미 메서드를 사용하여 새로운 속성을 정의합니다. 배열을 사용하여 한 줄에 여러 속성을 정의할 수 있습니다.class NamespaceSetting include CascadingNamespaceSettingAttribute cascading_attr :delayed_project_removal end
-
데이터베이스 열을 생성합니다.
완전히 새로운 설정에 대한 데이터베이스 마이그레이션 도우미를 사용할 수 있습니다. 이 도우미는
namespace_settings
및application_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
기존 설정을 계단식 설정으로 변환하는 경우 개별 마이그레이션을 사용하여 열을 추가하고 기존 열을 변경해야 합니다. 필요한 경우 아래 사양을 사용하여 마이그레이션을 만드세요:
-
namespace_settings
테이블의 열:-
delayed_project_removal
: 기본값 없음. Null 값 허용. 원하는 열 유형 사용. -
lock_delayed_project_removal
: 부울 열. 기본값은 false입니다. Null 값 허용되지 않음.
-
-
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
)는 다음 기준을 사용하여 올바른 계층식 값을 반환합니다:
- 속성이 변경되었을 경우 변경된 값을 반환합니다. 이를 통해 표준 Rails 유효성 검사기를 사용할 수 있지만
nil
값이 허용되어야 합니다. - 잠긴 조상값을 반환합니다.
- 잠긴 인스턴스 수준 응용 프로그램 설정 값을 반환합니다.
- 이 네임스페이스의 속성을 반환합니다(단, null이 아닌 경우).
- null이 아닌 경우 가장 가까운 조상에서 값을 반환합니다.
- 인스턴스 수준 응용 프로그램 설정을 반환합니다.
_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 (하위 그룹은 이 설정을 변경할 수 없음.)
|
체크박스 설정의 레이블을 렌더링합니다.
로컬 | 설명 | 유형 | 필수사항 (기본값) |
---|---|---|---|
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 )
|
마우스를 잠금 아이콘 위로 올렸을 때 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();