rails_modal_manager 1.0.57 → 1.0.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +22 -1
- data/app/assets/stylesheets/rails_modal_manager.css +10 -5
- data/app/javascript/rails_modal_manager/controllers/rmm_modal_controller.js +2 -2
- data/app/javascript/rails_modal_manager/controllers/rmm_submenu_controller.js +15 -1
- data/app/javascript/rails_modal_manager/modal_store.js +30 -2
- data/lib/rails_modal_manager/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 65777a92905a2ad64ca23a3d2a571c52c9cea95ac6797eb56eba7a567651053e
|
|
4
|
+
data.tar.gz: 418078c26f467088fa6dcac03042c67458a0238722648ba79ecbe5b8ec297520
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a3ae6da5585652a3229d2c876cc3cc667a86f4169e8abf949ec80408d5e8cb198d4d6cef83bbff4c89f311f19700a55bc8a69ca8d0f449f31d49116925e3db70
|
|
7
|
+
data.tar.gz: b225ccbff9262aaa54d130f0190d7a945dd5cb43206dcea1992cf34d74d6b26f73011c7b78032501bbcfa607996a7d3f1494cb4cda046b7e80bb7fa73b3fa9f9
|
data/README.md
CHANGED
|
@@ -3,7 +3,15 @@
|
|
|
3
3
|
Rails 애플리케이션을 위한 고급 모달 매니저입니다.
|
|
4
4
|
`@reshacs/react-modal-manager`에서 포팅되었습니다.
|
|
5
5
|
|
|
6
|
-
**Version:** 1.0.
|
|
6
|
+
**Version:** 1.0.59
|
|
7
|
+
|
|
8
|
+
> ⚠️ **이 README 의 본문 설명은 v1.0.37 기준입니다.** v1.0.38 이후의 변경(디자인 개편, 푸터 버튼 패턴, z-index 계층 등)은
|
|
9
|
+
> **[OPTIONS.md](OPTIONS.md) 최상단**이 최신 기준입니다. 두 문서가 어긋나면 OPTIONS.md 를 따르세요.
|
|
10
|
+
>
|
|
11
|
+
> 특히 아래 항목은 README 본문이 오래됐습니다:
|
|
12
|
+
> - **헤더 색상** — 본문의 `#3b82f6` 파란색 → v1.0.57 부터 `#3e6187` 블루 차콜
|
|
13
|
+
> - **푸터 버튼** — `onclick` 은 v1.0.55 에서 deprecated. `type: "submit"` + `form:` 패턴 사용
|
|
14
|
+
> - **z-index** — v1.0.58 에서 계층 재배치 (overlay 1400 < modal 1500~8000 < taskbar 9000 < confirm 10000)
|
|
7
15
|
|
|
8
16
|
---
|
|
9
17
|
|
|
@@ -798,6 +806,19 @@ MIT License
|
|
|
798
806
|
|
|
799
807
|
## 변경 이력
|
|
800
808
|
|
|
809
|
+
> v1.0.38 ~ v1.0.58 의 상세 변경 이력은 **[OPTIONS.md](OPTIONS.md)** 참조. 아래는 주요 항목만.
|
|
810
|
+
|
|
811
|
+
### v1.0.59
|
|
812
|
+
|
|
813
|
+
- **submenu_groups 초기 footer 버그 픽스** — 여러 서브메뉴 그룹 사용 시 마지막 그룹의 active 탭 `footer_buttons` 가 초기 footer 를 덮어쓰던 문제. connect 시 초기 footer 반영을 활성 그룹(`rmm-submenu-group-active`)으로 한정.
|
|
814
|
+
|
|
815
|
+
### v1.0.58
|
|
816
|
+
|
|
817
|
+
- **z-index 계층 재배치** — v1.0.57 의 `modal > taskbar` 배치가 모달이 태스크바를 덮어 최소화 항목을 클릭할 수 없게 만든 문제 수정
|
|
818
|
+
- `overlay 1400 < modal 1500~8000 < taskbar 9000 < 내장 confirm 10000`
|
|
819
|
+
- **`MAX_Z_INDEX` (8000) 상한 도입** — 모달을 반복해서 앞으로 가져올 때 z-index 가 무한 증가해 태스크바를 다시 덮던 근본 원인 제거. 상한 도달 시 쌓임 순서를 보존한 채 재할당
|
|
820
|
+
- ⚠️ 호스트 앱의 `position: fixed` 요소는 **1500~8000 대역을 비워두고**, 모달 위에 떠야 하는 전역 UI(스낵바·토스트·컨텍스트 메뉴)는 9000 초과로 배치 권장
|
|
821
|
+
|
|
801
822
|
### v1.0.37
|
|
802
823
|
|
|
803
824
|
- **커스텀 헤더 색상 옵션 추가**:
|
|
@@ -133,11 +133,16 @@
|
|
|
133
133
|
--rmm-animation-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
134
134
|
|
|
135
135
|
/* Z-index */
|
|
136
|
-
/* v1.0.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
/* v1.0.58 — taskbar 가 항상 최상위. v1.0.57 의 modal > taskbar 배치가
|
|
137
|
+
모달이 taskbar 영역을 가려 최소화 항목 클릭 불가 문제를 만들었음.
|
|
138
|
+
계층 (낮음→높음):
|
|
139
|
+
overlay : 1400
|
|
140
|
+
modal : 1500 ~ 8000 (modal_store 가 동적 증가, MAX_Z_INDEX 도달 시 reset)
|
|
141
|
+
taskbar : 9000 (항상 모달 위 — 최소화 클릭 가능 보장)
|
|
142
|
+
confirm : 10000 (모든 위) */
|
|
143
|
+
--rmm-z-overlay: 1400;
|
|
144
|
+
--rmm-z-modal: 1500;
|
|
145
|
+
--rmm-z-taskbar: 9000;
|
|
141
146
|
}
|
|
142
147
|
|
|
143
148
|
/* ============================================
|
|
@@ -319,8 +319,8 @@ export default class extends Controller {
|
|
|
319
319
|
|
|
320
320
|
// Create confirm modal HTML
|
|
321
321
|
const confirmHtml = `
|
|
322
|
-
<div class="rmm-overlay rmm-active" id="${confirmId}-overlay" style="z-index:
|
|
323
|
-
<div id="${confirmId}" class="rmm-modal rmm-size-xs rmm-position-center rmm-active" style="z-index:
|
|
322
|
+
<div class="rmm-overlay rmm-active" id="${confirmId}-overlay" style="z-index: 10000;"></div>
|
|
323
|
+
<div id="${confirmId}" class="rmm-modal rmm-size-xs rmm-position-center rmm-active" style="z-index: 10001; min-width: 320px;" role="dialog" aria-modal="true">
|
|
324
324
|
<div class="rmm-header" style="background: var(--rmm-btn-warning-bg); border-bottom: none;">
|
|
325
325
|
<div class="rmm-header-left">
|
|
326
326
|
<h2 class="rmm-header-title" style="color: white;">확인</h2>
|
|
@@ -53,10 +53,24 @@ export default class extends Controller {
|
|
|
53
53
|
this.currentItemId = activeItem.dataset.itemId
|
|
54
54
|
// v1.0.50+: 초기 active 탭에 탭별 footer 가 지정돼 있으면 바로 반영
|
|
55
55
|
// (모달 레벨 footer_buttons 로 렌더된 기본값을 override)
|
|
56
|
-
|
|
56
|
+
// v1.0.59: submenu_groups 사용 시 비활성 그룹은 초기 반영에서 제외.
|
|
57
|
+
// 모든 그룹의 controller 가 connect 되므로, 가드 없이는 DOM 상 마지막 그룹의
|
|
58
|
+
// active 탭 footer 가 실제 표시 중인 그룹의 footer 를 덮어쓴다.
|
|
59
|
+
if (this._isGroupActive()) {
|
|
60
|
+
this._applyFooterFromItem(activeItem)
|
|
61
|
+
}
|
|
57
62
|
}
|
|
58
63
|
}
|
|
59
64
|
|
|
65
|
+
/**
|
|
66
|
+
* 이 submenu 가 속한 그룹이 현재 표시 중인지 판정.
|
|
67
|
+
* 그룹 래퍼(.rmm-submenu-group)가 없으면 단일 submenu 이므로 항상 활성.
|
|
68
|
+
*/
|
|
69
|
+
_isGroupActive() {
|
|
70
|
+
const group = this.element.closest('.rmm-submenu-group')
|
|
71
|
+
return !group || group.classList.contains('rmm-submenu-group-active')
|
|
72
|
+
}
|
|
73
|
+
|
|
60
74
|
/**
|
|
61
75
|
* Increment the shared request counter on the content container.
|
|
62
76
|
* Called synchronously from selectItem/forceReloadActive BEFORE async loadAjaxContent.
|
|
@@ -11,8 +11,15 @@
|
|
|
11
11
|
// ============================================
|
|
12
12
|
|
|
13
13
|
export const MODAL_CONSTANTS = {
|
|
14
|
-
// v1.0.
|
|
15
|
-
|
|
14
|
+
// v1.0.58 — 최소화 태스크바(9000) 가 항상 모달 위에 위치해 클릭 가능하도록
|
|
15
|
+
// 모달 z-index 시작값 1500 + 최대 cap 8000 (taskbar 9000 보다 낮게 유지).
|
|
16
|
+
// overlay/confirm 도 함께 재배치:
|
|
17
|
+
// overlay : 1400
|
|
18
|
+
// modal : 1500 ~ 8000 (동적 증가, 8000 도달 시 reset)
|
|
19
|
+
// taskbar : 9000 (항상 모달 위 — 최소화 항목 클릭 가능)
|
|
20
|
+
// confirm 모달 : 10000 (모든 것 위)
|
|
21
|
+
DEFAULT_Z_INDEX: 1500,
|
|
22
|
+
MAX_Z_INDEX: 8000,
|
|
16
23
|
ANIMATION_DURATION: 200,
|
|
17
24
|
HEADER_HEIGHT: 56,
|
|
18
25
|
FOOTER_HEIGHT: 64,
|
|
@@ -101,6 +108,15 @@ class ModalStore {
|
|
|
101
108
|
return;
|
|
102
109
|
}
|
|
103
110
|
|
|
111
|
+
// z-index cap — taskbar(9000) 보다 높지 못하도록 8000 도달 시 default 로 reset.
|
|
112
|
+
if (this.topZIndex >= MODAL_CONSTANTS.MAX_Z_INDEX) {
|
|
113
|
+
this.topZIndex = MODAL_CONSTANTS.DEFAULT_Z_INDEX;
|
|
114
|
+
// 기존 모달들 z-index 도 정렬 순서대로 재할당
|
|
115
|
+
this.modalOrder.forEach((id, idx) => {
|
|
116
|
+
if (this.activeModals[id]) this.activeModals[id].zIndex = MODAL_CONSTANTS.DEFAULT_Z_INDEX + idx * 10;
|
|
117
|
+
});
|
|
118
|
+
this.topZIndex = MODAL_CONSTANTS.DEFAULT_Z_INDEX + this.modalOrder.length * 10;
|
|
119
|
+
}
|
|
104
120
|
const newZIndex = this.topZIndex + 10;
|
|
105
121
|
|
|
106
122
|
this.activeModals[modalId] = { ...config, zIndex: newZIndex };
|
|
@@ -159,6 +175,18 @@ class ModalStore {
|
|
|
159
175
|
if (!this.activeModals[modalId]) return;
|
|
160
176
|
if (this.modalOrder[this.modalOrder.length - 1] === modalId) return;
|
|
161
177
|
|
|
178
|
+
// z-index cap — 8000 도달 시 정렬 순서로 재할당.
|
|
179
|
+
if (this.topZIndex >= MODAL_CONSTANTS.MAX_Z_INDEX) {
|
|
180
|
+
const reordered = [...this.modalOrder.filter(id => id !== modalId), modalId];
|
|
181
|
+
reordered.forEach((id, idx) => {
|
|
182
|
+
if (this.activeModals[id]) this.activeModals[id].zIndex = MODAL_CONSTANTS.DEFAULT_Z_INDEX + idx * 10;
|
|
183
|
+
});
|
|
184
|
+
this.modalOrder = reordered;
|
|
185
|
+
this.topZIndex = MODAL_CONSTANTS.DEFAULT_Z_INDEX + reordered.length * 10;
|
|
186
|
+
this.notify();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
162
190
|
const newZIndex = this.topZIndex + 10;
|
|
163
191
|
|
|
164
192
|
this.activeModals[modalId].zIndex = newZIndex;
|