fix #424: use dropdowns for VPD policy form

This commit is contained in:
devmrko
2026-06-25 17:03:44 +09:00
parent 1bcb6b6a43
commit 9a546b7997
9 changed files with 190 additions and 15 deletions

View File

@@ -38,6 +38,47 @@
ORDER BY p.object_owner, p.object_name, p.policy_name
</select>
<select id="findPolicyNameOptions" resultType="string">
SELECT DISTINCT policy_name
FROM all_policies
WHERE policy_name IS NOT NULL
UNION
SELECT object_name || '_POLICY'
FROM cb_protected_object
WHERE enabled_yn = 'Y'
ORDER BY 1
</select>
<select id="findOwnerOptions" resultType="string">
SELECT USER FROM dual
UNION
SELECT owner FROM cb_protected_object WHERE enabled_yn = 'Y'
UNION
SELECT pf_owner FROM all_policies WHERE pf_owner IS NOT NULL
ORDER BY 1
</select>
<select id="findFunctionOptions" resultType="com.cloudhandson.vpdbackoffice.domain.vpd.VpdFunctionOption">
WITH allowed_owners AS (
SELECT USER AS owner FROM dual
UNION
SELECT owner FROM cb_protected_object WHERE enabled_yn = 'Y'
UNION
SELECT pf_owner FROM all_policies WHERE pf_owner IS NOT NULL
)
SELECT owner,
package_name,
object_name AS function_name,
CASE WHEN package_name IS NULL THEN 'FUNCTION' ELSE 'PACKAGE FUNCTION' END AS object_type
FROM all_arguments
WHERE owner IN (SELECT owner FROM allowed_owners)
AND position = 0
AND data_type = 'VARCHAR2'
AND object_name IS NOT NULL
ORDER BY owner, package_name, function_name
FETCH FIRST 300 ROWS ONLY
</select>
<select id="findPolicy" resultType="com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView">
SELECT <include refid="policyColumns"><property name="alias" value="p."/></include>
FROM all_policies p

View File

@@ -348,6 +348,18 @@ body {
text-align: left;
}
.checkbox-row {
display: flex;
flex-wrap: wrap;
gap: .75rem 1rem;
min-height: 2.45rem;
align-items: center;
}
.checkbox-row .form-check {
margin: 0;
}
.rw-btn,
.btn {
border-radius: 999px;

View File

@@ -32,20 +32,52 @@
</label>
<label>
Policy 이름
<input class="form-control" name="policyName" placeholder="예: BOARD_POSTS_POLICY" required>
<select class="form-select" name="policyName" required>
<option th:each="policyName : ${formOptions.policyNames()}"
th:value="${policyName}"
th:text="${policyName}"></option>
</select>
</label>
<label class="span-2">
기존 Function 선택
<select class="form-select" name="functionKey">
<option value="">Filter predicate로 새 function 자동 생성</option>
<option th:each="function : ${formOptions.functions()}"
th:value="${function.value()}"
th:text="${function.label()}"></option>
</select>
</label>
<label>
Function Owner
<input class="form-control" name="functionOwner" placeholder="비우면 현재 연결 사용자">
<select class="form-select" name="functionOwner">
<option value="">현재 연결 사용자</option>
<option th:each="owner : ${formOptions.owners()}"
th:value="${owner}"
th:text="${owner}"></option>
</select>
</label>
<label>
Function 이름
<input class="form-control" name="functionName" placeholder="비우면 POLICY_NAME_FILTER 자동 생성">
<select class="form-select" name="functionName">
<option value="">POLICY_NAME_FILTER 자동 생성</option>
<option th:each="function : ${formOptions.functions()}"
th:value="${function.functionName()}"
th:text="${function.functionName()}"></option>
</select>
</label>
<label>
<div>
Statement Types
<input class="form-control" name="statementTypes" value="SELECT" placeholder="SELECT,INSERT,UPDATE,DELETE">
</label>
<div class="checkbox-row">
<label class="form-check" th:each="statement : ${formOptions.statementTypes()}">
<input class="form-check-input"
type="checkbox"
name="statementTypes"
th:value="${statement}"
th:checked="${statement == 'SELECT'}">
<span class="form-check-label" th:text="${statement}">SELECT</span>
</label>
</div>
</div>
<div class="form-check align-self-end">
<input class="form-check-input" id="vpd-enabled" type="checkbox" name="enabled" value="true" checked>
<label class="form-check-label" for="vpd-enabled">등록 즉시 활성화</label>