Skip to content

Commit

Permalink
#50 handle mandatory fields
Browse files Browse the repository at this point in the history
* Task #50: add js for constraints

* Task #50: add required style

* Task #50: placeholder added

* Task #50: placeholder

* Task #50: required fields for custom tab

* Task #50: merge Add dynamic constraints in UI

* Task 50: removed unused variable

* Task #50: cleanup debug logs in js

* Task #50: align rndt template with master

* Task #50: align rndt template with master
  • Loading branch information
mattiagiupponi authored Mar 11, 2021
1 parent 5d3f5b9 commit ac5daeb
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 36 deletions.
1 change: 1 addition & 0 deletions rndt/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def run_setup_hooks(*args, **kwargs):
from geonode.urls import urlpatterns

LOCAL_ROOT = os.path.abspath(os.path.dirname(__file__))

settings.TEMPLATES[0]["DIRS"].insert(0, os.path.join(LOCAL_ROOT, "templates"))

settings.TEMPLATES[0]["OPTIONS"]["context_processors"].append(
Expand Down
8 changes: 2 additions & 6 deletions rndt/context_processors.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
import ast
import os
from django.conf import settings

from rndt.layers.forms import LayerRNDTForm


def rndt_tags(request):
return {
"DISABLE_LAYER_CONSTRAINTS": ast.literal_eval(
os.getenv("DISABLE_LAYER_CONSTRAINTS", "True")
),
"LayerRNDTForm": LayerRNDTForm,
"LayerRNDTForm": LayerRNDTForm
}
4 changes: 2 additions & 2 deletions rndt/layers/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ class Meta:
resolution = forms.FloatField(
label=_("resolution choices"),
required=False,
widget=NumberInput(attrs={"class": "form-control"}),
widget=NumberInput(attrs={"class": "form-control", "placeholder": 10}),
)

accuracy = forms.FloatField(
label=_("accuracy"),
required=False,
widget=NumberInput(attrs={"class": "form-control"}),
widget=NumberInput(attrs={"class": "form-control", "placeholder": 0.5}),
)

def __init__(self, *args, **kwargs):
Expand Down
1 change: 0 additions & 1 deletion rndt/static/rndt/js/search/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
}
return data;
}
console.log("ajsjhdksajkhdsajhksda");
// Load categories, keywords, and regions
module.load_categories = function ($http, $rootScope, $location) {
var params = typeof FILTER_TYPE == 'undefined' ? {} : {'type': FILTER_TYPE};
Expand Down
58 changes: 32 additions & 26 deletions rndt/templates/layouts/panels.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,6 @@
{% endblock additional_scripts %}

{% block layer_constraints %}
{% if not DISABLE_LAYER_CONSTRAINTS %}
<div class="col-lg-4">
<div>
<span><label for="{{ layer_form.restriction_code_type|id }}">{{ layer_form.restriction_code_type.label }}</label></span>
<!--<p class="xxs-font-size">(Limitation/s placed upon the access or use of data)</p>-->
{{ layer_form.restriction_code_type }}
</div>
<div>
<span><label for="{{ layer_form.constraints_other|id }}">{{ layer_form.constraints_other.label }}</label></span>
<!--<p class="xxs-font-size">(Other restrictions and legal prerequisites for accessing or use data and metadata)</p>-->
{{ layer_form.constraints_other }}
</div>
</div>
{% endif %}
{% endblock layer_constraints %}

{% block breadcrumbs %}
Expand All @@ -33,7 +19,11 @@
<a>{% trans "Location and Licenses" %}</a>
</li>
<li data-step="3" data-toggle="tab" href="#ownership">
<a>{% trans "Optional Metadata" %}</a>
{% if UI_REQUIRED_FIELDS %}
<a>{% trans "Required Metadata" %}</a>
{% else %}
<a>{% trans "Optional Metadata" %}</a>
{% endif %}
</li>
<li data-step="4" data-toggle="tab" href="#dataset">
<a>{% trans "Dataset Attributes" %}</a>
Expand All @@ -53,8 +43,20 @@
<div class="advanced-hint progress-bar" role="progressbar" style="width:20%">
{% trans "Mandatory" %}
</div>
<div class="progress-bar" role="progressbar" style="width:60%">
{% trans "Optional" %}
{% if UI_REQUIRED_FIELDS %}
<div class="metadata-hint progress-bar" role="progressbar" style="width:25%">
{% trans "Mandatory" %}
</div>
<div class="progress-bar" role="progressbar" style="width:20%">
{% trans "Optional" %}
</div>
{% else %}
<div class="progress-bar" role="progressbar" style="width:40%">
{% trans "Optional" %}
</div>
{% endif %}
<div class="additional-info-hint progress-bar" role="progressbar" style="width:20%">
{% trans "Mandatory" %}
</div>
</div>
{% endblock edit_progress %}
Expand All @@ -67,7 +69,7 @@
<div class="panel panel-default">
<div class="panel-heading">{% trans "Data Constraints" %}</div>
<div class="panel-body">
<div>
<div id="accessConstraintsInfo">
<!--span><label>{% trans "Access constraints" %}</label></span>
{{ LayerRNDTForm.access_contraints }}-->
<span><label for="id_access_contraints" class="control-label required-field">{% trans "Access constraints" %}</label></span>
Expand All @@ -88,7 +90,7 @@
{% endfor %}
</select>
</div>
<div>
<div id="useConstraintsInfo">
<span><label for="id_use_constraints" class="control-label required-field">{% trans "Use constraints" %}</label></span>
<select
title="{% trans "Choose one of the following..." %}"
Expand Down Expand Up @@ -136,16 +138,20 @@
</div>
</div>
<div class="col-xs-12 col-lg-4">
<div class="">
<div>
<span><label for="id_resolution" class="control-label required-field">{% trans "Resolution" %}</label></span><br>
<div class="input-group">
<div class="input-group-addon">mt</div>
<div class="custom">
<div class="input-group resolution">
<div class="input-group-addon">mt</div>
{{ LayerRNDTForm.resolution|get_resolution_value:layer.id }}
</div>
</div>
<span><label for="id_resolution" class="control-label required-field">{% trans "Positional Accuracy" %}</label></span><br>
<div class="input-group">
<div class="input-group-addon">mt</div>
{{ LayerRNDTForm.accuracy|get_accuracy_value:layer.id }}
<span><label for="id_accuracy" class="control-label required-field">{% trans "Positional Accuracy" %}</label></span><br>
<div class="custom">
<div class="input-group accuracy">
<div class="input-group-addon">mt</div>
{{ LayerRNDTForm.accuracy|get_accuracy_value:layer.id }}
</div>
</div>
</div>
</div>
Expand Down
153 changes: 153 additions & 0 deletions rndt/templates/metadata_form_js.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
{% extends "metadata_form_js.html" %}
{% load i18n %}
{% load static %}
{% load floppyforms %}

{% block hints %}
$('#completeness-hints .mandatory-hint').click(getTab.bind(null, 1));
$('#completeness-hints .advanced-hint').click(getTab.bind(null, 2));
$('#completeness-hints .additional-info-hint').click(getTab.bind(null, 3));
{% endblock hints %}

{% block target %}
if(target.id === 'category_form' ||
target.id === 'id_resource-regions' ||
target.id === 'id_resource-group' ||
target.id === 'id_access_contraints' ||
{{UI_REQUIRED_FIELDS}}.includes(target.id) ||
target.id === 'id_use_constraints' ||
target.id === 'id_resolution' ||
target.id === 'id_accuracy'
) {
// group selector
$(target).closest('#basicGroupInfo').toggleClass('has-error', empty);

// category selector
$(target).closest('#basicCategoryInfo').toggleClass('has-error', empty);
// use constraints selector
$(target).closest('#accessConstraintsInfo').toggleClass('has-error', empty);
// access constraints selector
$(target).closest('#useConstraintsInfo').toggleClass('has-error', empty);
// resolution selector
$(target).closest('.resolution').toggleClass('has-error', empty);
// accuracy selector
$(target).closest('.accuracy').toggleClass('has-error', empty);

// regions container
$(target).closest('#regions_multiselect_container').toggleClass('has-error', empty);
$(target).toggleClass("input-empty", empty);
}
{% endblock target %}

{% block onInputChange %}
var onInputChange = function(e){
toggleRestrictionsConstraints(e);
if(e.target.value !== undefined && e.target.value.trim() === ''){
if(!$(e.target).hasClass("input-empty")){
if(isMandatoryField(this)) {
setInputEmpty(e.target, true);
var mandatoryWarning = "<p class='xxs-font-size mandatory-warning'>&nbsp;&nbsp;&nbsp;<strong>{% trans "* Field declared Mandatory by the Metadata Schema" %}</strong></p>"
if (!!$(this).closest('.check-select').length) {
$(e.target).parent().parent().append(gettext(mandatoryWarning));
} else if (!!$(this).closest('#mdinfo').length) {
$(e.target).parent().append(gettext(mandatoryWarning));
} else if (!!$(this).closest('.custom').length) {
$(e.target).parent().parent().append(gettext("<p class='xxs-font-size mandatory-warning'>&nbsp;&nbsp;&nbsp;<strong>{% trans "* Field declared Mandatory by the Metadata Schema" %}</strong></p>"));
}
empty++;
}
}
}
else {
if($(e.target).hasClass("input-empty")) {
if(isMandatoryField(this)) {
empty--;
}
setInputEmpty(e.target, false);
if (e.target.id === 'id_resolution' || e.target.id === 'id_accuracy' ) {
$(e.target).parent().parent().find(".mandatory-warning").remove();
}
$(e.target).parent().find(".mandatory-warning").remove();
}
}

if(totalNum == prevNum) {
try {
var perc = (totalNum <= 0 ? 0 : (totalNum-empty)/totalNum);
perc = (perc <= 1 ? perc : 1);
updateCompleteness(perc);
} catch(err) {
// Log error
// console.log(err);
}
}
};
{% endblock onInputChange %}


{% block trigger_onInputChange %}
{{UI_REQUIRED_FIELDS}}.forEach(element => $('#' + element).change(onInputChange).change());
$('#category_form').change(onInputChange).change();
$('#id_resource-group').change(onInputChange).change();

$( ':input[id*="id_tkeywords"][required]:visible').each( function () {
$('#' + this.id).change(onInputChange).change();
});

$('#id_access_contraints').change(onInputChange).change();
$('#id_use_constraints').change(onInputChange).change();
$('#id_resolution').change(onInputChange).change();
$('#id_accuracy').change(onInputChange).change();

document.querySelector('select[name="resource-keywords"]').onchange=onInputChange

$('#id_resource-regions').change(onInputChange).change();
$('#id_resource-temporal_extent_end').on('blur', function() {$(this).change(onInputChange).change();})
$('#id_resource-temporal_extent_start').on('blur', function() {$(this).change(onInputChange).change();})
$('#mandatory').find(":input:not(.value-select):not(.autocomplete)").each(function(){
if(isMandatoryField(this)) {
prevNum++;
}
$('#category_form').on('rendered.bs.select', function() {
$('.has-popover').popover({'trigger':'hover'});
});

$(this).change(onInputChange).change();

if(isMandatoryField(this)){
totalNum++;
}
});

$('#mdinfo').find(":input:not(.value-select):not(.autocomplete)").each(function(){
if(isMandatoryField(this)) {
prevNum++;
}

$(this).change(onInputChange).change();

if(isMandatoryField(this)){
totalNum++;
}
});
{% endblock trigger_onInputChange %}

{% block extendcompleteness %}
var additionalMissing = $('#additionalcontraints').find('.input-empty').length > 0;
if (additionalMissing) {
var inputs = $('#additionalcontraints').find('.input-empty');
var empty = inputs.length;
for (var i=0; i<inputs.length; i++) {
if (typeof inputs[i].value !== undefined && inputs[i].value !== '') {
empty--;
}
}
additionalMissing = empty > 0;
}

$('#completeness-hints .additional-info-hint')
.toggleClass('progress-bar-danger', additionalMissing)
.toggleClass('progress-bar-success', !additionalMissing)
.attr('title', additionalMissing ? gettext("some schema mandatory fields are missing") : gettext("Metadata Schema mandatory fields completed") )
.tooltip('fixTitle');
{% endblock extendcompleteness %}
2 changes: 1 addition & 1 deletion rndt/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


class PubblicaAmministrazioneResource(ModelResource):
"""Tags api"""
"""PA api"""

def serialize(self, request, data, format, options=None):
if options is None:
Expand Down

0 comments on commit ac5daeb

Please sign in to comment.