From d39f26886be48594560b99225c5ef7f3db64e687 Mon Sep 17 00:00:00 2001 From: Jan Kvetina Date: Thu, 27 Oct 2022 09:49:07 +0200 Subject: [PATCH] Move to Nav --- database/packages/app.spec.sql | 34 -------- database/packages/app.sql | 146 +++------------------------------ database/packages/nav.spec.sql | 27 ++++++ database/packages/nav.sql | 143 +++++++++++++++++++++++++++++++- database/views/nav_regions.sql | 3 +- database/views/nav_top.sql | 4 +- 6 files changed, 182 insertions(+), 175 deletions(-) diff --git a/database/packages/app.spec.sql b/database/packages/app.spec.sql index 8c673d6..68fb5bc 100644 --- a/database/packages/app.spec.sql +++ b/database/packages/app.spec.sql @@ -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 -- diff --git a/database/packages/app.sql b/database/packages/app.sql index 930a5a7..e910a18 100644 --- a/database/packages/app.sql +++ b/database/packages/app.sql @@ -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); diff --git a/database/packages/nav.spec.sql b/database/packages/nav.spec.sql index 063e848..172c1ff 100644 --- a/database/packages/nav.spec.sql +++ b/database/packages/nav.spec.sql @@ -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 -- diff --git a/database/packages/nav.sql b/database/packages/nav.sql index 9bdc8d6..c419990 100644 --- a/database/packages/nav.sql +++ b/database/packages/nav.sql @@ -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() || ', ''' diff --git a/database/views/nav_regions.sql b/database/views/nav_regions.sql index e04337a..a1f3fa3 100644 --- a/database/views/nav_regions.sql +++ b/database/views/nav_regions.sql @@ -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' diff --git a/database/views/nav_top.sql b/database/views/nav_top.sql index 2471374..8dd01c7 100644 --- a/database/views/nav_top.sql +++ b/database/views/nav_top.sql @@ -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 '' || b.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'; --