From 6e8c851bb71266d487964755e47972e8bd0f5155 Mon Sep 17 00:00:00 2001 From: Jan Kvetina Date: Wed, 29 Dec 2021 19:49:53 +0100 Subject: [PATCH] Generic settings feature for any app --- apex/f770/application/pages/page_00970.sql | 783 +++++++++++++++++++++ apex/f770/install.sql | 1 + packages/app_actions.spec.sql | 42 ++ packages/app_actions.sql | 188 +++++ tables/settings.sql | 43 ++ triggers/settings__.sql | 91 +++ views/settings_overview.sql | 62 ++ 7 files changed, 1210 insertions(+) create mode 100644 apex/f770/application/pages/page_00970.sql create mode 100644 tables/settings.sql create mode 100644 triggers/settings__.sql create mode 100644 views/settings_overview.sql diff --git a/apex/f770/application/pages/page_00970.sql b/apex/f770/application/pages/page_00970.sql new file mode 100644 index 0000000..4e6b587 --- /dev/null +++ b/apex/f770/application/pages/page_00970.sql @@ -0,0 +1,783 @@ +prompt --application/pages/page_00970 +begin +-- Manifest +-- PAGE: 00970 +-- Manifest End +wwv_flow_api.component_begin ( + p_version_yyyy_mm_dd=>'2021.04.15' +,p_release=>'21.1.6' +,p_default_workspace_id=>9014660246496943 +,p_default_application_id=>770 +,p_default_id_offset=>0 +,p_default_owner=>'CORE' +); +wwv_flow_api.create_page( + p_id=>970 +,p_user_interface_id=>wwv_flow_api.id(9169746885570061) +,p_name=>'#fa-wrench Settings' +,p_alias=>'SETTINGS' +,p_step_title=>'Settings' +,p_warn_on_unsaved_changes=>'N' +,p_autocomplete_on_off=>'OFF' +,p_group_id=>wwv_flow_api.id(9240371448352386) +,p_page_template_options=>'#DEFAULT#' +,p_required_role=>wwv_flow_api.id(9823062898204869) +,p_last_updated_by=>'DEV' +,p_last_upd_yyyymmddhh24miss=>'20211229183932' +); +wwv_flow_api.create_page_plug( + p_id=>wwv_flow_api.id(11853608143169127) +,p_plug_name=>'Settings' +,p_icon_css_classes=>'fa-wrench' +,p_region_template_options=>'#DEFAULT#' +,p_plug_template=>wwv_flow_api.id(9070356145569920) +,p_plug_display_sequence=>10 +,p_include_in_reg_disp_sel_yn=>'Y' +,p_plug_display_point=>'BODY' +,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' +,p_attribute_01=>'N' +,p_attribute_02=>'HTML' +); +wwv_flow_api.create_page_plug( + p_id=>wwv_flow_api.id(11853720141169128) +,p_plug_name=>'Settings [GRID]' +,p_region_name=>'SETTINGS' +,p_region_template_options=>'#DEFAULT#' +,p_component_template_options=>'#DEFAULT#' +,p_plug_template=>wwv_flow_api.id(9078290074569925) +,p_plug_display_sequence=>20 +,p_include_in_reg_disp_sel_yn=>'Y' +,p_plug_display_point=>'BODY' +,p_query_type=>'TABLE' +,p_query_table=>'SETTINGS_OVERVIEW' +,p_include_rowid_column=>false +,p_plug_source_type=>'NATIVE_IG' +,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' +,p_prn_units=>'MILLIMETERS' +,p_prn_paper_size=>'A4' +,p_prn_width=>297 +,p_prn_height=>210 +,p_prn_orientation=>'HORIZONTAL' +,p_prn_page_header=>'Settings [GRID]' +,p_prn_page_header_font_color=>'#000000' +,p_prn_page_header_font_family=>'Helvetica' +,p_prn_page_header_font_weight=>'normal' +,p_prn_page_header_font_size=>'12' +,p_prn_page_footer_font_color=>'#000000' +,p_prn_page_footer_font_family=>'Helvetica' +,p_prn_page_footer_font_weight=>'normal' +,p_prn_page_footer_font_size=>'12' +,p_prn_header_bg_color=>'#EEEEEE' +,p_prn_header_font_color=>'#000000' +,p_prn_header_font_family=>'Helvetica' +,p_prn_header_font_weight=>'bold' +,p_prn_header_font_size=>'10' +,p_prn_body_bg_color=>'#FFFFFF' +,p_prn_body_font_color=>'#000000' +,p_prn_body_font_family=>'Helvetica' +,p_prn_body_font_weight=>'normal' +,p_prn_body_font_size=>'10' +,p_prn_border_width=>.5 +,p_prn_page_header_alignment=>'CENTER' +,p_prn_page_footer_alignment=>'CENTER' +,p_prn_border_color=>'#666666' +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854065725169131) +,p_name=>'SETTING_ID' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'SETTING_ID' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_TEXT_FIELD' +,p_heading=>'Setting Id' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>40 +,p_value_alignment=>'LEFT' +,p_attribute_05=>'BOTH' +,p_is_required=>true +,p_max_length=>30 +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854121944169132) +,p_name=>'SETTING_CONTEXT' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'SETTING_CONTEXT' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_TEXT_FIELD' +,p_heading=>'Context' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>50 +,p_value_alignment=>'LEFT' +,p_attribute_05=>'BOTH' +,p_is_required=>false +,p_max_length=>64 +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854239797169133) +,p_name=>'SETTING_GROUP' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'SETTING_GROUP' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_TEXT_FIELD' +,p_heading=>'Group' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>60 +,p_value_alignment=>'LEFT' +,p_attribute_05=>'BOTH' +,p_is_required=>false +,p_max_length=>64 +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854302395169134) +,p_name=>'SETTING_VALUE' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'SETTING_VALUE' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_TEXT_FIELD' +,p_heading=>'Value' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>70 +,p_value_alignment=>'LEFT' +,p_attribute_05=>'BOTH' +,p_is_required=>false +,p_max_length=>256 +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_lov_type=>'NONE' +,p_use_as_row_header=>false +,p_enable_sort_group=>false +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854401801169135) +,p_name=>'DESCRIPTION_' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'DESCRIPTION_' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_TEXT_FIELD' +,p_heading=>'Description' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>80 +,p_value_alignment=>'LEFT' +,p_attribute_05=>'BOTH' +,p_is_required=>false +,p_max_length=>1000 +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_lov_type=>'NONE' +,p_use_as_row_header=>false +,p_enable_sort_group=>false +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854519035169136) +,p_name=>'IS_NUMERIC' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'IS_NUMERIC' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_SINGLE_CHECKBOX' +,p_heading=>'Is Numeric' +,p_heading_alignment=>'CENTER' +,p_display_sequence=>90 +,p_value_alignment=>'CENTER' +,p_attribute_01=>'N' +,p_attribute_02=>'Y' +,p_is_required=>false +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854640901169137) +,p_name=>'IS_DATE' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'IS_DATE' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>false +,p_item_type=>'NATIVE_SINGLE_CHECKBOX' +,p_heading=>'Is Date' +,p_heading_alignment=>'CENTER' +,p_display_sequence=>100 +,p_value_alignment=>'CENTER' +,p_attribute_01=>'N' +,p_attribute_02=>'Y' +,p_is_required=>false +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_duplicate_value=>true +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854730854169138) +,p_name=>'UPDATED_BY' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'UPDATED_BY' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>true +,p_item_type=>'NATIVE_DISPLAY_ONLY' +,p_heading=>'Updated By' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>150 +,p_value_alignment=>'LEFT' +,p_attribute_02=>'VALUE' +,p_attribute_05=>'PLAIN' +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11854883294169139) +,p_name=>'UPDATED_AT' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'UPDATED_AT' +,p_data_type=>'DATE' +,p_is_query_only=>true +,p_item_type=>'NATIVE_DISPLAY_ONLY' +,p_heading=>'Updated At' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>160 +,p_value_alignment=>'LEFT' +,p_attribute_02=>'VALUE' +,p_attribute_05=>'PLAIN' +,p_format_mask=>'YYYY-MM-DD HH24:MI' +,p_enable_filter=>true +,p_filter_is_required=>false +,p_filter_date_ranges=>'ALL' +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11855045700169141) +,p_name=>'APEX$ROW_ACTION' +,p_item_type=>'NATIVE_ROW_ACTION' +,p_display_sequence=>20 +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11855121825169142) +,p_name=>'APEX$ROW_SELECTOR' +,p_item_type=>'NATIVE_ROW_SELECTOR' +,p_display_sequence=>10 +,p_attribute_01=>'Y' +,p_attribute_02=>'Y' +,p_attribute_03=>'N' +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11855718811169148) +,p_name=>'PROCEDURE_NAME' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'PROCEDURE_NAME' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>true +,p_item_type=>'NATIVE_DISPLAY_ONLY' +,p_heading=>'Procedure Name' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>110 +,p_value_alignment=>'LEFT' +,p_attribute_02=>'VALUE' +,p_attribute_05=>'PLAIN' +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11855803111169149) +,p_name=>'DATA_TYPE' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'DATA_TYPE' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>true +,p_item_type=>'NATIVE_DISPLAY_ONLY' +,p_heading=>'Data Type' +,p_heading_alignment=>'LEFT' +,p_display_sequence=>120 +,p_value_alignment=>'LEFT' +,p_attribute_02=>'VALUE' +,p_attribute_05=>'PLAIN' +,p_enable_filter=>true +,p_filter_operators=>'C:S:CASE_INSENSITIVE:REGEXP' +,p_filter_is_required=>false +,p_filter_text_case=>'MIXED' +,p_filter_exact_match=>true +,p_filter_lov_type=>'DISTINCT' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(11855953367169150) +,p_name=>'REFERENCES' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'REFERENCES' +,p_data_type=>'NUMBER' +,p_is_query_only=>true +,p_item_type=>'NATIVE_DISPLAY_ONLY' +,p_heading=>'References' +,p_heading_alignment=>'RIGHT' +,p_display_sequence=>140 +,p_value_alignment=>'RIGHT' +,p_attribute_02=>'VALUE' +,p_attribute_05=>'PLAIN' +,p_enable_filter=>true +,p_filter_is_required=>false +,p_filter_lov_type=>'NONE' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_include_in_export=>true +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(12110240050376301) +,p_name=>'RID' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'RID' +,p_data_type=>'ROWID' +,p_item_type=>'NATIVE_HIDDEN' +,p_display_sequence=>30 +,p_attribute_01=>'Y' +,p_use_as_row_header=>false +,p_enable_sort_group=>false +,p_is_primary_key=>true +,p_include_in_export=>false +); +wwv_flow_api.create_region_column( + p_id=>wwv_flow_api.id(12110307179376302) +,p_name=>'ACTION' +,p_source_type=>'DB_COLUMN' +,p_source_expression=>'ACTION' +,p_data_type=>'VARCHAR2' +,p_is_query_only=>true +,p_item_type=>'NATIVE_HTML_EXPRESSION' +,p_heading=>'Action' +,p_heading_alignment=>'CENTER' +,p_display_sequence=>130 +,p_value_alignment=>'CENTER' +,p_attribute_01=>'&ACTION.' +,p_use_as_row_header=>false +,p_enable_sort_group=>true +,p_enable_control_break=>true +,p_enable_hide=>true +,p_is_primary_key=>false +,p_include_in_export=>true +); +wwv_flow_api.create_interactive_grid( + p_id=>wwv_flow_api.id(11853821618169129) +,p_internal_uid=>11853821618169129 +,p_is_editable=>true +,p_edit_operations=>'i:u:d' +,p_lost_update_check_type=>'VALUES' +,p_add_row_if_empty=>false +,p_submit_checked_rows=>false +,p_lazy_loading=>false +,p_requires_filter=>false +,p_select_first_row=>false +,p_fixed_row_height=>true +,p_pagination_type=>'SET' +,p_show_total_row_count=>true +,p_show_toolbar=>true +,p_toolbar_buttons=>'SEARCH_COLUMN:SEARCH_FIELD:ACTIONS_MENU:SAVE' +,p_enable_save_public_report=>false +,p_enable_subscriptions=>true +,p_enable_flashback=>true +,p_define_chart_view=>true +,p_enable_download=>true +,p_download_formats=>'CSV:HTML:XLSX:PDF' +,p_enable_mail_download=>true +,p_fixed_header=>'PAGE' +,p_show_icon_view=>false +,p_show_detail_view=>false +,p_javascript_code=>wwv_flow_string.join(wwv_flow_t_varchar2( +'function(config) {', +' return unified_ig_toolbar(config);', +'}', +'')) +); +wwv_flow_api.create_ig_report( + p_id=>wwv_flow_api.id(12011021825679405) +,p_interactive_grid_id=>wwv_flow_api.id(11853821618169129) +,p_static_id=>'120111' +,p_type=>'PRIMARY' +,p_default_view=>'GRID' +,p_rows_per_page=>100 +,p_show_row_number=>false +,p_settings_area_expanded=>false +); +wwv_flow_api.create_ig_report_view( + p_id=>wwv_flow_api.id(12011273108679405) +,p_report_id=>wwv_flow_api.id(12011021825679405) +,p_view_type=>'GRID' +,p_stretch_columns=>true +,p_srv_exclude_null_values=>false +,p_srv_only_display_columns=>true +,p_edit_mode=>false +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12012657244679414) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>5 +,p_column_id=>wwv_flow_api.id(11854065725169131) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>240 +,p_sort_order=>1 +,p_sort_direction=>'ASC' +,p_sort_nulls=>'LAST' +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12013523886679418) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>4 +,p_column_id=>wwv_flow_api.id(11854121944169132) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>180 +,p_sort_order=>2 +,p_sort_direction=>'ASC' +,p_sort_nulls=>'LAST' +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12014468263679422) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>1 +,p_column_id=>wwv_flow_api.id(11854239797169133) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>180 +,p_break_order=>5 +,p_break_is_enabled=>true +,p_break_sort_direction=>'ASC' +,p_break_sort_nulls=>'LAST' +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12015320331679424) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>6 +,p_column_id=>wwv_flow_api.id(11854302395169134) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>240 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12016200262679426) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>7 +,p_column_id=>wwv_flow_api.id(11854401801169135) +,p_is_visible=>true +,p_is_frozen=>false +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12017110360679428) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>8 +,p_column_id=>wwv_flow_api.id(11854519035169136) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>100 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12018068358679430) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>9 +,p_column_id=>wwv_flow_api.id(11854640901169137) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>100 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12018933623679432) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>12 +,p_column_id=>wwv_flow_api.id(11854730854169138) +,p_is_visible=>false +,p_is_frozen=>false +,p_width=>200 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12019830036679434) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>13 +,p_column_id=>wwv_flow_api.id(11854883294169139) +,p_is_visible=>false +,p_is_frozen=>false +,p_width=>160 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12021675404679438) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>0 +,p_column_id=>wwv_flow_api.id(11855045700169141) +,p_is_visible=>true +,p_is_frozen=>true +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12104857120371283) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>10 +,p_column_id=>wwv_flow_api.id(11855718811169148) +,p_is_visible=>false +,p_is_frozen=>false +,p_width=>240 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12105782280371287) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>11 +,p_column_id=>wwv_flow_api.id(11855803111169149) +,p_is_visible=>false +,p_is_frozen=>false +,p_width=>160 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12106513784371290) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>11 +,p_column_id=>wwv_flow_api.id(11855953367169150) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>100 +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12116219450377419) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>16 +,p_column_id=>wwv_flow_api.id(12110240050376301) +,p_is_visible=>true +,p_is_frozen=>false +); +wwv_flow_api.create_ig_report_column( + p_id=>wwv_flow_api.id(12125527954437069) +,p_view_id=>wwv_flow_api.id(12011273108679405) +,p_display_seq=>3 +,p_column_id=>wwv_flow_api.id(12110307179376302) +,p_is_visible=>true +,p_is_frozen=>false +,p_width=>100 +); +wwv_flow_api.create_page_button( + p_id=>wwv_flow_api.id(12090595745282902) +,p_button_sequence=>10 +,p_button_plug_id=>wwv_flow_api.id(11853608143169127) +,p_button_name=>'REFRESH' +,p_button_action=>'REDIRECT_PAGE' +,p_button_template_options=>'#DEFAULT#' +,p_button_template_id=>wwv_flow_api.id(9144574670569995) +,p_button_image_alt=>'Refresh' +,p_button_position=>'RIGHT_OF_TITLE' +,p_button_redirect_url=>'f?p=&APP_ID.:970:&SESSION.::&DEBUG.:970::' +,p_icon_css_classes=>'fa-refresh' +); +wwv_flow_api.create_page_button( + p_id=>wwv_flow_api.id(11855360615169144) +,p_button_sequence=>20 +,p_button_plug_id=>wwv_flow_api.id(11853608143169127) +,p_button_name=>'REBUILD' +,p_button_action=>'REDIRECT_PAGE' +,p_button_template_options=>'#DEFAULT#' +,p_button_template_id=>wwv_flow_api.id(9145249029569999) +,p_button_image_alt=>'Rebuild' +,p_button_position=>'RIGHT_OF_TITLE' +,p_button_redirect_url=>'f?p=&APP_ID.:970:&SESSION.::&DEBUG.:970:P970_REBUILD:Y' +,p_button_cattributes=>'title="&P970_REBUILD_TITLE."' +); +wwv_flow_api.create_page_item( + p_id=>wwv_flow_api.id(11855448034169145) +,p_name=>'P970_REBUILD' +,p_item_sequence=>10 +,p_item_plug_id=>wwv_flow_api.id(11853608143169127) +,p_use_cache_before_default=>'NO' +,p_display_as=>'NATIVE_HIDDEN' +,p_attribute_01=>'Y' +); +wwv_flow_api.create_page_item( + p_id=>wwv_flow_api.id(12110581452376304) +,p_name=>'P970_REBUILD_TITLE' +,p_item_sequence=>20 +,p_item_plug_id=>wwv_flow_api.id(11853608143169127) +,p_display_as=>'NATIVE_HIDDEN' +,p_attribute_01=>'Y' +); +wwv_flow_api.create_page_da_event( + p_id=>wwv_flow_api.id(12065683402897749) +,p_name=>'SAVE_SETTINGS' +,p_event_sequence=>10 +,p_triggering_element_type=>'REGION' +,p_triggering_region_id=>wwv_flow_api.id(11853720141169128) +,p_bind_type=>'bind' +,p_bind_event_type=>'NATIVE_IG|REGION TYPE|interactivegridsave' +); +wwv_flow_api.create_page_da_action( + p_id=>wwv_flow_api.id(12066015388897750) +,p_event_id=>wwv_flow_api.id(12065683402897749) +,p_event_result=>'TRUE' +,p_action_sequence=>10 +,p_execute_on_page_init=>'N' +,p_action=>'NATIVE_JAVASCRIPT_CODE' +,p_affected_elements_type=>'REGION' +,p_affected_region_id=>wwv_flow_api.id(11853720141169128) +,p_attribute_01=>wwv_flow_string.join(wwv_flow_t_varchar2( +'apex.region(''SETTINGS'').widget().interactiveGrid(''getActions'').invoke(''save'');', +'')) +); +wwv_flow_api.create_page_da_action( + p_id=>wwv_flow_api.id(12066546327897751) +,p_event_id=>wwv_flow_api.id(12065683402897749) +,p_event_result=>'TRUE' +,p_action_sequence=>20 +,p_execute_on_page_init=>'N' +,p_action=>'NATIVE_REFRESH' +,p_affected_elements_type=>'REGION' +,p_affected_region_id=>wwv_flow_api.id(11853720141169128) +); +wwv_flow_api.create_page_process( + p_id=>wwv_flow_api.id(11855259982169143) +,p_process_sequence=>10 +,p_process_point=>'AFTER_SUBMIT' +,p_region_id=>wwv_flow_api.id(11853720141169128) +,p_process_type=>'NATIVE_IG_DML' +,p_process_name=>'SETTINGS' +,p_attribute_01=>'PLSQL_CODE' +,p_attribute_04=>wwv_flow_string.join(wwv_flow_t_varchar2( +'app_actions.set_setting (', +' in_action => :APEX$ROW_STATUS,', +' in_out_rowid => :RID,', +' in_name => :SETTING_ID,', +' in_context => :SETTING_CONTEXT,', +' in_group => :SETTING_GROUP,', +' in_value => :SETTING_VALUE,', +' in_description => :DESCRIPTION_,', +' in_is_numeric => :IS_NUMERIC,', +' in_is_date => :IS_DATE', +');', +'')) +,p_attribute_05=>'Y' +,p_attribute_06=>'N' +,p_error_display_location=>'INLINE_IN_NOTIFICATION' +); +wwv_flow_api.create_page_process( + p_id=>wwv_flow_api.id(11855629070169147) +,p_process_sequence=>10 +,p_process_point=>'BEFORE_HEADER' +,p_process_type=>'NATIVE_PLSQL' +,p_process_name=>'REBUILD_PACKAGE' +,p_process_sql_clob=>wwv_flow_string.join(wwv_flow_t_varchar2( +'app_actions.rebuild_settings();', +'')) +,p_process_clob_language=>'PLSQL' +,p_error_display_location=>'INLINE_IN_NOTIFICATION' +,p_process_when=>'P970_REBUILD' +,p_process_when_type=>'ITEM_IS_NOT_NULL' +); +wwv_flow_api.create_page_process( + p_id=>wwv_flow_api.id(12110449828376303) +,p_process_sequence=>20 +,p_process_point=>'BEFORE_HEADER' +,p_process_type=>'NATIVE_PLSQL' +,p_process_name=>'INIT_DEFAULTS' +,p_process_sql_clob=>':P970_REBUILD_TITLE := ''Rebuild '' || UPPER(app_actions.in_settings_package) || '' package with '' || UPPER(app_actions.in_settings_prefix) || ''* functions'';' +,p_process_clob_language=>'PLSQL' +,p_error_display_location=>'INLINE_IN_NOTIFICATION' +); +wwv_flow_api.component_end; +end; +/ diff --git a/apex/f770/install.sql b/apex/f770/install.sql index f5d983f..29a99ec 100644 --- a/apex/f770/install.sql +++ b/apex/f770/install.sql @@ -121,6 +121,7 @@ prompt --install @@application/pages/page_00920.sql @@application/pages/page_00925.sql @@application/pages/page_00940.sql +@@application/pages/page_00970.sql @@application/pages/page_00990.sql @@application/pages/page_09999.sql @@application/end_environment.sql diff --git a/packages/app_actions.spec.sql b/packages/app_actions.spec.sql index 4f8ca41..a7eec55 100644 --- a/packages/app_actions.spec.sql +++ b/packages/app_actions.spec.sql @@ -29,6 +29,13 @@ CREATE OR REPLACE PACKAGE app_actions AS * */ + in_settings_package CONSTANT VARCHAR2(30) := 'SETT'; + in_settings_prefix CONSTANT VARCHAR2(30) := 'get_'; + + + + + -- -- Remove missing pages from NAVIGATION table -- @@ -130,5 +137,40 @@ CREATE OR REPLACE PACKAGE app_actions AS in_c050 VARCHAR2 := NULL ); + + + -- + -- Get value from Settings table + -- + FUNCTION get_setting ( + in_name settings.setting_id%TYPE, + in_context settings.setting_context%TYPE := NULL + ) + RETURN settings.setting_value%TYPE; + + + + -- + -- Store/update settings + -- + PROCEDURE set_setting ( + in_action CHAR, + in_out_rowid IN OUT NOCOPY VARCHAR2, + in_name settings.setting_id%TYPE, + in_context settings.setting_context%TYPE := NULL, + in_group settings.setting_group%TYPE := NULL, + in_value settings.setting_value%TYPE := NULL, + in_description settings.description_%TYPE := NULL, + in_is_numeric settings.is_numeric%TYPE := NULL, + in_is_date settings.is_date%TYPE := NULL + ); + + + + -- + -- Rebuild package containing function matching Settings table + -- + PROCEDURE rebuild_settings; + END; / diff --git a/packages/app_actions.sql b/packages/app_actions.sql index 0345a11..731fce9 100644 --- a/packages/app_actions.sql +++ b/packages/app_actions.sql @@ -333,5 +333,193 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS app.raise_error(); END; + + + FUNCTION get_setting ( + in_name settings.setting_id%TYPE, + in_context settings.setting_context%TYPE := NULL + ) + RETURN settings.setting_value%TYPE + AS + out_value settings.setting_value%TYPE; + BEGIN + SELECT s.setting_value INTO out_value + FROM settings s + WHERE s.app_id = app.get_app_id() + AND s.setting_id = in_name + AND s.setting_context = in_context; + -- + RETURN out_value; + EXCEPTION + WHEN NO_DATA_FOUND THEN + BEGIN + SELECT s.setting_value INTO out_value + FROM settings s + WHERE s.app_id = app.get_app_id() + AND s.setting_id = in_name + AND s.setting_context IS NULL; + -- + RETURN out_value; + EXCEPTION + WHEN NO_DATA_FOUND THEN + RETURN NULL; + END; + END; + + + + PROCEDURE set_setting ( + in_action CHAR, + in_out_rowid IN OUT NOCOPY VARCHAR2, + in_name settings.setting_id%TYPE, + in_context settings.setting_context%TYPE := NULL, + in_group settings.setting_group%TYPE := NULL, + in_value settings.setting_value%TYPE := NULL, + in_description settings.description_%TYPE := NULL, + in_is_numeric settings.is_numeric%TYPE := NULL, + in_is_date settings.is_date%TYPE := NULL + ) + AS + rec settings%ROWTYPE; + BEGIN + app.log_module(app.get_json_object( + 'in_action', in_action, + 'in_rowid', in_out_rowid, + 'in_name', in_name, + 'in_context', in_context, + 'in_value', in_value, + 'in_is_numeric', in_is_numeric, + 'in_is_date', in_is_date + )); + -- + rec.app_id := app.get_app_id(); + rec.setting_id := RTRIM(RTRIM(UPPER(in_name))); + rec.setting_context := RTRIM(RTRIM(in_context)); + rec.setting_group := in_group; + rec.setting_value := in_value; + rec.description_ := in_description; + rec.is_numeric := in_is_numeric; + rec.is_date := in_is_date; + rec.updated_by := app.get_user_id(); + rec.updated_at := SYSDATE; + -- + CASE in_action + WHEN 'D' THEN + DELETE FROM settings s + WHERE s.app_id = rec.app_id + AND ROWID = in_out_rowid; + -- + WHEN 'U' THEN + UPDATE settings s + SET ROW = rec + WHERE s.app_id = rec.app_id + AND ROWID = in_out_rowid; + -- + IF SQL%ROWCOUNT = 0 THEN + app.raise_error('SETTINGS_UPDATE_FAILED'); + END IF; + -- + ELSE + BEGIN + INSERT INTO settings VALUES rec + RETURNING ROWID INTO in_out_rowid; + EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + app.raise_error('SETTINGS_EXISTS'); + END; + END CASE; + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error(); + END; + + + + PROCEDURE rebuild_settings AS + q VARCHAR2(32767); + BEGIN + app.log_module(); + + -- create specification + q := 'CREATE OR REPLACE PACKAGE ' || LOWER(in_settings_package) || ' AS' || CHR(10); + -- + FOR c IN ( + SELECT + s.setting_id, + MAX(s.is_numeric) AS is_numeric, + MAX(s.is_date) AS is_date + FROM settings s + WHERE s.app_id = app.get_app_id() + GROUP BY s.setting_id + ORDER BY s.setting_id + ) LOOP + q := q || CHR(10); + q := q || ' FUNCTION ' || LOWER(in_settings_prefix) || LOWER(c.setting_id) || ' (' || CHR(10); + q := q || ' in_context settings.setting_context%TYPE := NULL' || CHR(10); + q := q || ' )' || CHR(10); + q := q || ' RETURN ' || CASE + WHEN c.is_numeric = 'Y' THEN 'NUMBER' + WHEN c.is_date = 'Y' THEN 'DATE' + ELSE 'VARCHAR2' END || CHR(10); + q := q || ' RESULT_CACHE;' || CHR(10); ---------- howto invalidate RESULT_CACHE ??? + END LOOP; + -- + q := q || CHR(10) || 'END;'; + -- + EXECUTE IMMEDIATE q; + + -- create package body + q := 'CREATE OR REPLACE PACKAGE BODY ' || LOWER(in_settings_package) || ' AS' || CHR(10); + -- + FOR c IN ( + SELECT + s.setting_id, + MAX(s.is_numeric) AS is_numeric, + MAX(s.is_date) AS is_date + FROM settings s + WHERE s.app_id = app.get_app_id() + GROUP BY s.setting_id + ORDER BY s.setting_id + ) LOOP + q := q || CHR(10); + q := q || ' FUNCTION ' || LOWER(in_settings_prefix) || LOWER(c.setting_id) || ' (' || CHR(10); + q := q || ' in_context settings.setting_context%TYPE := NULL' || CHR(10); + q := q || ' )' || CHR(10); + q := q || ' RETURN ' || CASE + WHEN c.is_numeric = 'Y' THEN 'NUMBER' + WHEN c.is_date = 'Y' THEN 'DATE' + ELSE 'VARCHAR2' END || CHR(10); + q := q || ' RESULT_CACHE AS' || CHR(10); + q := q || ' BEGIN' || CHR(10); + q := q || ' RETURN ' || CASE + WHEN c.is_numeric = 'Y' THEN 'TO_NUMBER(' + WHEN c.is_date = 'Y' THEN 'app.get_date(' + END || 'app_actions.get_setting (' || CHR(10); + q := q || ' in_name => ''' || c.setting_id || ''',' || CHR(10); + q := q || ' in_context => in_context' || CHR(10); + q := q || ' ' || CASE + WHEN NVL(c.is_numeric, c.is_date) = 'Y' THEN ')' + END || ');' || CHR(10); + q := q || ' EXCEPTION' || CHR(10); + q := q || ' WHEN NO_DATA_FOUND THEN' || CHR(10); + q := q || ' RETURN NULL;' || CHR(10); + q := q || ' END;' || CHR(10); + END LOOP; + -- + q := q || CHR(10) || 'END;'; + -- + DBMS_OUTPUT.PUT_LINE(q); + EXECUTE IMMEDIATE q; + -- + recompile(); + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error(); + END; + END; / diff --git a/tables/settings.sql b/tables/settings.sql new file mode 100644 index 0000000..a78ce59 --- /dev/null +++ b/tables/settings.sql @@ -0,0 +1,43 @@ +--DROP TABLE settings PURGE; +CREATE TABLE settings ( + app_id NUMBER(4) CONSTRAINT nn_settings_app_id NOT NULL, + setting_id VARCHAR2(30) CONSTRAINT nn_settings_id NOT NULL, + -- + setting_context VARCHAR2(64), + setting_group VARCHAR2(64), + setting_value VARCHAR2(256), + -- + description_ VARCHAR2(1000), + -- + is_numeric CHAR(1), + is_date CHAR(1), + -- + updated_by VARCHAR2(30), + updated_at DATE, + -- + CONSTRAINT uq_settings + UNIQUE (app_id, setting_id, setting_context), + -- + CONSTRAINT fk_settings_app_id + FOREIGN KEY (app_id) + REFERENCES apps (app_id), + -- + CONSTRAINT ch_settings_is_active + CHECK ((is_numeric = 'Y' AND is_date IS NULL) OR is_numeric IS NULL), + -- + CONSTRAINT ch_settings_is_date + CHECK ((is_date = 'Y' AND is_numeric IS NULL) OR is_date IS NULL) +) +STORAGE (BUFFER_POOL KEEP); +-- +COMMENT ON TABLE settings IS 'List of settings shared through whole app'; +-- +COMMENT ON COLUMN settings.app_id IS 'Application ID'; +COMMENT ON COLUMN settings.setting_id IS 'Setting ID'; +COMMENT ON COLUMN settings.setting_context IS 'To allow multiple values depending on context value'; +COMMENT ON COLUMN settings.setting_group IS 'Group just for grouping set in APEX'; +COMMENT ON COLUMN settings.setting_value IS 'Value stored as string'; +COMMENT ON COLUMN settings.description_ IS 'Description'; +COMMENT ON COLUMN settings.is_numeric IS 'Flag to convert value to number'; +COMMENT ON COLUMN settings.is_date IS 'Flag to convert value to date'; + diff --git a/triggers/settings__.sql b/triggers/settings__.sql new file mode 100644 index 0000000..fbe5af3 --- /dev/null +++ b/triggers/settings__.sql @@ -0,0 +1,91 @@ +CREATE OR REPLACE TRIGGER settings__ +FOR UPDATE OR INSERT OR DELETE ON settings +COMPOUND TRIGGER + + in_table_name CONSTANT user_tables.table_name%TYPE := 'SETTINGS'; + -- + curr_log_id logs.log_id%TYPE; + curr_event_id log_events.log_id%TYPE; + curr_updated_by settings.updated_by%TYPE; + curr_updated_at settings.updated_at%TYPE; + -- + rows_inserted PLS_INTEGER := 0; + rows_updated PLS_INTEGER := 0; + rows_deleted PLS_INTEGER := 0; + -- + last_rowid ROWID; + + + + BEFORE STATEMENT IS + BEGIN + curr_log_id := app.log_trigger(in_table_name); + curr_updated_by := app.get_user_id(); + curr_updated_at := SYSDATE; + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error('TRIGGER_FAILED', in_table_name); + END BEFORE STATEMENT; + + + + BEFORE EACH ROW IS + BEGIN + IF NOT DELETING THEN + :NEW.updated_by := curr_updated_by; + :NEW.updated_at := curr_updated_at; + END IF; + -- + curr_event_id := app.log_event('SETTINGS_CHANGED'); + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error('TRIGGER_FAILED', in_table_name); + END BEFORE EACH ROW; + + + + AFTER EACH ROW IS + new_json VARCHAR2(32767); + old_json VARCHAR2(32767); + BEGIN + IF INSERTING THEN + rows_inserted := rows_inserted + 1; + last_rowid := :NEW.ROWID; + ELSIF UPDATING THEN + rows_updated := rows_updated + 1; + last_rowid := :OLD.ROWID; + ELSIF DELETING THEN + rows_deleted := rows_deleted + 1; + last_rowid := :OLD.ROWID; + END IF; + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error('TRIGGER_FAILED', in_table_name); + END AFTER EACH ROW; + + + + AFTER STATEMENT IS + BEGIN + app.log_success ( + in_log_id => curr_log_id, + in_rows_inserted => rows_inserted, + in_rows_updated => rows_updated, + in_rows_deleted => rows_deleted, + in_last_rowid => last_rowid + ); + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error('TRIGGER_FAILED', in_table_name); + END AFTER STATEMENT; + +END; +/ diff --git a/views/settings_overview.sql b/views/settings_overview.sql new file mode 100644 index 0000000..0fc53fa --- /dev/null +++ b/views/settings_overview.sql @@ -0,0 +1,62 @@ +CREATE OR REPLACE VIEW settings_overview AS +WITH x AS ( + SELECT + UPPER('SETT') AS package_name, -- app_actions spec + UPPER('GET_') AS prefix + FROM DUAL +), +p AS ( + SELECT p.procedure_name, a.data_type + FROM user_procedures p + JOIN user_arguments a + ON a.package_name = p.object_name + AND a.object_name = p.procedure_name + AND a.position = 0 + JOIN x + ON x.package_name = p.object_name +), +r AS ( + SELECT + r.procedure_name, + COUNT(*) AS references + FROM ( + SELECT REPLACE(RTRIM(REGEXP_SUBSTR(UPPER(s.text), x.package_name || '\.' || REPLACE(x.prefix, '_', '\_') || '[^(]*')), x.package_name || '.', '') AS procedure_name + FROM user_source s + CROSS JOIN x + WHERE UPPER(s.text) LIKE '%' || x.package_name || '.' || x.prefix || '%' + ) r + GROUP BY r.procedure_name +) +SELECT + s.ROWID AS rid, + s.setting_id, + s.setting_context, + s.setting_group, + s.setting_value, + s.description_, + s.is_numeric, + s.is_date, + -- + p.procedure_name, + p.data_type, + -- + CASE + WHEN (p.procedure_name IS NULL + OR (s.is_numeric = 'Y' AND p.data_type != 'NUMBER') + OR (s.is_date = 'Y' AND p.data_type != 'DATE') + ) + THEN app.get_icon('fa-warning', 'Rebuild needed') + END AS action, + -- + r.references, + -- + s.updated_by, + s.updated_at +FROM settings s +CROSS JOIN x +LEFT JOIN p + ON p.procedure_name = x.prefix || s.setting_id +LEFT JOIN r + ON r.procedure_name = x.prefix || s.setting_id +WHERE s.app_id = app.get_app_id(); +