From dc8d95fd26a29f0da79b0b07115eae8915538fb2 Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Tue, 16 Apr 2024 15:40:02 +0200 Subject: [PATCH 01/22] modified orgs pages --- .../datasetapproval/assets/css/approval.css | 241 +++++++++++++++++- 1 file changed, 236 insertions(+), 5 deletions(-) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 7ebe0f7..386365b 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -4,6 +4,11 @@ flex-direction: row; } +/* .breadcrumb */ +.breadcrumb .active a{ + color: #006D84 !important; +} + /* Main CSS */ .main { @@ -277,7 +282,7 @@ line-height: 24px; letter-spacing: 0em; text-align: left; - font-family: Calibri; + font-family: Calibri, sans-serif; font-size: 16px; font-weight: 400; line-height: 24px; @@ -289,21 +294,34 @@ .form-group { display: block; position: relative; - padding-left: 35px; - margin-bottom: 12px; + margin-bottom: 24px; cursor: pointer; font-size: 18px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; + width: 548px; + box-sizing: content-box; +} + +.form-label { + font-weight: 400; + font-size: 20px; + line-height: 24px; + font-family: Calibri , sans-serif; +} + +.form-group input[type="text"] { + border-radius: 3px; + height: 37px; } .checkbox label input { position: absolute; opacity: 0; cursor: pointer; - font-family: Calibri; + font-family: Calibri , sans-serif; font-size: 12px; font-weight: 100; line-height: 20px; @@ -328,7 +346,7 @@ .resource-form-buttons { /* there are four buttons in the resource form */ - /* the first button should be aligned left and other buttons should be aligned rigght*/ + /* the first button should be aligned left and other buttons should be aligned right*/ display: flex; justify-content: space-between; @@ -350,3 +368,216 @@ justify-content: right; margin-top: 20px; } + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 6px 16px; + height: 32px; + border-radius: 5px; + font-family: Calibri , sans-serif; + font-style: normal; + font-weight: 700; + font-size: 16px; + margin-left: 17px; + gap: 2px; +} + +.btn-primary { + background: #006D84; +} + +.btn-default { + background: #FFFFFF; + border: 2px solid #006D84; + color: #006D84; +} + +.btn-default:hover, .btn-default:focus { + border-color: #006D84; + background-color: #FAFAFA; + color: #006D84; +} + +.no-nav .col-md-9 { + width: 100%; +} + +.row { + background-color: transparent; +} + +/* Start Organizations Page */ +.row:has(form#organization-search-form) { + border: 2px solid #006D84; + border-radius: 5px; +} + +.row:has(form#organization-search-form)::before { + display: none; +} + +.row:has(form#organization-search-form) aside { + border-right: 1px solid #006D84; +} + +.row:has(form#organization-search-form) .module-heading { + background-color: transparent; + border-color: #006D84; + font-style: normal; + font-weight: 700; + font-size: 16px; + line-height: 20px; + padding: 12px; +} + +.row:has(form#organization-search-form) .module-heading i { + margin-right: 2px; +} + +.row:has(form#organization-search-form) .module-content p { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 17px; + padding: 12px 0px; +} + +form#organization-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#organization-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#organization-search-form input + .input-group-btn{ + display: none; +} + +form#organization-search-form + ul.media-grid{ + background-color: #E1E1E1; + border-radius: 5px; + padding: 24px; +} + +form#organization-search-form + ul.media-grid li { + border-radius: 5px; +} +/* End Organizations Page */ + +/* Start Single organization page */ +.row:has(header.module-content.page-header){ + border: 2px solid #006D84; + border-radius: 5px; + margin-bottom: 10px; +} + +.row:has(header.module-content.page-header) aside { + padding: 10px 0; + border-right: 2px solid #006D84; +} + +.row:has(header.module-content.page-header) aside h1{ + font-size: 24px; + font-weight: 700; +} + +.row:has(header.module-content.page-header) aside h1 + p{ + font-style: italic; + font-weight: 400; + font-size: 12px; + color: #4E4E4E; +} + +.row:has(header.module-content.page-header) aside dd span{ + font-weight: 700; + font-size: 40px; + line-height: 49px; + color: #3D3D3D; +} + +.row:has(header.module-content.page-header) aside .filters h2{ + font-weight: 700; + font-size: 14px; + line-height: 17px; + color: #000000; + border:none; + background-color: transparent; +} + +.row:has(header.module-content.page-header) aside .filters h2 i{ + display: none; +} + +.row:has(header.module-content.page-header) aside .filters h2 + p{ + padding-top: 0; + padding-bottom: 16px; +} + +.row:has(header.module-content.page-header) div.primary{ + padding: 10px 0; +} + +header.module-content.page-header, header.module-content.page-header .nav-tabs{ + border-bottom: none; +} + +.row:has(header.module-content.page-header) .nav-tabs li a{ + background: #D9D9D9; + color: #000; + border-radius: 5px 5px 0px 0px; + margin-right: 10px; + padding: 10px 24px; + font-family: Calibri,sans-serif; + font-style: normal; + font-size: 16px; +} + +.row:has(header.module-content.page-header) .nav-tabs li.active a{ + background: #006D84; + color: #fff; + font-weight: 700; +} + +.row:has(header.module-content.page-header) .nav-tabs li a i{ + color: #006D84; +} + +.row:has(header.module-content.page-header) .nav-tabs li.active a i{ + color: #fff; +} + +form#organization-datasets-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#organization-datasets-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#organization-datasets-search-form input + .input-group-btn{ + display: none; +} + +form#organization-datasets-search-form + ul.media-grid{ + background-color: #E1E1E1; + border-radius: 5px; + padding: 24px; +} + +form#organization-datasets-search-form + ul.media-grid li { + border-radius: 5px; +} \ No newline at end of file From 5cfb84e3d0b105dd6683f602c6962c6dbddc66e6 Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Tue, 16 Apr 2024 20:41:21 +0200 Subject: [PATCH 02/22] added some styles --- .../datasetapproval/assets/css/approval.css | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 386365b..459a0b8 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -497,6 +497,11 @@ form#organization-search-form + ul.media-grid li { color: #4E4E4E; } +.row:has(header.module-content.page-header) aside .nums{ + border-top: 1px solid #006D84; + border-bottom: 1px solid #006D84;; +} + .row:has(header.module-content.page-header) aside dd span{ font-weight: 700; font-size: 40px; @@ -580,4 +585,51 @@ form#organization-datasets-search-form + ul.media-grid{ form#organization-datasets-search-form + ul.media-grid li { border-radius: 5px; +} + +/* End Single organization Page */ + +/* Start Datasets Page */ +form#dataset-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#dataset-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#dataset-search-form input + .input-group-btn{ + display: none; +} +/* End Datasets Page */ + +/* Start Dataset List */ +.dataset-list li{ + padding: 14px 16px; + background-color: #E5E5E5; + border-radius: 5px; +} + +.dataset-list li h2{ + font-family: Calibri, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 24px; + line-height: 29px; + color: #000000; +} + + +.dataset-list li .empty{ + font-family: Calibri, sans-serif; + font-style: italic; + font-weight: 400; + font-size: 16px; + line-height: 20px; + color: #000000; } \ No newline at end of file From 98b626eabab32d1151a5f5215f58fa79b34227b3 Mon Sep 17 00:00:00 2001 From: gavram Date: Tue, 16 Apr 2024 10:30:24 +0200 Subject: [PATCH 03/22] Dataset schema corrected, not final version --- ckanext/datasetapproval/dataset_schema.yaml | 346 ++++++++++++++------ 1 file changed, 244 insertions(+), 102 deletions(-) diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml index 7223595..6a8c801 100644 --- a/ckanext/datasetapproval/dataset_schema.yaml +++ b/ckanext/datasetapproval/dataset_schema.yaml @@ -16,10 +16,6 @@ dataset_fields: preset: dataset_slug form_placeholder: eg. my-dataset -- field_name: org - label: Organization - preset: org_autocomplete - - field_name: tag_string label: Keywords preset: tag_string_autocomplete @@ -27,125 +23,275 @@ dataset_fields: - field_name: theme label: Theme - preset: multiple_select - form_snippet: multiple_select.html - display_snippet: multiple_text.html + form_snippet: multiple_select_sublists.html + display_snippet: multiple_choice_sublists_links.html validators: not_empty unicode_safe choices: - - value: addresses - label: Addresses - - value: administrative_units - label: Administrative units - - value: agricultural_and_aquaculture_facilities - label: Agricultural and aquaculture facilities - - value: area_management_restriction_regulation_zones_and_reporting_units - label: Area management/restriction/regulation zones and reporting units - - value: atmospheric_conditions - label: Atmospheric conditions - - value: bio_geographical_regions - label: Bio-geographical regions - - value: buildings - label: Buildings - - value: cadastral_parcels - label: Cadastral parcels - - value: coordinate_reference_systems - label: Coordinate reference systems - - value: elevation - label: Elevation - - value: energy_resources - label: Energy resources - - value: environmental_monitoring_facilities - label: Environmental monitoring facilities - - value: geographical_grid_systems - label: Geographical grid systems - - value: geographical_names - label: Geographical names - - value: geology - label: Geology - - value: habitats_and_biotopes - label: Habitats and biotopes - - value: human_health_and_safety - label: Human health and safety - - value: hydrography - label: Hydrography - - value: land_cover - label: Land cover - - value: land_use - label: Land use - - value: meteorological_geographical_features - label: Meteorological geographical features - - value: mineral_resources - label: Mineral resources - - value: natural_risk_zones - label: Natural risk zones - - value: oceanographic_geographical_features - label: Oceanographic geographical features - - value: orthoimagery - label: Orthoimagery - - value: population_distribution_demography - label: Population distribution — demography - - value: production_and_industrial_facilities - label: Production and industrial facilities - - value: protected_sites - label: Protected sites - - value: sea_regions - label: Sea regions - - value: soil - label: Soil - - value: species_distribution - label: Species distribution - - value: statistical_units - label: Statistical units - - value: transport_networks - label: Transport networks - - value: utility_and_governmental_services - label: Utility and governmental services + - value: gemet + label: GEMET + sub_items: + - value: addresses + label: Addresses + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ad + - value: administrative_units + label: Administrative units + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/au + - value: agricultural_and_aquaculture_facilities + label: Agricultural and aquaculture facilities + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/af + - value: area_management/restriction/regulation_zones_and_reporting_units + label: Area management/restriction/regulation zones and reporting units + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/am + - value: atmospheric_conditions + label: Atmospheric conditions + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ac + - value: bio-geographical_regions + label: Bio-geographical regions + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/br + - value: buildings + label: Buildings + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/bu + - value: cadastral_parcels + label: Cadastral parcels + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/cp + - value: coordinate_reference_systems + label: Coordinate reference systems + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/rs + - value: elevation + label: Elevation + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/el + - value: energy_resources + label: Energy resources + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/er + - value: environmental_monitoring_facilities + label: Environmental monitoring facilities + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ef + - value: geographical_grid_systems + label: Geographical grid systems + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/gg + - value: geographical_names + label: Geographical names + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/gn + - value: geology + label: Geology + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ge + - value: habitats_and_biotopes + label: Habitats and biotopes + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/hb + - value: human_health_and_safety + label: Human health and safety + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/hh + - value: hydrography + label: Hydrography + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/hy + - value: land_cover + label: Land cover + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/lc + - value: land_use + label: Land use + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/lu + - value: meteorological_geographical_features + label: Meteorological geographical features + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/mf + - value: mineral_resources + label: Mineral resources + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/mr + - value: natural_risk_zones + label: Natural risk zones + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/nz + - value: oceanographic_geographical_features + label: Oceanographic geographical features + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/of + - value: orthoimagery + label: Orthoimagery + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/oi + - value: "population_distribution_\xE2\u20AC\u201D_demography" + label: "Population distribution \xE2\u20AC\u201D demography" + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/pd + - value: production_and_industrial_facilities + label: Production and industrial facilities + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/pf + - value: protected_sites + label: Protected sites + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/ps + - value: sea_regions + label: Sea regions + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/sr + - value: soil + label: Soil + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/so + - value: species_distribution + label: Species distribution + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/sd + - value: statistical_units + label: Statistical units + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/su + - value: transport_networks + label: Transport networks + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/tn + - value: utility_and_governmental_services + label: Utility and governmental services + url: https://www.eionet.europa.eu/gemet/en/inspire-themes/us + + - value: cf_standard_names + label: CF standard names + sub_items: + - value: acoustic_area_backscattering_strength_in_sea_water + label: acoustic area backscattering strength in sea water + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_water + - value: acoustic_signal_roundtrip_travel_time_in_sea_water + label: acoustic signal roundtrip travel time in sea water + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_water + - value: acoustic_target_strength_in_sea_water + label: acoustic target strength in sea water + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_water + - value: acoustic_volume_backscattering_strength_in_sea_water + label: acoustic volume backscattering strength in sea water + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_water + - value: aerodynamic_particle_diameter + label: aerodynamic particle diameter + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameter + - value: aerodynamic_resistance + label: aerodynamic resistance + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistance + - value: aerosol_angstrom_exponent + label: "aerosol angstrom exponent\n DEPRECATED" + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistanceaerosol_angstrom_exponent + - value: aerosol_type_in_atmosphere_layer_in_air + label: aerosol type in atmosphere layer in air + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistanceaerosol_angstrom_exponentaerosol_type_in_atmosphere_layer_in_air + - value: age_of_sea_ice + label: age of sea ice + url: https://vocab.nerc.ac.uk/standard_name/acoustic_area_backscattering_strength_in_sea_wateracoustic_signal_roundtrip_travel_time_in_sea_wateracoustic_target_strength_in_sea_wateracoustic_volume_backscattering_strength_in_sea_wateraerodynamic_particle_diameteraerodynamic_resistanceaerosol_angstrom_exponentaerosol_type_in_atmosphere_layer_in_airage_of_sea_ice - field_name: subject label: Subject - preset: multiple_select + form_snippet: multiple_select.html + display_snippet: multiple_choice_links.html form_placeholder: The iso topic category, eg. https://inspire.ec.europa.eu/metadata-codelist/TopicCategory validators: not_empty unicode_safe choices: - value: farming label: farming + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=001 - value: biota label: biota + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=002 - value: boundaries label: boundaries + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=003 - value: climatologymeteorologyatmosphere label: climatologyMeteorologyAtmosphere + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=004 - value: economy label: economy + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=005 - value: elevation label: elevation + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=006 - value: environment label: environment + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=007 - value: geoscientificinformation label: geoscientificInformation + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=008 - value: health label: health + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=009 - value: imagerybasemapsearthcover label: imageryBaseMapsEarthCover + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=010 - value: intelligencemilitary label: intelligenceMilitary + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=011 - value: inlandwaters label: inlandWaters + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=012 - value: location label: location + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=013 - value: oceans label: oceans + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=014 - value: planningcadastre label: planningCadastre + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=015 - value: society label: society + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=016 - value: structure label: structure + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=017 - value: transportation label: transportation + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=018 - value: utilitiescommunication label: utilitiesCommunication + url: https://apps.usgs.gov/thesaurus/term-simple.php?thcode=15&code=019 + +- field_name: type + label: Type + form_snippet: null + display_snippet: text.html + +- field_name: contact_points + label: Contact points + repeating_label: Contact point + repeating_subfields: + - field_name: first_name + label: First name + - field_name: last_name + label: Last name + - field_name: organisation + label: Organisation + - field_name: email + label: Email + +- field_name: creators + label: Creators + repeating_label: Creator + repeating_subfields: + - field_name: first_name + label: First name + required: false + - field_name: last_name + label: Last name + required: false + - field_name: organisation + label: Organisation + required: false + - field_name: email + label: Email + required: false + +- field_name: contributors + label: Contributors + repeating_label: Contributor + repeating_subfields: + - field_name: first_name + label: First name + required: false + - field_name: last_name + label: Last name + required: false + - field_name: organisation + label: Organisation + required: false + - field_name: email + label: Email + required: false + +- field_name: publisher + label: Publisher + form_snippet: null + display_snippet: text.html + +- field_name: doi_id + label: DOI Identifier + form_snippet: null + display_snippet: text.html + validators: unicode_safe - field_name: notes label: Description @@ -159,19 +305,23 @@ dataset_fields: form_snippet: null display_snippet: text.html -- field_name: has_part - label: Has part - preset: multiple_text - validators: ignore_missing unicode_safe - form_snippet: multiple_text.html - display_snippet: multiple_text.html +# - field_name: has_part +# label: Has part +# preset: multiple_text +# validators: ignore_missing unicode_safe +# form_snippet: multiple_text.html +# display_snippet: multiple_text.html + +# - field_name: is_part_of +# label: Is part of +# preset: multiple_text +# validators: ignore_missing unicode_safe +# form_snippet: multiple_text.html +# display_snippet: multiple_text.html -- field_name: is_part_of - label: Is part of - preset: multiple_text - validators: ignore_missing unicode_safe - form_snippet: multiple_text.html - display_snippet: multiple_text.html +- field_name: releaseDate + label: Release date + display_snippet: date.html # - filed_name: has_version # label: Has Version @@ -183,19 +333,6 @@ dataset_fields: # form_snippet: null # display_snippet: text.html -- field_name: releaseDate - label: Release date - preset: date - required: true - validators: not_empty - form_placeholder: eg. 2024-01-15 - -- field_name: creators - label: Creators - preset: multiple_text - validators: ignore_missing unicode_safe - form_snippet: multiple_text.html - display_snippet: multiple_text.html - field_name: language label: Language @@ -318,6 +455,11 @@ dataset_fields: display_snippet: text.html form_snippet: null +- field_name: terms_agreed + label: Terms + form_snippet: null + display_snippet: null + validators: ignore_missing resource_fields: @@ -337,4 +479,4 @@ resource_fields: - field_name: format label: Format - preset: resource_format_autocomplete + preset: resource_format_autocomplete \ No newline at end of file From 02a9da8bcc1aa783e2d450dd8800c052e1379e98 Mon Sep 17 00:00:00 2001 From: gavram Date: Tue, 16 Apr 2024 10:31:24 +0200 Subject: [PATCH 04/22] Add support for multiple select sublists and hyperlinks rendering --- ckanext/datasetapproval/actions.py | 48 +++++++ .../datasetapproval/assets/css/approval.css | 125 +++++++++++++++++- .../assets/js/multiple-sublists.js | 30 +++++ ckanext/datasetapproval/assets/webassets.yml | 1 + ckanext/datasetapproval/plugin.py | 18 +++ .../multiple_choice_links.html | 18 +++ .../multiple_choice_sublists_links.html | 20 +++ .../multiple_select_sublists.html | 36 +++++ 8 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 ckanext/datasetapproval/assets/js/multiple-sublists.js create mode 100644 ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html create mode 100644 ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html create mode 100644 ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 96e6d68..16404bc 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -4,6 +4,8 @@ from ckan.plugins import toolkit as tk from ckanext.datasetapproval import mailer from ckan import logic +from ckanext.scheming.logic import scheming_dataset_schema_show +from ckan import model log = logging.getLogger() @@ -63,8 +65,52 @@ def _add_or_update_org(context, package_dict): return package_dict +def get_dataset_schema(): + context = { + 'model': model, + 'session': model.Session, + 'user': None, + 'ignore_auth': True + } + + data_dict = { + 'type': 'dataset', + 'expanded': True + } + + try: + schema_data = scheming_dataset_schema_show(context, data_dict) + return schema_data + except Exception as e: + print(f"Error retrieving dataset schema: {e}") + return None + +def clean_dictionary(data_dict): + schema = get_dataset_schema() + keys = [] + + for field_info in schema.get('dataset_fields', []): + if "repeating_subfields" in field_info.keys(): + keys.append(field_info['field_name']) + + cleaned_dict = dict(data_dict) + + for key in keys: + if key in cleaned_dict: + remove_key = True + for entry in cleaned_dict[key]: + for value in entry.values(): + if value != "": + remove_key = False + break + if remove_key: + del cleaned_dict[key] + + return cleaned_dict + @tk.chained_action def package_create(up_func, context, data_dict): + data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) @@ -73,6 +119,7 @@ def package_create(up_func, context, data_dict): @tk.chained_action def package_update(up_func, context, data_dict): + data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) @@ -81,6 +128,7 @@ def package_update(up_func, context, data_dict): @tk.chained_action def package_patch(up_func, context, data_dict): + data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 459a0b8..e491036 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -369,6 +369,67 @@ margin-top: 20px; } +/* Scheming multiple select with sublists */ +.multi-select ul, .multi-select ul .sub-items { + list-style: none; /* Removes list bullets */ + padding-left: 0; /* Removes list padding */ + margin-left: 0; /* Aligns with the multi-select container */ +} + +/* Main category title styles */ +/* Resets */ +.multi-select, +.multi-select ul, +.multi-select ul .sub-items { + list-style: none; /* Removes bullets */ + padding-left: 0; /* Removes indentation */ + margin: 0; /* Removes default margin */ + margin-left: 10px; /* Indents the main category labels */ +} + +/* Styles for the main category labels and toggle arrow */ +.multi-select > ul > li > label { + cursor: pointer; /* Indicates the element is clickable */ + vertical-align: middle; /* Aligns with the toggle arrow */ + font-weight: normal; /* No bold font */ +} + +.toggle-sublist { + cursor: pointer; /* Indicates it's clickable */ + user-select: none; /* Prevents text selection */ + margin-right: 5px; /* Spacing between arrow and label */ +} + +/* Styles for sub-items list */ +.multi-select .sub-items { + display: none; /* Hide by default */ + margin-top: 5px; /* Space between category label and sublist items */ + padding-left: 30px; /* Aligns sublist items with the main items */ +} + +/* Styles for sublist items (labels and checkboxes) */ +.sub-items li { + display: flex; + align-items: center; /* Center aligns items vertically */ + margin-bottom: 5px; /* Space between sublist items */ +} + +.sub-items li input[type="checkbox"] { + width: auto; /* Adjusts checkbox width */ + margin-right: 10px; /* Space between checkbox and label */ + margin-left: 20px; /* Indent checkbox to align with sublist items */ +} + +.sub-items li label { + font-weight: normal; /* No bold font */ + white-space: nowrap; /* Ensures label text does not wrap */ +} + +/* Remove the :after content on labels, if it exists */ +.sub-items li label::after { + content: none; +} + .btn { display: inline-flex; align-items: center; @@ -632,4 +693,66 @@ form#dataset-search-form input + .input-group-btn{ font-size: 16px; line-height: 20px; color: #000000; -} \ No newline at end of file +} + + +/* Scheming multiple select with sublists */ +.multi-select ul, .multi-select ul .sub-items { + list-style: none; /* Removes list bullets */ + padding-left: 0; /* Removes list padding */ + margin-left: 0; /* Aligns with the multi-select container */ +} + +/* Main category title styles */ +/* Resets */ +.multi-select, +.multi-select ul, +.multi-select ul .sub-items { + list-style: none; /* Removes bullets */ + padding-left: 0; /* Removes indentation */ + margin: 0; /* Removes default margin */ + margin-left: 10px; /* Indents the main category labels */ +} + +/* Styles for the main category labels and toggle arrow */ +.multi-select > ul > li > label { + cursor: pointer; /* Indicates the element is clickable */ + vertical-align: middle; /* Aligns with the toggle arrow */ + font-weight: normal; /* No bold font */ +} + +.toggle-sublist { + cursor: pointer; /* Indicates it's clickable */ + user-select: none; /* Prevents text selection */ + margin-right: 5px; /* Spacing between arrow and label */ +} + +/* Styles for sub-items list */ +.multi-select .sub-items { + display: none; /* Hide by default */ + margin-top: 5px; /* Space between category label and sublist items */ + padding-left: 30px; /* Aligns sublist items with the main items */ +} + +/* Styles for sublist items (labels and checkboxes) */ +.sub-items li { + display: flex; + align-items: center; /* Center aligns items vertically */ + margin-bottom: 5px; /* Space between sublist items */ +} + +.sub-items li input[type="checkbox"] { + width: auto; /* Adjusts checkbox width */ + margin-right: 10px; /* Space between checkbox and label */ + margin-left: 20px; /* Indent checkbox to align with sublist items */ +} + +.sub-items li label { + font-weight: normal; /* No bold font */ + white-space: nowrap; /* Ensures label text does not wrap */ +} + +/* Remove the :after content on labels, if it exists */ +.sub-items li label::after { + content: none; +} diff --git a/ckanext/datasetapproval/assets/js/multiple-sublists.js b/ckanext/datasetapproval/assets/js/multiple-sublists.js new file mode 100644 index 0000000..e3feb0b --- /dev/null +++ b/ckanext/datasetapproval/assets/js/multiple-sublists.js @@ -0,0 +1,30 @@ +document.addEventListener('DOMContentLoaded', function() { + // Handle parent checkbox change + document.querySelectorAll('.multi-select > ul > li > input[type="checkbox"]').forEach(function(parentCheckbox) { + parentCheckbox.addEventListener('change', function() { + var subItemsContainer = this.parentNode.querySelector('.sub-items'); + if (subItemsContainer) { + // Display sub-items if parent is checked + subItemsContainer.style.display = this.checked ? 'block' : 'none'; + // Deselect all sub-items if parent is deselected + if (!this.checked) { + subItemsContainer.querySelectorAll('input[type="checkbox"]').forEach(function(subCheckbox) { + subCheckbox.checked = false; + }); + } + } + }); + }); + + // Handle click on the toggle sublist arrows + document.querySelectorAll('.toggle-sublist').forEach(function(toggle) { + toggle.addEventListener('click', function() { + var sublist = this.parentNode.querySelector('.sub-items'); + var isExpanded = sublist.style.display === 'block'; + // Toggle the display of the sublist + sublist.style.display = isExpanded ? 'none' : 'block'; + // Change the direction of the arrow based on the state + this.textContent = isExpanded ? '►' : '▼'; + }); + }); +}); \ No newline at end of file diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml index 87f68bf..d0b79ca 100644 --- a/ckanext/datasetapproval/assets/webassets.yml +++ b/ckanext/datasetapproval/assets/webassets.yml @@ -5,6 +5,7 @@ datasetapproval_js: # - js/dataset-visibility.js # - js/form-submit.js - js/org-autocomplete.js + - js/multiple-sublists.js extra: preload: - base/main diff --git a/ckanext/datasetapproval/plugin.py b/ckanext/datasetapproval/plugin.py index 62dfede..ac73b93 100644 --- a/ckanext/datasetapproval/plugin.py +++ b/ckanext/datasetapproval/plugin.py @@ -1,5 +1,6 @@ # Standard library imports import logging +import json import ckan.plugins as plugins import ckan.plugins.toolkit as tk @@ -9,6 +10,7 @@ from ckan.lib.plugins import DefaultPermissionLabels from ckanext.datasetapproval import views +from ckanext.datasetapproval.actions import get_dataset_schema log = logging.getLogger(__name__) @@ -22,6 +24,22 @@ class DatasetapprovalPlugin( plugins.implements(plugins.IAuthFunctions) plugins.implements(plugins.ITemplateHelpers) plugins.implements(plugins.IPermissionLabels, inherit=True) + plugins.implements(plugins.IPackageController, inherit=True) + + # IPackageController + def before_dataset_index(self, data_dict): + schema = get_dataset_schema() + field_names = [] + + for field_info in schema.get('dataset_fields', []): + if "repeating_subfields" in field_info.keys(): + field_names.append(field_info['field_name']) + + for field_name in field_names: + if field_name in data_dict and data_dict[field_name] is not None: + data_dict[field_name] = json.dumps(data_dict[field_name]) + + return data_dict # IConfigurer def update_config(self, config_): diff --git a/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html new file mode 100644 index 0000000..3c8fb35 --- /dev/null +++ b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_links.html @@ -0,0 +1,18 @@ +{%- set values = data[field.field_name] -%} +{%- set choices_list = [] -%} + +{%- for choice in h.scheming_field_choices(field) -%} + {%- if choice.value in values -%} + {%- do choices_list.append({'label':h.scheming_language_text(choice.label), 'url':h.scheming_language_text(choice.url)}) -%} + {%- endif -%} +{%- endfor -%} + +{%- if choices_list|length == 1 -%} + {{ choices_list[0]['label'] }} +{%- else -%} + +{%- endif -%} diff --git a/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html new file mode 100644 index 0000000..fe37001 --- /dev/null +++ b/ckanext/datasetapproval/templates/scheming/display_snippets/multiple_choice_sublists_links.html @@ -0,0 +1,20 @@ +{%- set values = data[field.field_name] -%} +{%- set choices_list = [] -%} + +{%- for choice in h.scheming_field_choices(field) -%} + {% for sub_item in choice.sub_items %} + {%- if sub_item.value in values -%} + {%- do choices_list.append({'label':h.scheming_language_text(sub_item.label), 'url':h.scheming_language_text(sub_item.url)}) -%} + {%- endif -%} + {%- endfor -%} +{%- endfor -%} + +{%- if choices_list|length == 1 -%} + {{ choices_list[0]['label'] }} +{%- else -%} + +{%- endif -%} diff --git a/ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html b/ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html new file mode 100644 index 0000000..b9828bd --- /dev/null +++ b/ckanext/datasetapproval/templates/scheming/form_snippets/multiple_select_sublists.html @@ -0,0 +1,36 @@ +{% import 'macros/form.html' as form %} + +{% macro help_text() %} + {%- snippet 'scheming/form_snippets/help_text.html', field=field -%} +{% endmacro %} + +{%- call form.input_block( + "field-" + field.field_name, + label=h.scheming_language_text(field.label), + classes=field.classes if 'classes' in field else ['control-full'], + error=errors[field.field_name], + is_required=h.scheming_field_required(field), + extra_html=help_text() + ) -%} +
+
    + {% for choice in h.scheming_field_choices(field) -%} +
  • + + {{ h.scheming_language_text(choice.label) }} + {%- if choice.sub_items -%} +
      + {%- for sub_item in choice.sub_items -%} +
    • + + +
    • + {%- endfor -%} +
    + {%- endif -%} +
  • + {% endfor %} +
+
+{%- endcall -%} \ No newline at end of file From 3b995138a9351c27708507eb19cca190617e10cb Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Tue, 16 Apr 2024 15:40:02 +0200 Subject: [PATCH 05/22] modified orgs pages --- .../datasetapproval/assets/css/approval.css | 545 ++++++++++++++++++ 1 file changed, 545 insertions(+) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index e491036..ff230e5 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -9,6 +9,11 @@ color: #006D84 !important; } +/* .breadcrumb */ +.breadcrumb .active a{ + color: #006D84 !important; +} + /* Main CSS */ .main { @@ -756,3 +761,543 @@ form#dataset-search-form input + .input-group-btn{ .sub-items li label::after { content: none; } + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 6px 16px; + height: 32px; + border-radius: 5px; + font-family: Calibri , sans-serif; + font-style: normal; + font-weight: 700; + font-size: 16px; + margin-left: 17px; + gap: 2px; +} + +.btn-primary { + background: #006D84; +} + +.btn-default { + background: #FFFFFF; + border: 2px solid #006D84; + color: #006D84; +} + +.btn-default:hover, .btn-default:focus { + border-color: #006D84; + background-color: #FAFAFA; + color: #006D84; +} + +.no-nav .col-md-9 { + width: 100%; +} + +.row { + background-color: transparent; +} + +/* Start Organizations Page */ +.row:has(form#organization-search-form) { + border: 2px solid #006D84; + border-radius: 5px; +} + +.row:has(form#organization-search-form)::before { + display: none; +} + +.row:has(form#organization-search-form) aside { + border-right: 1px solid #006D84; +} + +.row:has(form#organization-search-form) .module-heading { + background-color: transparent; + border-color: #006D84; + font-style: normal; + font-weight: 700; + font-size: 16px; + line-height: 20px; + padding: 12px; +} + +.row:has(form#organization-search-form) .module-heading i { + margin-right: 2px; +} + +.row:has(form#organization-search-form) .module-content p { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 17px; + padding: 12px 0px; +} + +form#organization-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#organization-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#organization-search-form input + .input-group-btn{ + display: none; +} + +form#organization-search-form + ul.media-grid{ + background-color: #E1E1E1; + border-radius: 5px; + padding: 24px; +} + +form#organization-search-form + ul.media-grid li { + border-radius: 5px; +} +/* End Organizations Page */ + +/* Start Single organization page */ +.row:has(header.module-content.page-header){ + border: 2px solid #006D84; + border-radius: 5px; + margin-bottom: 10px; +} + +.row:has(header.module-content.page-header) aside { + padding: 10px 0; + border-right: 2px solid #006D84; +} + +.row:has(header.module-content.page-header) aside h1{ + font-size: 24px; + font-weight: 700; +} + +.row:has(header.module-content.page-header) aside h1 + p{ + font-style: italic; + font-weight: 400; + font-size: 12px; + color: #4E4E4E; +} + +.row:has(header.module-content.page-header) aside .nums{ + border-top: 1px solid #006D84; + border-bottom: 1px solid #006D84;; +} + +.row:has(header.module-content.page-header) aside dd span{ + font-weight: 700; + font-size: 40px; + line-height: 49px; + color: #3D3D3D; +} + +.row:has(header.module-content.page-header) aside .filters h2{ + font-weight: 700; + font-size: 14px; + line-height: 17px; + color: #000000; + border:none; + background-color: transparent; +} + +.row:has(header.module-content.page-header) aside .filters h2 i{ + display: none; +} + +.row:has(header.module-content.page-header) aside .filters h2 + p{ + padding-top: 0; + padding-bottom: 16px; +} + +.row:has(header.module-content.page-header) div.primary{ + padding: 10px 0; +} + +header.module-content.page-header, header.module-content.page-header .nav-tabs{ + border-bottom: none; +} + +.row:has(header.module-content.page-header) .nav-tabs li a{ + background: #D9D9D9; + color: #000; + border-radius: 5px 5px 0px 0px; + margin-right: 10px; + padding: 10px 24px; + font-family: Calibri,sans-serif; + font-style: normal; + font-size: 16px; +} + +.row:has(header.module-content.page-header) .nav-tabs li.active a{ + background: #006D84; + color: #fff; + font-weight: 700; +} + +.row:has(header.module-content.page-header) .nav-tabs li a i{ + color: #006D84; +} + +.row:has(header.module-content.page-header) .nav-tabs li.active a i{ + color: #fff; +} + +form#organization-datasets-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#organization-datasets-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#organization-datasets-search-form input + .input-group-btn{ + display: none; +} + +form#organization-datasets-search-form + ul.media-grid{ + background-color: #E1E1E1; + border-radius: 5px; + padding: 24px; +} + +form#organization-datasets-search-form + ul.media-grid li { + border-radius: 5px; +} + +/* End Single organization Page */ + +/* Start Datasets Page */ +form#dataset-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#dataset-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#dataset-search-form input + .input-group-btn{ + display: none; +} +/* End Datasets Page */ + +/* Start Dataset List */ +.dataset-list li{ + padding: 14px 16px; + background-color: #E5E5E5; + border-radius: 5px; +} + +.dataset-list li h2{ + font-family: Calibri, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 24px; + line-height: 29px; + color: #000000; +} + + +.dataset-list li .empty{ + font-family: Calibri, sans-serif; + font-style: italic; + font-weight: 400; + font-size: 16px; + line-height: 20px; + color: #000000; +} + + +/* Scheming multiple select with sublists */ +.multi-select ul, .multi-select ul .sub-items { + list-style: none; /* Removes list bullets */ + padding-left: 0; /* Removes list padding */ + margin-left: 0; /* Aligns with the multi-select container */ +} + +/* Main category title styles */ +/* Resets */ +.multi-select, +.multi-select ul, +.multi-select ul .sub-items { + list-style: none; /* Removes bullets */ + padding-left: 0; /* Removes indentation */ + margin: 0; /* Removes default margin */ + margin-left: 10px; /* Indents the main category labels */ +} + +/* Styles for the main category labels and toggle arrow */ +.multi-select > ul > li > label { + cursor: pointer; /* Indicates the element is clickable */ + vertical-align: middle; /* Aligns with the toggle arrow */ + font-weight: normal; /* No bold font */ +} + +.toggle-sublist { + cursor: pointer; /* Indicates it's clickable */ + user-select: none; /* Prevents text selection */ + margin-right: 5px; /* Spacing between arrow and label */ +} + +/* Styles for sub-items list */ +.multi-select .sub-items { + display: none; /* Hide by default */ + margin-top: 5px; /* Space between category label and sublist items */ + padding-left: 30px; /* Aligns sublist items with the main items */ +} + +/* Styles for sublist items (labels and checkboxes) */ +.sub-items li { + display: flex; + align-items: center; /* Center aligns items vertically */ + margin-bottom: 5px; /* Space between sublist items */ +} + +.sub-items li input[type="checkbox"] { + width: auto; /* Adjusts checkbox width */ + margin-right: 10px; /* Space between checkbox and label */ + margin-left: 20px; /* Indent checkbox to align with sublist items */ +} + +.sub-items li label { + font-weight: normal; /* No bold font */ + white-space: nowrap; /* Ensures label text does not wrap */ +} + +/* Remove the :after content on labels, if it exists */ +.sub-items li label::after { + content: none; +} + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 6px 16px; + height: 32px; + border-radius: 5px; + font-family: Calibri , sans-serif; + font-style: normal; + font-weight: 700; + font-size: 16px; + margin-left: 17px; + gap: 2px; +} + +.btn-primary { + background: #006D84; +} + +.btn-default { + background: #FFFFFF; + border: 2px solid #006D84; + color: #006D84; +} + +.btn-default:hover, .btn-default:focus { + border-color: #006D84; + background-color: #FAFAFA; + color: #006D84; +} + +.no-nav .col-md-9 { + width: 100%; +} + +.row { + background-color: transparent; +} + +/* Start Organizations Page */ +.row:has(form#organization-search-form) { + border: 2px solid #006D84; + border-radius: 5px; +} + +.row:has(form#organization-search-form)::before { + display: none; +} + +.row:has(form#organization-search-form) aside { + border-right: 1px solid #006D84; +} + +.row:has(form#organization-search-form) .module-heading { + background-color: transparent; + border-color: #006D84; + font-style: normal; + font-weight: 700; + font-size: 16px; + line-height: 20px; + padding: 12px; +} + +.row:has(form#organization-search-form) .module-heading i { + margin-right: 2px; +} + +.row:has(form#organization-search-form) .module-content p { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 17px; + padding: 12px 0px; +} + +form#organization-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#organization-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#organization-search-form input + .input-group-btn{ + display: none; +} + +form#organization-search-form + ul.media-grid{ + background-color: #E1E1E1; + border-radius: 5px; + padding: 24px; +} + +form#organization-search-form + ul.media-grid li { + border-radius: 5px; +} +/* End Organizations Page */ + +/* Start Single organization page */ +.row:has(header.module-content.page-header){ + border: 2px solid #006D84; + border-radius: 5px; + margin-bottom: 10px; +} + +.row:has(header.module-content.page-header) aside { + padding: 10px 0; + border-right: 2px solid #006D84; +} + +.row:has(header.module-content.page-header) aside h1{ + font-size: 24px; + font-weight: 700; +} + +.row:has(header.module-content.page-header) aside h1 + p{ + font-style: italic; + font-weight: 400; + font-size: 12px; + color: #4E4E4E; +} + +.row:has(header.module-content.page-header) aside dd span{ + font-weight: 700; + font-size: 40px; + line-height: 49px; + color: #3D3D3D; +} + +.row:has(header.module-content.page-header) aside .filters h2{ + font-weight: 700; + font-size: 14px; + line-height: 17px; + color: #000000; + border:none; + background-color: transparent; +} + +.row:has(header.module-content.page-header) aside .filters h2 i{ + display: none; +} + +.row:has(header.module-content.page-header) aside .filters h2 + p{ + padding-top: 0; + padding-bottom: 16px; +} + +.row:has(header.module-content.page-header) div.primary{ + padding: 10px 0; +} + +header.module-content.page-header, header.module-content.page-header .nav-tabs{ + border-bottom: none; +} + +.row:has(header.module-content.page-header) .nav-tabs li a{ + background: #D9D9D9; + color: #000; + border-radius: 5px 5px 0px 0px; + margin-right: 10px; + padding: 10px 24px; + font-family: Calibri,sans-serif; + font-style: normal; + font-size: 16px; +} + +.row:has(header.module-content.page-header) .nav-tabs li.active a{ + background: #006D84; + color: #fff; + font-weight: 700; +} + +.row:has(header.module-content.page-header) .nav-tabs li a i{ + color: #006D84; +} + +.row:has(header.module-content.page-header) .nav-tabs li.active a i{ + color: #fff; +} + +form#organization-datasets-search-form select{ + border: none; + background-color: transparent; + box-shadow: none; +} + +form#organization-datasets-search-form input { + border: 2px solid #006D84; + border-radius: 10px; + box-sizing: border-box; + padding: 10px 26px; +} + +form#organization-datasets-search-form input + .input-group-btn{ + display: none; +} + +form#organization-datasets-search-form + ul.media-grid{ + background-color: #E1E1E1; + border-radius: 5px; + padding: 24px; +} + +form#organization-datasets-search-form + ul.media-grid li { + border-radius: 5px; +} \ No newline at end of file From ee40ef3f311d8180c8445eb825c44eaad5e64f99 Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Wed, 17 Apr 2024 09:33:22 +0200 Subject: [PATCH 06/22] remove unwanted css --- .../datasetapproval/assets/css/approval.css | 649 +----------------- 1 file changed, 1 insertion(+), 648 deletions(-) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index ff230e5..9aa6dbb 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -653,651 +653,4 @@ form#organization-datasets-search-form + ul.media-grid li { border-radius: 5px; } -/* End Single organization Page */ - -/* Start Datasets Page */ -form#dataset-search-form select{ - border: none; - background-color: transparent; - box-shadow: none; -} - -form#dataset-search-form input { - border: 2px solid #006D84; - border-radius: 10px; - box-sizing: border-box; - padding: 10px 26px; -} - -form#dataset-search-form input + .input-group-btn{ - display: none; -} -/* End Datasets Page */ - -/* Start Dataset List */ -.dataset-list li{ - padding: 14px 16px; - background-color: #E5E5E5; - border-radius: 5px; -} - -.dataset-list li h2{ - font-family: Calibri, sans-serif; - font-style: normal; - font-weight: 700; - font-size: 24px; - line-height: 29px; - color: #000000; -} - - -.dataset-list li .empty{ - font-family: Calibri, sans-serif; - font-style: italic; - font-weight: 400; - font-size: 16px; - line-height: 20px; - color: #000000; -} - - -/* Scheming multiple select with sublists */ -.multi-select ul, .multi-select ul .sub-items { - list-style: none; /* Removes list bullets */ - padding-left: 0; /* Removes list padding */ - margin-left: 0; /* Aligns with the multi-select container */ -} - -/* Main category title styles */ -/* Resets */ -.multi-select, -.multi-select ul, -.multi-select ul .sub-items { - list-style: none; /* Removes bullets */ - padding-left: 0; /* Removes indentation */ - margin: 0; /* Removes default margin */ - margin-left: 10px; /* Indents the main category labels */ -} - -/* Styles for the main category labels and toggle arrow */ -.multi-select > ul > li > label { - cursor: pointer; /* Indicates the element is clickable */ - vertical-align: middle; /* Aligns with the toggle arrow */ - font-weight: normal; /* No bold font */ -} - -.toggle-sublist { - cursor: pointer; /* Indicates it's clickable */ - user-select: none; /* Prevents text selection */ - margin-right: 5px; /* Spacing between arrow and label */ -} - -/* Styles for sub-items list */ -.multi-select .sub-items { - display: none; /* Hide by default */ - margin-top: 5px; /* Space between category label and sublist items */ - padding-left: 30px; /* Aligns sublist items with the main items */ -} - -/* Styles for sublist items (labels and checkboxes) */ -.sub-items li { - display: flex; - align-items: center; /* Center aligns items vertically */ - margin-bottom: 5px; /* Space between sublist items */ -} - -.sub-items li input[type="checkbox"] { - width: auto; /* Adjusts checkbox width */ - margin-right: 10px; /* Space between checkbox and label */ - margin-left: 20px; /* Indent checkbox to align with sublist items */ -} - -.sub-items li label { - font-weight: normal; /* No bold font */ - white-space: nowrap; /* Ensures label text does not wrap */ -} - -/* Remove the :after content on labels, if it exists */ -.sub-items li label::after { - content: none; -} - -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - padding: 6px 16px; - height: 32px; - border-radius: 5px; - font-family: Calibri , sans-serif; - font-style: normal; - font-weight: 700; - font-size: 16px; - margin-left: 17px; - gap: 2px; -} - -.btn-primary { - background: #006D84; -} - -.btn-default { - background: #FFFFFF; - border: 2px solid #006D84; - color: #006D84; -} - -.btn-default:hover, .btn-default:focus { - border-color: #006D84; - background-color: #FAFAFA; - color: #006D84; -} - -.no-nav .col-md-9 { - width: 100%; -} - -.row { - background-color: transparent; -} - -/* Start Organizations Page */ -.row:has(form#organization-search-form) { - border: 2px solid #006D84; - border-radius: 5px; -} - -.row:has(form#organization-search-form)::before { - display: none; -} - -.row:has(form#organization-search-form) aside { - border-right: 1px solid #006D84; -} - -.row:has(form#organization-search-form) .module-heading { - background-color: transparent; - border-color: #006D84; - font-style: normal; - font-weight: 700; - font-size: 16px; - line-height: 20px; - padding: 12px; -} - -.row:has(form#organization-search-form) .module-heading i { - margin-right: 2px; -} - -.row:has(form#organization-search-form) .module-content p { - font-style: normal; - font-weight: 400; - font-size: 14px; - line-height: 17px; - padding: 12px 0px; -} - -form#organization-search-form select{ - border: none; - background-color: transparent; - box-shadow: none; -} - -form#organization-search-form input { - border: 2px solid #006D84; - border-radius: 10px; - box-sizing: border-box; - padding: 10px 26px; -} - -form#organization-search-form input + .input-group-btn{ - display: none; -} - -form#organization-search-form + ul.media-grid{ - background-color: #E1E1E1; - border-radius: 5px; - padding: 24px; -} - -form#organization-search-form + ul.media-grid li { - border-radius: 5px; -} -/* End Organizations Page */ - -/* Start Single organization page */ -.row:has(header.module-content.page-header){ - border: 2px solid #006D84; - border-radius: 5px; - margin-bottom: 10px; -} - -.row:has(header.module-content.page-header) aside { - padding: 10px 0; - border-right: 2px solid #006D84; -} - -.row:has(header.module-content.page-header) aside h1{ - font-size: 24px; - font-weight: 700; -} - -.row:has(header.module-content.page-header) aside h1 + p{ - font-style: italic; - font-weight: 400; - font-size: 12px; - color: #4E4E4E; -} - -.row:has(header.module-content.page-header) aside .nums{ - border-top: 1px solid #006D84; - border-bottom: 1px solid #006D84;; -} - -.row:has(header.module-content.page-header) aside dd span{ - font-weight: 700; - font-size: 40px; - line-height: 49px; - color: #3D3D3D; -} - -.row:has(header.module-content.page-header) aside .filters h2{ - font-weight: 700; - font-size: 14px; - line-height: 17px; - color: #000000; - border:none; - background-color: transparent; -} - -.row:has(header.module-content.page-header) aside .filters h2 i{ - display: none; -} - -.row:has(header.module-content.page-header) aside .filters h2 + p{ - padding-top: 0; - padding-bottom: 16px; -} - -.row:has(header.module-content.page-header) div.primary{ - padding: 10px 0; -} - -header.module-content.page-header, header.module-content.page-header .nav-tabs{ - border-bottom: none; -} - -.row:has(header.module-content.page-header) .nav-tabs li a{ - background: #D9D9D9; - color: #000; - border-radius: 5px 5px 0px 0px; - margin-right: 10px; - padding: 10px 24px; - font-family: Calibri,sans-serif; - font-style: normal; - font-size: 16px; -} - -.row:has(header.module-content.page-header) .nav-tabs li.active a{ - background: #006D84; - color: #fff; - font-weight: 700; -} - -.row:has(header.module-content.page-header) .nav-tabs li a i{ - color: #006D84; -} - -.row:has(header.module-content.page-header) .nav-tabs li.active a i{ - color: #fff; -} - -form#organization-datasets-search-form select{ - border: none; - background-color: transparent; - box-shadow: none; -} - -form#organization-datasets-search-form input { - border: 2px solid #006D84; - border-radius: 10px; - box-sizing: border-box; - padding: 10px 26px; -} - -form#organization-datasets-search-form input + .input-group-btn{ - display: none; -} - -form#organization-datasets-search-form + ul.media-grid{ - background-color: #E1E1E1; - border-radius: 5px; - padding: 24px; -} - -form#organization-datasets-search-form + ul.media-grid li { - border-radius: 5px; -} - -/* End Single organization Page */ - -/* Start Datasets Page */ -form#dataset-search-form select{ - border: none; - background-color: transparent; - box-shadow: none; -} - -form#dataset-search-form input { - border: 2px solid #006D84; - border-radius: 10px; - box-sizing: border-box; - padding: 10px 26px; -} - -form#dataset-search-form input + .input-group-btn{ - display: none; -} -/* End Datasets Page */ - -/* Start Dataset List */ -.dataset-list li{ - padding: 14px 16px; - background-color: #E5E5E5; - border-radius: 5px; -} - -.dataset-list li h2{ - font-family: Calibri, sans-serif; - font-style: normal; - font-weight: 700; - font-size: 24px; - line-height: 29px; - color: #000000; -} - - -.dataset-list li .empty{ - font-family: Calibri, sans-serif; - font-style: italic; - font-weight: 400; - font-size: 16px; - line-height: 20px; - color: #000000; -} - - -/* Scheming multiple select with sublists */ -.multi-select ul, .multi-select ul .sub-items { - list-style: none; /* Removes list bullets */ - padding-left: 0; /* Removes list padding */ - margin-left: 0; /* Aligns with the multi-select container */ -} - -/* Main category title styles */ -/* Resets */ -.multi-select, -.multi-select ul, -.multi-select ul .sub-items { - list-style: none; /* Removes bullets */ - padding-left: 0; /* Removes indentation */ - margin: 0; /* Removes default margin */ - margin-left: 10px; /* Indents the main category labels */ -} - -/* Styles for the main category labels and toggle arrow */ -.multi-select > ul > li > label { - cursor: pointer; /* Indicates the element is clickable */ - vertical-align: middle; /* Aligns with the toggle arrow */ - font-weight: normal; /* No bold font */ -} - -.toggle-sublist { - cursor: pointer; /* Indicates it's clickable */ - user-select: none; /* Prevents text selection */ - margin-right: 5px; /* Spacing between arrow and label */ -} - -/* Styles for sub-items list */ -.multi-select .sub-items { - display: none; /* Hide by default */ - margin-top: 5px; /* Space between category label and sublist items */ - padding-left: 30px; /* Aligns sublist items with the main items */ -} - -/* Styles for sublist items (labels and checkboxes) */ -.sub-items li { - display: flex; - align-items: center; /* Center aligns items vertically */ - margin-bottom: 5px; /* Space between sublist items */ -} - -.sub-items li input[type="checkbox"] { - width: auto; /* Adjusts checkbox width */ - margin-right: 10px; /* Space between checkbox and label */ - margin-left: 20px; /* Indent checkbox to align with sublist items */ -} - -.sub-items li label { - font-weight: normal; /* No bold font */ - white-space: nowrap; /* Ensures label text does not wrap */ -} - -/* Remove the :after content on labels, if it exists */ -.sub-items li label::after { - content: none; -} - -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - padding: 6px 16px; - height: 32px; - border-radius: 5px; - font-family: Calibri , sans-serif; - font-style: normal; - font-weight: 700; - font-size: 16px; - margin-left: 17px; - gap: 2px; -} - -.btn-primary { - background: #006D84; -} - -.btn-default { - background: #FFFFFF; - border: 2px solid #006D84; - color: #006D84; -} - -.btn-default:hover, .btn-default:focus { - border-color: #006D84; - background-color: #FAFAFA; - color: #006D84; -} - -.no-nav .col-md-9 { - width: 100%; -} - -.row { - background-color: transparent; -} - -/* Start Organizations Page */ -.row:has(form#organization-search-form) { - border: 2px solid #006D84; - border-radius: 5px; -} - -.row:has(form#organization-search-form)::before { - display: none; -} - -.row:has(form#organization-search-form) aside { - border-right: 1px solid #006D84; -} - -.row:has(form#organization-search-form) .module-heading { - background-color: transparent; - border-color: #006D84; - font-style: normal; - font-weight: 700; - font-size: 16px; - line-height: 20px; - padding: 12px; -} - -.row:has(form#organization-search-form) .module-heading i { - margin-right: 2px; -} - -.row:has(form#organization-search-form) .module-content p { - font-style: normal; - font-weight: 400; - font-size: 14px; - line-height: 17px; - padding: 12px 0px; -} - -form#organization-search-form select{ - border: none; - background-color: transparent; - box-shadow: none; -} - -form#organization-search-form input { - border: 2px solid #006D84; - border-radius: 10px; - box-sizing: border-box; - padding: 10px 26px; -} - -form#organization-search-form input + .input-group-btn{ - display: none; -} - -form#organization-search-form + ul.media-grid{ - background-color: #E1E1E1; - border-radius: 5px; - padding: 24px; -} - -form#organization-search-form + ul.media-grid li { - border-radius: 5px; -} -/* End Organizations Page */ - -/* Start Single organization page */ -.row:has(header.module-content.page-header){ - border: 2px solid #006D84; - border-radius: 5px; - margin-bottom: 10px; -} - -.row:has(header.module-content.page-header) aside { - padding: 10px 0; - border-right: 2px solid #006D84; -} - -.row:has(header.module-content.page-header) aside h1{ - font-size: 24px; - font-weight: 700; -} - -.row:has(header.module-content.page-header) aside h1 + p{ - font-style: italic; - font-weight: 400; - font-size: 12px; - color: #4E4E4E; -} - -.row:has(header.module-content.page-header) aside dd span{ - font-weight: 700; - font-size: 40px; - line-height: 49px; - color: #3D3D3D; -} - -.row:has(header.module-content.page-header) aside .filters h2{ - font-weight: 700; - font-size: 14px; - line-height: 17px; - color: #000000; - border:none; - background-color: transparent; -} - -.row:has(header.module-content.page-header) aside .filters h2 i{ - display: none; -} - -.row:has(header.module-content.page-header) aside .filters h2 + p{ - padding-top: 0; - padding-bottom: 16px; -} - -.row:has(header.module-content.page-header) div.primary{ - padding: 10px 0; -} - -header.module-content.page-header, header.module-content.page-header .nav-tabs{ - border-bottom: none; -} - -.row:has(header.module-content.page-header) .nav-tabs li a{ - background: #D9D9D9; - color: #000; - border-radius: 5px 5px 0px 0px; - margin-right: 10px; - padding: 10px 24px; - font-family: Calibri,sans-serif; - font-style: normal; - font-size: 16px; -} - -.row:has(header.module-content.page-header) .nav-tabs li.active a{ - background: #006D84; - color: #fff; - font-weight: 700; -} - -.row:has(header.module-content.page-header) .nav-tabs li a i{ - color: #006D84; -} - -.row:has(header.module-content.page-header) .nav-tabs li.active a i{ - color: #fff; -} - -form#organization-datasets-search-form select{ - border: none; - background-color: transparent; - box-shadow: none; -} - -form#organization-datasets-search-form input { - border: 2px solid #006D84; - border-radius: 10px; - box-sizing: border-box; - padding: 10px 26px; -} - -form#organization-datasets-search-form input + .input-group-btn{ - display: none; -} - -form#organization-datasets-search-form + ul.media-grid{ - background-color: #E1E1E1; - border-radius: 5px; - padding: 24px; -} - -form#organization-datasets-search-form + ul.media-grid li { - border-radius: 5px; -} \ No newline at end of file +/* End Single organization Page */ \ No newline at end of file From 2a90f00cba9050554930672981b277bf5106eba7 Mon Sep 17 00:00:00 2001 From: Sagar Ghimire Date: Mon, 8 Apr 2024 12:18:56 +0545 Subject: [PATCH 07/22] [Improve][s]: User shoudn't be able edit dataset that are already submitted for review --- ckanext/datasetapproval/actions.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 16404bc..a3a88f0 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -29,9 +29,16 @@ def is_user_admin_of_org(org_id, user_id): def publishing_check(context, data_dict): - if context.get("allow_publish") or data_dict.get("state") == "inreview": - return data_dict - data_dict["state"] = "draft" + user_id = ( + tk.current_user.id + if tk.current_user and not tk.current_user.is_anonymous + else None + ) + org_id = data_dict.get("owner_org") + is_active = data_dict.get("state") in ["active", "publish", None, False] + if (is_user_is_editor(org_id, user_id) or is_unowned_dataset(org_id)) and is_active: + mailer.mail_package_review_request_to_admins(context, data_dict) + data_dict["state"] = "inreview" return data_dict def _add_or_update_org(context, package_dict): From be320d6943f4226493fce0c57ae4022bdeb290d9 Mon Sep 17 00:00:00 2001 From: Sagar Ghimire Date: Mon, 8 Apr 2024 14:19:11 +0545 Subject: [PATCH 08/22] [Fix][xs]: When sysadmin update dataset don't change the state of inreview --- ckanext/datasetapproval/actions.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index a3a88f0..73a5ea2 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -36,9 +36,24 @@ def publishing_check(context, data_dict): ) org_id = data_dict.get("owner_org") is_active = data_dict.get("state") in ["active", "publish", None, False] - if (is_user_is_editor(org_id, user_id) or is_unowned_dataset(org_id)) and is_active: + + is_user_editor = is_user_editor_of_org(org_id, user_id) + is_user_admin = is_user_admin_of_org(org_id, user_id) + is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin + + if (is_user_editor or is_unowned_dataset(org_id)) and is_active: mailer.mail_package_review_request_to_admins(context, data_dict) data_dict["state"] = "inreview" + + # if sysadmin is updating the dataset and it's already in review state + # then it should remain in review state + if data_dict.get("id"): + old_data_dict = tk.get_action("package_show")( + context, {"id": data_dict.get("id")} + ) + if (is_user_admin or is_sysadmin) and old_data_dict.get("state") == "inreview": + data_dict["state"] = old_data_dict.get("state") + return data_dict def _add_or_update_org(context, package_dict): From 68d156ea2093ef15dd16eddb903a7453c165b569 Mon Sep 17 00:00:00 2001 From: Sagar Ghimire Date: Mon, 8 Apr 2024 18:39:03 +0545 Subject: [PATCH 09/22] [Fix][xs]: Cannot approve and reject bug fix --- ckanext/datasetapproval/actions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 73a5ea2..21ba6e7 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -47,13 +47,13 @@ def publishing_check(context, data_dict): # if sysadmin is updating the dataset and it's already in review state # then it should remain in review state - if data_dict.get("id"): + _action_review = context.get("_action_review", False) + if not _action_review and data_dict.get("id"): old_data_dict = tk.get_action("package_show")( context, {"id": data_dict.get("id")} ) if (is_user_admin or is_sysadmin) and old_data_dict.get("state") == "inreview": data_dict["state"] = old_data_dict.get("state") - return data_dict def _add_or_update_org(context, package_dict): @@ -197,7 +197,7 @@ def dataset_review(context, data_dict): tk.get_action("package_patch")( { **context, - "allow_publish": True, + "_action_review": True, }, {"id": id, "state": states[action]}, ) From 726dcfaff6bf741643f42b5c3d1b3ff0dbf4759e Mon Sep 17 00:00:00 2001 From: Sagar Ghimire Date: Thu, 11 Apr 2024 16:26:16 +0545 Subject: [PATCH 10/22] [Fix][xs]: Dataset publish step --- ckanext/datasetapproval/actions.py | 42 +++++-------------- ckanext/datasetapproval/dataset_schema.yaml | 18 +++++--- ckanext/datasetapproval/plugin.py | 1 - .../templates/package/read.html | 29 +++++-------- ckanext/datasetapproval/views/review.py | 5 +-- 5 files changed, 36 insertions(+), 59 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 21ba6e7..f4904d9 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -29,31 +29,9 @@ def is_user_admin_of_org(org_id, user_id): def publishing_check(context, data_dict): - user_id = ( - tk.current_user.id - if tk.current_user and not tk.current_user.is_anonymous - else None - ) - org_id = data_dict.get("owner_org") - is_active = data_dict.get("state") in ["active", "publish", None, False] - - is_user_editor = is_user_editor_of_org(org_id, user_id) - is_user_admin = is_user_admin_of_org(org_id, user_id) - is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin - - if (is_user_editor or is_unowned_dataset(org_id)) and is_active: - mailer.mail_package_review_request_to_admins(context, data_dict) - data_dict["state"] = "inreview" - - # if sysadmin is updating the dataset and it's already in review state - # then it should remain in review state - _action_review = context.get("_action_review", False) - if not _action_review and data_dict.get("id"): - old_data_dict = tk.get_action("package_show")( - context, {"id": data_dict.get("id")} - ) - if (is_user_admin or is_sysadmin) and old_data_dict.get("state") == "inreview": - data_dict["state"] = old_data_dict.get("state") + if context.get("allow_publish"): + return data_dict + data_dict["state"] = "draft" return data_dict def _add_or_update_org(context, package_dict): @@ -166,22 +144,24 @@ def publish_dataset(context, id): else None ) org_id = data_dict.get("owner_org") + data_dict["state"] = "active" + is_user_editor = is_user_editor_of_org(org_id, user_id) is_user_admin = is_user_admin_of_org(org_id, user_id) is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin - if is_user_admin or is_sysadmin: - data_dict["state"] = "active" - else: + if is_user_editor or is_unowned_dataset(org_id): mailer.mail_package_review_request_to_admins(context, data_dict) data_dict["state"] = "inreview" + try: - result = tk.get_action("package_update")( + data = tk.get_action("package_update")( {**context, "allow_publish": True}, data_dict ) + print(data) except Exception as e: raise tk.ValidationError(str(e)) - return {"success": True, "package": result} + return {"success": True} def dataset_review(context, data_dict): @@ -197,7 +177,7 @@ def dataset_review(context, data_dict): tk.get_action("package_patch")( { **context, - "_action_review": True, + "allow_publish": True, }, {"id": id, "state": states[action]}, ) diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml index 6a8c801..cd5f5d7 100644 --- a/ckanext/datasetapproval/dataset_schema.yaml +++ b/ckanext/datasetapproval/dataset_schema.yaml @@ -333,6 +333,19 @@ dataset_fields: # form_snippet: null # display_snippet: text.html +- field_name: releaseDate + label: Release date + preset: date + required: true + validators: not_empty + form_placeholder: eg. 2024-01-15 + +- field_name: creators + label: Creators + preset: multiple_text + validators: ignore_missing unicode_safe + form_snippet: multiple_text.html + display_snippet: multiple_text.html - field_name: language label: Language @@ -455,11 +468,6 @@ dataset_fields: display_snippet: text.html form_snippet: null -- field_name: terms_agreed - label: Terms - form_snippet: null - display_snippet: null - validators: ignore_missing resource_fields: diff --git a/ckanext/datasetapproval/plugin.py b/ckanext/datasetapproval/plugin.py index ac73b93..8c0c40b 100644 --- a/ckanext/datasetapproval/plugin.py +++ b/ckanext/datasetapproval/plugin.py @@ -54,7 +54,6 @@ def get_actions(self): "package_update": actions.package_update, "dataset_review": actions.dataset_review, "publish_dataset": actions.publish_dataset, - "org_autocomplete": actions.org_autocomplete } # ITemplateHelpers diff --git a/ckanext/datasetapproval/templates/package/read.html b/ckanext/datasetapproval/templates/package/read.html index e2f03cb..6235a26 100644 --- a/ckanext/datasetapproval/templates/package/read.html +++ b/ckanext/datasetapproval/templates/package/read.html @@ -2,28 +2,19 @@ {% block package_description %} {% if (c.pkg_dict.state == "draft") %} - {% endif %} {% if (c.pkg_dict.state == "inreview") and h.check_access("dataset_review",{"dataset_id":c.pkg_dict.id }) %} diff --git a/ckanext/datasetapproval/views/review.py b/ckanext/datasetapproval/views/review.py index 67db504..3e5f33c 100644 --- a/ckanext/datasetapproval/views/review.py +++ b/ckanext/datasetapproval/views/review.py @@ -103,9 +103,8 @@ def review_action(id, action): "session": model.Session, "user": tk.c.user, } - result = tk.get_action("publish_dataset")(context, id) - if result.get("package").get("state") == "active": - tk.h.flash_success(tk._("Dataset has been published.")) + tk.get_action("publish_dataset")(context, id) + tk.h.flash_success(tk._("Dataset has been published.")) return tk.redirect_to(controller="dataset", action="read", id=id) data_dict = {"dataset_id": id, "action": action} From 7fa372aac8fcdb0644f8f7f167da0b22f2457a0e Mon Sep 17 00:00:00 2001 From: Sagar Ghimire Date: Thu, 11 Apr 2024 17:35:09 +0545 Subject: [PATCH 11/22] [Fix][s] Different message admin and editor also admin can edit dataset while in review --- ckanext/datasetapproval/actions.py | 13 ++++----- .../templates/package/read.html | 29 ++++++++++++------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index f4904d9..2d4eb1f 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -29,7 +29,7 @@ def is_user_admin_of_org(org_id, user_id): def publishing_check(context, data_dict): - if context.get("allow_publish"): + if context.get("allow_publish") or data_dict.get("state") == "inreview": return data_dict data_dict["state"] = "draft" return data_dict @@ -144,20 +144,19 @@ def publish_dataset(context, id): else None ) org_id = data_dict.get("owner_org") - data_dict["state"] = "active" - is_user_editor = is_user_editor_of_org(org_id, user_id) is_user_admin = is_user_admin_of_org(org_id, user_id) is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin - if is_user_editor or is_unowned_dataset(org_id): + if not is_user_admin or not is_sysadmin: mailer.mail_package_review_request_to_admins(context, data_dict) data_dict["state"] = "inreview" - + else: + data_dict["state"] = "active" + try: - data = tk.get_action("package_update")( + tk.get_action("package_update")( {**context, "allow_publish": True}, data_dict ) - print(data) except Exception as e: raise tk.ValidationError(str(e)) diff --git a/ckanext/datasetapproval/templates/package/read.html b/ckanext/datasetapproval/templates/package/read.html index 6235a26..c848e61 100644 --- a/ckanext/datasetapproval/templates/package/read.html +++ b/ckanext/datasetapproval/templates/package/read.html @@ -2,19 +2,28 @@ {% block package_description %} {% if (c.pkg_dict.state == "draft") %} - {% endif %} {% if (c.pkg_dict.state == "inreview") and h.check_access("dataset_review",{"dataset_id":c.pkg_dict.id }) %} From 8e40858fe6d794849e75fdc8a2afca8c503e378e Mon Sep 17 00:00:00 2001 From: Demenech Date: Mon, 15 Apr 2024 20:43:18 -0300 Subject: [PATCH 12/22] feat(dataset): add steps to dataset creation --- ckanext/datasetapproval/templates/package/read.html | 2 +- ckanext/datasetapproval/templates/page.html | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ckanext/datasetapproval/templates/package/read.html b/ckanext/datasetapproval/templates/package/read.html index c848e61..e2f03cb 100644 --- a/ckanext/datasetapproval/templates/package/read.html +++ b/ckanext/datasetapproval/templates/package/read.html @@ -17,7 +17,7 @@ {% endtrans %}

- {% trans %}Send for Review{% endtrans %} + {% trans %}Submit to review{% endtrans %} {% endif %} diff --git a/ckanext/datasetapproval/templates/page.html b/ckanext/datasetapproval/templates/page.html index 8fc7544..d1bfe45 100644 --- a/ckanext/datasetapproval/templates/page.html +++ b/ckanext/datasetapproval/templates/page.html @@ -2,7 +2,6 @@ {% block styles %} {{ super() }} {% asset 'datasetapproval/datasetapproval_css' %} - {% asset 'datasetapproval/datasetapproval_js' %} {% endblock %} {% block primary %} From 0bedb3e235066a701704c2d8167e3c1ff7386983 Mon Sep 17 00:00:00 2001 From: Demenech Date: Mon, 15 Apr 2024 20:55:56 -0300 Subject: [PATCH 13/22] fix(dataset): prevent 'published' message from showing when user submits a dataset to review --- ckanext/datasetapproval/actions.py | 4 ++-- ckanext/datasetapproval/views/review.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 2d4eb1f..6cc7544 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -154,13 +154,13 @@ def publish_dataset(context, id): data_dict["state"] = "active" try: - tk.get_action("package_update")( + result = tk.get_action("package_update")( {**context, "allow_publish": True}, data_dict ) except Exception as e: raise tk.ValidationError(str(e)) - return {"success": True} + return {"success": True, "package": result } def dataset_review(context, data_dict): diff --git a/ckanext/datasetapproval/views/review.py b/ckanext/datasetapproval/views/review.py index 3e5f33c..99fe03a 100644 --- a/ckanext/datasetapproval/views/review.py +++ b/ckanext/datasetapproval/views/review.py @@ -103,8 +103,9 @@ def review_action(id, action): "session": model.Session, "user": tk.c.user, } - tk.get_action("publish_dataset")(context, id) - tk.h.flash_success(tk._("Dataset has been published.")) + result = tk.get_action("publish_dataset")(context, id) + if result.get("package").get("state") != "inreview": + tk.h.flash_success(tk._("Dataset has been published.")) return tk.redirect_to(controller="dataset", action="read", id=id) data_dict = {"dataset_id": id, "action": action} From 79bce651624b9dd53700a8237a8e7a6bc9718c99 Mon Sep 17 00:00:00 2001 From: Demenech Date: Mon, 15 Apr 2024 21:03:53 -0300 Subject: [PATCH 14/22] fix(dataset): fix sysadmin not being able to directly publish dataset --- ckanext/datasetapproval/actions.py | 9 ++++----- ckanext/datasetapproval/views/review.py | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 6cc7544..16404bc 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -147,12 +147,11 @@ def publish_dataset(context, id): is_user_admin = is_user_admin_of_org(org_id, user_id) is_sysadmin = hasattr(tk.current_user, "sysadmin") and tk.current_user.sysadmin - if not is_user_admin or not is_sysadmin: + if is_user_admin or is_sysadmin: + data_dict["state"] = "active" + else: mailer.mail_package_review_request_to_admins(context, data_dict) data_dict["state"] = "inreview" - else: - data_dict["state"] = "active" - try: result = tk.get_action("package_update")( {**context, "allow_publish": True}, data_dict @@ -160,7 +159,7 @@ def publish_dataset(context, id): except Exception as e: raise tk.ValidationError(str(e)) - return {"success": True, "package": result } + return {"success": True, "package": result} def dataset_review(context, data_dict): diff --git a/ckanext/datasetapproval/views/review.py b/ckanext/datasetapproval/views/review.py index 99fe03a..67db504 100644 --- a/ckanext/datasetapproval/views/review.py +++ b/ckanext/datasetapproval/views/review.py @@ -104,7 +104,7 @@ def review_action(id, action): "user": tk.c.user, } result = tk.get_action("publish_dataset")(context, id) - if result.get("package").get("state") != "inreview": + if result.get("package").get("state") == "active": tk.h.flash_success(tk._("Dataset has been published.")) return tk.redirect_to(controller="dataset", action="read", id=id) From 87f569b78efe190b11164d88c0546bb3498d2608 Mon Sep 17 00:00:00 2001 From: Demenech Date: Mon, 15 Apr 2024 21:23:36 -0300 Subject: [PATCH 15/22] feat(dataset): add custom org field with autocomplete --- ckanext/datasetapproval/actions.py | 72 ++++++++------------ ckanext/datasetapproval/assets/webassets.yml | 2 +- ckanext/datasetapproval/dataset_schema.yaml | 6 +- ckanext/datasetapproval/plugin.py | 1 + ckanext/datasetapproval/templates/page.html | 1 + 5 files changed, 35 insertions(+), 47 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 16404bc..3c4323a 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -4,8 +4,6 @@ from ckan.plugins import toolkit as tk from ckanext.datasetapproval import mailer from ckan import logic -from ckanext.scheming.logic import scheming_dataset_schema_show -from ckan import model log = logging.getLogger() @@ -65,54 +63,12 @@ def _add_or_update_org(context, package_dict): return package_dict -def get_dataset_schema(): - context = { - 'model': model, - 'session': model.Session, - 'user': None, - 'ignore_auth': True - } - - data_dict = { - 'type': 'dataset', - 'expanded': True - } - - try: - schema_data = scheming_dataset_schema_show(context, data_dict) - return schema_data - except Exception as e: - print(f"Error retrieving dataset schema: {e}") - return None - -def clean_dictionary(data_dict): - schema = get_dataset_schema() - keys = [] - - for field_info in schema.get('dataset_fields', []): - if "repeating_subfields" in field_info.keys(): - keys.append(field_info['field_name']) - - cleaned_dict = dict(data_dict) - - for key in keys: - if key in cleaned_dict: - remove_key = True - for entry in cleaned_dict[key]: - for value in entry.values(): - if value != "": - remove_key = False - break - if remove_key: - del cleaned_dict[key] - - return cleaned_dict - @tk.chained_action def package_create(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) + data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) return result @@ -122,6 +78,7 @@ def package_update(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) + data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) return result @@ -131,6 +88,7 @@ def package_patch(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) + data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) return result @@ -207,3 +165,27 @@ def _org_autocomplete(context, data_dict): def org_autocomplete(context, data_dict): logic.check_access('group_autocomplete', context, data_dict) return _org_autocomplete(context, data_dict) + + +def _org_autocomplete(context, data_dict): + q = data_dict['q'] + limit = data_dict.get('limit', 20) + model = context['model'] + + query = model.Group.search_by_name_or_title(q, group_type="org", + is_org=False, limit=limit) + + org_list = [] + for group in query.all(): + result_dict = {} + for k in ['id', 'name', 'title']: + result_dict[k] = getattr(group, k) + org_list.append(result_dict) + + return org_list + + +@tk.side_effect_free +def org_autocomplete(context, data_dict): + logic.check_access('group_autocomplete', context, data_dict) + return _org_autocomplete(context, data_dict) diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml index d0b79ca..712190a 100644 --- a/ckanext/datasetapproval/assets/webassets.yml +++ b/ckanext/datasetapproval/assets/webassets.yml @@ -5,7 +5,6 @@ datasetapproval_js: # - js/dataset-visibility.js # - js/form-submit.js - js/org-autocomplete.js - - js/multiple-sublists.js extra: preload: - base/main @@ -15,3 +14,4 @@ datasetapproval_css: output: ckanext-datasetapproval/%(version)s-approval.css contents: - css/approval.css + diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml index cd5f5d7..60cf908 100644 --- a/ckanext/datasetapproval/dataset_schema.yaml +++ b/ckanext/datasetapproval/dataset_schema.yaml @@ -16,6 +16,10 @@ dataset_fields: preset: dataset_slug form_placeholder: eg. my-dataset +- field_name: org + label: Organization + preset: org_autocomplete + - field_name: tag_string label: Keywords preset: tag_string_autocomplete @@ -487,4 +491,4 @@ resource_fields: - field_name: format label: Format - preset: resource_format_autocomplete \ No newline at end of file + preset: resource_format_autocomplete diff --git a/ckanext/datasetapproval/plugin.py b/ckanext/datasetapproval/plugin.py index 8c0c40b..ac73b93 100644 --- a/ckanext/datasetapproval/plugin.py +++ b/ckanext/datasetapproval/plugin.py @@ -54,6 +54,7 @@ def get_actions(self): "package_update": actions.package_update, "dataset_review": actions.dataset_review, "publish_dataset": actions.publish_dataset, + "org_autocomplete": actions.org_autocomplete } # ITemplateHelpers diff --git a/ckanext/datasetapproval/templates/page.html b/ckanext/datasetapproval/templates/page.html index d1bfe45..8fc7544 100644 --- a/ckanext/datasetapproval/templates/page.html +++ b/ckanext/datasetapproval/templates/page.html @@ -2,6 +2,7 @@ {% block styles %} {{ super() }} {% asset 'datasetapproval/datasetapproval_css' %} + {% asset 'datasetapproval/datasetapproval_js' %} {% endblock %} {% block primary %} From de887b3146752ff3d325e9910fd5602b39e4c4fb Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Tue, 16 Apr 2024 15:40:02 +0200 Subject: [PATCH 16/22] modified orgs pages --- ckanext/datasetapproval/assets/css/approval.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 9aa6dbb..175c120 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -9,11 +9,6 @@ color: #006D84 !important; } -/* .breadcrumb */ -.breadcrumb .active a{ - color: #006D84 !important; -} - /* Main CSS */ .main { From 7104934da0f4d07d95b1e6823e4072ded51d3e5c Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Tue, 16 Apr 2024 20:41:21 +0200 Subject: [PATCH 17/22] added some styles --- ckanext/datasetapproval/assets/css/approval.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 175c120..a6cb464 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -563,6 +563,11 @@ form#organization-search-form + ul.media-grid li { border-bottom: 1px solid #006D84;; } +.row:has(header.module-content.page-header) aside .nums{ + border-top: 1px solid #006D84; + border-bottom: 1px solid #006D84;; +} + .row:has(header.module-content.page-header) aside dd span{ font-weight: 700; font-size: 40px; From 58375b139bcbad77bf585133fe2656f5ebb49876 Mon Sep 17 00:00:00 2001 From: gavram Date: Tue, 16 Apr 2024 10:30:24 +0200 Subject: [PATCH 18/22] Dataset schema corrected, not final version --- ckanext/datasetapproval/dataset_schema.yaml | 24 ++++++--------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/ckanext/datasetapproval/dataset_schema.yaml b/ckanext/datasetapproval/dataset_schema.yaml index 60cf908..6a8c801 100644 --- a/ckanext/datasetapproval/dataset_schema.yaml +++ b/ckanext/datasetapproval/dataset_schema.yaml @@ -16,10 +16,6 @@ dataset_fields: preset: dataset_slug form_placeholder: eg. my-dataset -- field_name: org - label: Organization - preset: org_autocomplete - - field_name: tag_string label: Keywords preset: tag_string_autocomplete @@ -337,19 +333,6 @@ dataset_fields: # form_snippet: null # display_snippet: text.html -- field_name: releaseDate - label: Release date - preset: date - required: true - validators: not_empty - form_placeholder: eg. 2024-01-15 - -- field_name: creators - label: Creators - preset: multiple_text - validators: ignore_missing unicode_safe - form_snippet: multiple_text.html - display_snippet: multiple_text.html - field_name: language label: Language @@ -472,6 +455,11 @@ dataset_fields: display_snippet: text.html form_snippet: null +- field_name: terms_agreed + label: Terms + form_snippet: null + display_snippet: null + validators: ignore_missing resource_fields: @@ -491,4 +479,4 @@ resource_fields: - field_name: format label: Format - preset: resource_format_autocomplete + preset: resource_format_autocomplete \ No newline at end of file From 58f88486d8bb77ff56228a7c164ed17d32868084 Mon Sep 17 00:00:00 2001 From: gavram Date: Tue, 16 Apr 2024 10:31:24 +0200 Subject: [PATCH 19/22] Add support for multiple select sublists and hyperlinks rendering --- ckanext/datasetapproval/actions.py | 45 ++++++++++++++ .../datasetapproval/assets/css/approval.css | 61 +++++++++++++++++++ ckanext/datasetapproval/assets/webassets.yml | 1 + 3 files changed, 107 insertions(+) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index 3c4323a..d98b028 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -4,6 +4,8 @@ from ckan.plugins import toolkit as tk from ckanext.datasetapproval import mailer from ckan import logic +from ckanext.scheming.logic import scheming_dataset_schema_show +from ckan import model log = logging.getLogger() @@ -63,6 +65,49 @@ def _add_or_update_org(context, package_dict): return package_dict +def get_dataset_schema(): + context = { + 'model': model, + 'session': model.Session, + 'user': None, + 'ignore_auth': True + } + + data_dict = { + 'type': 'dataset', + 'expanded': True + } + + try: + schema_data = scheming_dataset_schema_show(context, data_dict) + return schema_data + except Exception as e: + print(f"Error retrieving dataset schema: {e}") + return None + +def clean_dictionary(data_dict): + schema = get_dataset_schema() + keys = [] + + for field_info in schema.get('dataset_fields', []): + if "repeating_subfields" in field_info.keys(): + keys.append(field_info['field_name']) + + cleaned_dict = dict(data_dict) + + for key in keys: + if key in cleaned_dict: + remove_key = True + for entry in cleaned_dict[key]: + for value in entry.values(): + if value != "": + remove_key = False + break + if remove_key: + del cleaned_dict[key] + + return cleaned_dict + @tk.chained_action def package_create(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index a6cb464..26ef9b1 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -430,6 +430,67 @@ content: none; } +/* Scheming multiple select with sublists */ +.multi-select ul, .multi-select ul .sub-items { + list-style: none; /* Removes list bullets */ + padding-left: 0; /* Removes list padding */ + margin-left: 0; /* Aligns with the multi-select container */ +} + +/* Main category title styles */ +/* Resets */ +.multi-select, +.multi-select ul, +.multi-select ul .sub-items { + list-style: none; /* Removes bullets */ + padding-left: 0; /* Removes indentation */ + margin: 0; /* Removes default margin */ + margin-left: 10px; /* Indents the main category labels */ +} + +/* Styles for the main category labels and toggle arrow */ +.multi-select > ul > li > label { + cursor: pointer; /* Indicates the element is clickable */ + vertical-align: middle; /* Aligns with the toggle arrow */ + font-weight: normal; /* No bold font */ +} + +.toggle-sublist { + cursor: pointer; /* Indicates it's clickable */ + user-select: none; /* Prevents text selection */ + margin-right: 5px; /* Spacing between arrow and label */ +} + +/* Styles for sub-items list */ +.multi-select .sub-items { + display: none; /* Hide by default */ + margin-top: 5px; /* Space between category label and sublist items */ + padding-left: 30px; /* Aligns sublist items with the main items */ +} + +/* Styles for sublist items (labels and checkboxes) */ +.sub-items li { + display: flex; + align-items: center; /* Center aligns items vertically */ + margin-bottom: 5px; /* Space between sublist items */ +} + +.sub-items li input[type="checkbox"] { + width: auto; /* Adjusts checkbox width */ + margin-right: 10px; /* Space between checkbox and label */ + margin-left: 20px; /* Indent checkbox to align with sublist items */ +} + +.sub-items li label { + font-weight: normal; /* No bold font */ + white-space: nowrap; /* Ensures label text does not wrap */ +} + +/* Remove the :after content on labels, if it exists */ +.sub-items li label::after { + content: none; +} + .btn { display: inline-flex; align-items: center; diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml index 712190a..69cab7c 100644 --- a/ckanext/datasetapproval/assets/webassets.yml +++ b/ckanext/datasetapproval/assets/webassets.yml @@ -5,6 +5,7 @@ datasetapproval_js: # - js/dataset-visibility.js # - js/form-submit.js - js/org-autocomplete.js + - js/multiple-sublists.js extra: preload: - base/main From 01cbcefbc525b29de900f090e7005819ae369ec2 Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Tue, 16 Apr 2024 15:40:02 +0200 Subject: [PATCH 20/22] modified orgs pages --- ckanext/datasetapproval/assets/css/approval.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 26ef9b1..708b5d4 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -9,6 +9,11 @@ color: #006D84 !important; } +/* .breadcrumb */ +.breadcrumb .active a{ + color: #006D84 !important; +} + /* Main CSS */ .main { From 90c787debb0232ab7b04a2d8ab179eb9568819dc Mon Sep 17 00:00:00 2001 From: gavram Date: Tue, 16 Apr 2024 10:31:24 +0200 Subject: [PATCH 21/22] Add support for multiple select sublists and hyperlinks rendering --- .../datasetapproval/assets/css/approval.css | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/ckanext/datasetapproval/assets/css/approval.css b/ckanext/datasetapproval/assets/css/approval.css index 36384b1..656a073 100644 --- a/ckanext/datasetapproval/assets/css/approval.css +++ b/ckanext/datasetapproval/assets/css/approval.css @@ -496,6 +496,67 @@ content: none; } +/* Scheming multiple select with sublists */ +.multi-select ul, .multi-select ul .sub-items { + list-style: none; /* Removes list bullets */ + padding-left: 0; /* Removes list padding */ + margin-left: 0; /* Aligns with the multi-select container */ +} + +/* Main category title styles */ +/* Resets */ +.multi-select, +.multi-select ul, +.multi-select ul .sub-items { + list-style: none; /* Removes bullets */ + padding-left: 0; /* Removes indentation */ + margin: 0; /* Removes default margin */ + margin-left: 10px; /* Indents the main category labels */ +} + +/* Styles for the main category labels and toggle arrow */ +.multi-select > ul > li > label { + cursor: pointer; /* Indicates the element is clickable */ + vertical-align: middle; /* Aligns with the toggle arrow */ + font-weight: normal; /* No bold font */ +} + +.toggle-sublist { + cursor: pointer; /* Indicates it's clickable */ + user-select: none; /* Prevents text selection */ + margin-right: 5px; /* Spacing between arrow and label */ +} + +/* Styles for sub-items list */ +.multi-select .sub-items { + display: none; /* Hide by default */ + margin-top: 5px; /* Space between category label and sublist items */ + padding-left: 30px; /* Aligns sublist items with the main items */ +} + +/* Styles for sublist items (labels and checkboxes) */ +.sub-items li { + display: flex; + align-items: center; /* Center aligns items vertically */ + margin-bottom: 5px; /* Space between sublist items */ +} + +.sub-items li input[type="checkbox"] { + width: auto; /* Adjusts checkbox width */ + margin-right: 10px; /* Space between checkbox and label */ + margin-left: 20px; /* Indent checkbox to align with sublist items */ +} + +.sub-items li label { + font-weight: normal; /* No bold font */ + white-space: nowrap; /* Ensures label text does not wrap */ +} + +/* Remove the :after content on labels, if it exists */ +.sub-items li label::after { + content: none; +} + .btn { display: inline-flex; align-items: center; From 7ae0199a5d6096e1b89e5bbad569192a2c0fa1d7 Mon Sep 17 00:00:00 2001 From: mohamedsalem401 Date: Wed, 17 Apr 2024 10:00:21 +0200 Subject: [PATCH 22/22] Remove unwanted changes --- ckanext/datasetapproval/actions.py | 29 +------------------- ckanext/datasetapproval/assets/webassets.yml | 1 - 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/ckanext/datasetapproval/actions.py b/ckanext/datasetapproval/actions.py index d98b028..fd43909 100644 --- a/ckanext/datasetapproval/actions.py +++ b/ckanext/datasetapproval/actions.py @@ -113,7 +113,6 @@ def package_create(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) - data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) return result @@ -123,7 +122,6 @@ def package_update(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) - data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) return result @@ -133,7 +131,6 @@ def package_patch(up_func, context, data_dict): data_dict = clean_dictionary(data_dict) publishing_check(context, data_dict) data_dict = _add_or_update_org(context, data_dict) - data_dict = _add_or_update_org(context, data_dict) result = up_func(context, data_dict) return result @@ -209,28 +206,4 @@ def _org_autocomplete(context, data_dict): @tk.side_effect_free def org_autocomplete(context, data_dict): logic.check_access('group_autocomplete', context, data_dict) - return _org_autocomplete(context, data_dict) - - -def _org_autocomplete(context, data_dict): - q = data_dict['q'] - limit = data_dict.get('limit', 20) - model = context['model'] - - query = model.Group.search_by_name_or_title(q, group_type="org", - is_org=False, limit=limit) - - org_list = [] - for group in query.all(): - result_dict = {} - for k in ['id', 'name', 'title']: - result_dict[k] = getattr(group, k) - org_list.append(result_dict) - - return org_list - - -@tk.side_effect_free -def org_autocomplete(context, data_dict): - logic.check_access('group_autocomplete', context, data_dict) - return _org_autocomplete(context, data_dict) + return _org_autocomplete(context, data_dict) \ No newline at end of file diff --git a/ckanext/datasetapproval/assets/webassets.yml b/ckanext/datasetapproval/assets/webassets.yml index 69cab7c..d0b79ca 100644 --- a/ckanext/datasetapproval/assets/webassets.yml +++ b/ckanext/datasetapproval/assets/webassets.yml @@ -15,4 +15,3 @@ datasetapproval_css: output: ckanext-datasetapproval/%(version)s-approval.css contents: - css/approval.css -