Move to Nav

This commit is contained in:
Jan Kvetina 2022-10-27 09:49:07 +02:00
parent e4c7d06c50
commit d39f26886b
6 changed files with 182 additions and 175 deletions

View File

@ -502,40 +502,6 @@ CREATE OR REPLACE PACKAGE app AS
-- ### Navigation
--
--
-- Check if user have permissions to access the page
--
FUNCTION is_page_available (
in_page_id navigation.page_id%TYPE,
in_app_id navigation.app_id%TYPE
)
RETURN CHAR;
--
-- Redirect to page and set items if needed
--
PROCEDURE redirect (
in_page_id NUMBER := NULL,
in_names VARCHAR2 := NULL,
in_values VARCHAR2 := NULL,
in_overload VARCHAR2 := NULL, -- JSON object to overload passed items/values
in_transform BOOLEAN := FALSE, -- to pass all page items to new page
in_reset BOOLEAN := TRUE -- reset page items
);
-- ### Functions to work with APEX items
--

View File

@ -118,6 +118,9 @@ CREATE OR REPLACE PACKAGE BODY app AS
v_app_id apps.app_id%TYPE := COALESCE(in_app_id, app.get_app_id());
out_page_id navigation.page_id%TYPE;
BEGIN
--
--APEX_APPLICATION.G_HOME_LINK
--
SELECT TO_NUMBER(REGEXP_SUBSTR(a.home_link, ':(\d+):&' || 'SESSION\.', 1, 1, NULL, 1))
INTO out_page_id
FROM apex_applications a
@ -276,6 +279,9 @@ CREATE OR REPLACE PACKAGE BODY app AS
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
--
--APEX_APPLICATION.G_BROWSER_LANGUAGE
--
RETURN REPLACE(UPPER(SUBSTR(OWA_UTIL.GET_CGI_ENV('HTTP_ACCEPT_LANGUAGE'), 1, 2)), 'CS', 'CZ');
EXCEPTION
WHEN OTHERS THEN
@ -560,8 +566,10 @@ CREATE OR REPLACE PACKAGE BODY app AS
WHERE a.application_id = rec.app_id;
-- also add first pages into Navigation table
/*
EXECUTE IMMEDIATE
'BEGIN app_actions.nav_autoupdate(); END;'; -- to remove dependency
*/
--
UPDATE navigation n
SET n.order# = CASE
@ -1213,141 +1221,6 @@ CREATE OR REPLACE PACKAGE BODY app AS
FUNCTION is_page_available (
in_page_id navigation.page_id%TYPE,
in_app_id navigation.app_id%TYPE
)
RETURN CHAR
AS
v_auth_scheme apex_application_pages.authorization_scheme%TYPE;
v_package_name user_procedures.object_name%TYPE;
v_procedure_name user_procedures.procedure_name%TYPE;
v_data_type user_arguments.pls_type%TYPE;
v_page_argument user_arguments.argument_name%TYPE;
--
out_result CHAR;
out_result_bool BOOLEAN;
--
PRAGMA UDF; -- SQL only
BEGIN
-- get auth cheme, procedure...
SELECT
n.auth_scheme,
n.package_name,
n.procedure_name,
n.data_type,
n.argument_name
INTO v_auth_scheme, v_package_name, v_procedure_name, v_data_type, v_page_argument
FROM nav_availability_mvw n
WHERE n.application_id = in_app_id
AND n.page_id = in_page_id;
-- log current page
IF app.is_debug_on() AND in_page_id = app.get_page_id() THEN
app.log_action (
'IS_PAGE_AVAILABLE',
in_app_id,
in_page_id,
NVL(v_auth_scheme, '-'),
NVL(v_package_name || '.' || v_procedure_name, '-'),
NVL(v_data_type, '-'),
NVL(v_page_argument, '-')
);
END IF;
-- skip global page and login/logout page
IF in_page_id IN (0, 9999) THEN
RETURN 'Y'; -- show
END IF;
-- check scheme and procedure
IF v_auth_scheme IS NULL THEN
app.log_warning('AUTH_SCHEME_MISSING', in_app_id, in_page_id);
--
RETURN 'Y'; -- show, page has no authorization set
--
ELSIF v_auth_scheme IN ('MUST_NOT_BE_PUBLIC_USER') THEN
RETURN 'Y'; -- show
--
ELSIF v_procedure_name IS NULL THEN
app.log_warning('AUTH_PROCEDURE_MISSING', in_app_id, in_page_id, v_auth_scheme);
--
IF app.is_developer() THEN -- show in menu, allow access
RETURN 'Y';
END IF;
--
RETURN 'N'; -- hide, auth function is set on page but missing in AUTH package
END IF;
-- call function to evaluate access
IF v_data_type = 'BOOLEAN' THEN
IF v_page_argument IS NOT NULL THEN
-- pass page_id when neeeded
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '(:page_id); END;'
USING IN in_page_id, OUT out_result_bool;
ELSE
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '; END;'
USING OUT out_result_bool;
END IF;
--
RETURN CASE WHEN out_result_bool THEN 'Y' ELSE 'N' END;
ELSE
IF v_page_argument IS NOT NULL THEN
-- pass page_id when neeeded
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '(:page_id); END;'
USING IN in_page_id, OUT out_result;
ELSE
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '; END;'
USING OUT out_result;
END IF;
END IF;
--
RETURN NVL(out_result, 'N');
END;
PROCEDURE redirect (
in_page_id NUMBER := NULL,
in_names VARCHAR2 := NULL,
in_values VARCHAR2 := NULL,
in_overload VARCHAR2 := NULL, -- JSON object to overload passed items/values
in_transform BOOLEAN := FALSE, -- to pass all page items to new page
in_reset BOOLEAN := TRUE -- reset page items
) AS
out_target VARCHAR2(32767);
BEGIN
-- commit otherwise anything before redirect will be rolled back
COMMIT;
-- check if we are in APEX or not
HTP.INIT;
out_target := app.get_page_url (
in_page_id => in_page_id,
in_names => in_names,
in_values => in_values,
in_overload => in_overload,
in_transform => in_transform,
in_reset => in_reset
);
--
app.log_debug('REDIRECT', app.get_json_list(in_page_id, in_names, in_values, out_target));
--
APEX_UTIL.REDIRECT_URL(out_target); -- OWA_UTIL not working on Cloud
--
APEX_APPLICATION.STOP_APEX_ENGINE;
--
-- EXCEPTION
-- WHEN APEX_APPLICATION.E_STOP_APEX_ENGINE THEN
--
END;
FUNCTION get_item_name (
in_name apex_application_page_items.item_name%TYPE,
in_page_id apex_application_page_items.page_id%TYPE := NULL,
@ -1474,6 +1347,9 @@ CREATE OR REPLACE PACKAGE BODY app AS
WHEN OTHERS THEN
BEGIN
RETURN TO_DATE(SUBSTR(REPLACE(l_value, '.', '/'), 1, 10), 'DD/MM/YYYY');
--
--V('APP_NLS_DATE_FORMAT')
--
EXCEPTION
WHEN OTHERS THEN
app.raise_error('INVALID_DATE', in_value, in_format);

View File

@ -29,6 +29,33 @@ CREATE OR REPLACE PACKAGE nav AS
*
*/
--
-- Check if user have permissions to access the page
--
FUNCTION is_page_available (
in_page_id navigation.page_id%TYPE,
in_app_id navigation.app_id%TYPE
)
RETURN CHAR;
--
-- Redirect to page and set items if needed
--
PROCEDURE redirect (
in_page_id NUMBER := NULL,
in_names VARCHAR2 := NULL,
in_values VARCHAR2 := NULL,
in_overload VARCHAR2 := NULL, -- JSON object to overload passed items/values
in_transform BOOLEAN := FALSE, -- to pass all page items to new page
in_reset BOOLEAN := TRUE -- reset page items
);
-- ### Help functions
--

View File

@ -1,5 +1,140 @@
CREATE OR REPLACE PACKAGE BODY nav AS
FUNCTION is_page_available (
in_page_id navigation.page_id%TYPE,
in_app_id navigation.app_id%TYPE
)
RETURN CHAR
AS
v_auth_scheme apex_application_pages.authorization_scheme%TYPE;
v_package_name user_procedures.object_name%TYPE;
v_procedure_name user_procedures.procedure_name%TYPE;
v_data_type user_arguments.pls_type%TYPE;
v_page_argument user_arguments.argument_name%TYPE;
--
out_result CHAR;
out_result_bool BOOLEAN;
--
PRAGMA UDF; -- SQL only
BEGIN
-- get auth cheme, procedure...
SELECT
n.auth_scheme,
n.package_name,
n.procedure_name,
n.data_type,
n.argument_name
INTO v_auth_scheme, v_package_name, v_procedure_name, v_data_type, v_page_argument
FROM nav_availability_mvw n
WHERE n.application_id = in_app_id
AND n.page_id = in_page_id;
-- log current page
IF app.is_debug_on() AND in_page_id = app.get_page_id() THEN
app.log_action (
'IS_PAGE_AVAILABLE',
in_app_id,
in_page_id,
NVL(v_auth_scheme, '-'),
NVL(v_package_name || '.' || v_procedure_name, '-'),
NVL(v_data_type, '-'),
NVL(v_page_argument, '-')
);
END IF;
-- skip global page and login/logout page
IF in_page_id IN (0, 9999) THEN
RETURN 'Y'; -- show
END IF;
-- check scheme and procedure
IF v_auth_scheme IS NULL THEN
app.log_warning('AUTH_SCHEME_MISSING', in_app_id, in_page_id);
--
RETURN 'Y'; -- show, page has no authorization set
--
ELSIF v_auth_scheme IN ('MUST_NOT_BE_PUBLIC_USER') THEN
RETURN 'Y'; -- show
--
ELSIF v_procedure_name IS NULL THEN
app.log_warning('AUTH_PROCEDURE_MISSING', in_app_id, in_page_id, v_auth_scheme);
--
IF app.is_developer() THEN -- show in menu, allow access
RETURN 'Y';
END IF;
--
RETURN 'N'; -- hide, auth function is set on page but missing in AUTH package
END IF;
-- call function to evaluate access
IF v_data_type = 'BOOLEAN' THEN
IF v_page_argument IS NOT NULL THEN
-- pass page_id when neeeded
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '(:page_id); END;'
USING IN in_page_id, OUT out_result_bool;
ELSE
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '; END;'
USING OUT out_result_bool;
END IF;
--
RETURN CASE WHEN out_result_bool THEN 'Y' ELSE 'N' END;
ELSE
IF v_page_argument IS NOT NULL THEN
-- pass page_id when neeeded
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '(:page_id); END;'
USING IN in_page_id, OUT out_result;
ELSE
EXECUTE IMMEDIATE
'BEGIN :r := ' || v_package_name || '.' || v_procedure_name || '; END;'
USING OUT out_result;
END IF;
END IF;
--
RETURN NVL(out_result, 'N');
END;
PROCEDURE redirect (
in_page_id NUMBER := NULL,
in_names VARCHAR2 := NULL,
in_values VARCHAR2 := NULL,
in_overload VARCHAR2 := NULL, -- JSON object to overload passed items/values
in_transform BOOLEAN := FALSE, -- to pass all page items to new page
in_reset BOOLEAN := TRUE -- reset page items
) AS
out_target VARCHAR2(32767);
BEGIN
-- commit otherwise anything before redirect will be rolled back
COMMIT;
-- check if we are in APEX or not
HTP.INIT;
out_target := app.get_page_url (
in_page_id => in_page_id,
in_names => in_names,
in_values => in_values,
in_overload => in_overload,
in_transform => in_transform,
in_reset => in_reset
);
--
app.log_debug('REDIRECT', app.get_json_list(in_page_id, in_names, in_values, out_target));
--
APEX_UTIL.REDIRECT_URL(out_target); -- OWA_UTIL not working on Cloud
--
APEX_APPLICATION.STOP_APEX_ENGINE;
--
-- EXCEPTION
-- WHEN APEX_APPLICATION.E_STOP_APEX_ENGINE THEN
--
END;
FUNCTION get_html_a (
in_href VARCHAR2,
in_name VARCHAR2,
@ -146,21 +281,23 @@ CREATE OR REPLACE PACKAGE BODY nav AS
DBMS_MVIEW.REFRESH('NAV_AVAILABILITY_MVW', 'C', parallelism => 2);
DBMS_MVIEW.REFRESH('NAV_OVERVIEW_MVW', 'C', parallelism => 2);
--
/*
app_actions.send_message (
in_app_id => in_app_id,
in_user_id => in_user_id,
in_message => app.get_translated_message('MVW_REFRESHED', in_app_id, in_lang_id)
);
);*/
--
app.log_success(TO_CHAR(in_log_id));
EXCEPTION
WHEN OTHERS THEN
/*
app_actions.send_message (
in_app_id => in_app_id,
in_user_id => in_user_id,
in_message => app.get_translated_message('MVW_FAILED', in_app_id, in_lang_id),
in_type => 'WARNING'
);
);*/
COMMIT;
--
app.raise_error();
@ -177,7 +314,7 @@ CREATE OR REPLACE PACKAGE BODY nav AS
--
app.create_job (
in_job_name => 'RECALC_MVW_NAV',
in_statement => 'app_actions.refresh_nav_views('
in_statement => 'nav.refresh_nav_views('
|| v_log_id || ', '''
|| app.get_user_id() || ''', '
|| app.get_app_id() || ', '''

View File

@ -129,7 +129,8 @@ SELECT
ELSE r.table_name
END AS table_name,
--
app_actions.get_object_link(t.object_type, r.table_name) AS table_link,
--app_actions.get_object_link(t.object_type, r.table_name) AS table_link,
NULL AS table_link,
--
CASE
WHEN r.source_type_code != 'NATIVE_IG'

View File

@ -63,7 +63,7 @@ SELECT
--
n.javascript AS attribute05, -- javascript action
--
NULL AS attribute06, -- badge left
NULL AS attribute06, -- badge left
--
CASE WHEN b.badge IS NOT NULL
THEN '<span class="BADGE">' || b.badge || '</badge>'
@ -81,7 +81,7 @@ LEFT JOIN nav_badges b
ON b.page_id = n.page_id
WHERE n.action IS NULL
AND n.is_hidden IS NULL
AND 'Y' = app.is_page_available(n.page_id, n.app_id);
AND 'Y' = nav.is_page_available(n.page_id, n.app_id);
--
COMMENT ON TABLE nav_top IS '[CORE - DASHBOARD] Navigation view used for rendering top menu';
--