diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-02-12 19:27:25 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-02-12 19:27:25 +0100 |
commit | 0c579d023e4fb91be03c8a5c4f67da152fe373a7 (patch) | |
tree | 8986f5149dd2f627c46530e16acc64d285b57eee | |
parent | b8fe730bde4a8c595557a5437d9d9d47c8bbb0e4 (diff) | |
download | Ishtar-0c579d023e4fb91be03c8a5c4f67da152fe373a7.tar.bz2 Ishtar-0c579d023e4fb91be03c8a5c4f67da152fe373a7.zip |
Finds: manage all searches
-rw-r--r-- | archaeological_finds/forms.py | 228 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 248 | ||||
-rw-r--r-- | ishtar_common/static/js/ishtar.js | 45 | ||||
-rw-r--r-- | ishtar_common/static/media/styles.css | 5 | ||||
-rw-r--r-- | ishtar_common/templates/blocks/bs_form_snippet.html | 10 | ||||
-rw-r--r-- | ishtar_common/views.py | 3 | ||||
-rw-r--r-- | ishtar_common/widgets.py | 6 | ||||
-rw-r--r-- | scss/custom.scss | 20 |
8 files changed, 512 insertions, 53 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 3073c5c23..88c25be44 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -148,7 +148,8 @@ class BaseFindForm(CustomForm, ManageOldType): 'mark', 'description', 'is_complete', 'material_type', 'material_type_quality', 'object_type', 'object_type_quality', 'find_number', 'min_number_of_individuals', 'inscription', - 'manufacturing_place', 'communicabilitie', 'comment', 'dating_comment', + 'decoration', 'manufacturing_place', 'communicabilitie', 'comment', + 'dating_comment', 'length', 'width', 'height', 'thickness', 'diameter', 'circumference', 'volume', 'weight', 'clutter_long_side', 'clutter_short_side', 'clutter_height', 'dimensions_comment', 'checked_type', 'check_date' @@ -833,6 +834,47 @@ DatingFormSet.form_slug = "find-040-dating" class FindSelect(HistorySelect): _model = models.Find + FORM_FILTERS = [ + (_(u"Find origin"), [ + "base_finds__cache_short_id", + "base_finds__cache_complete_id", + "base_finds__context_record__town", + "base_finds__context_record__operation__year", + "base_finds__context_record__operation__operation_code", + "base_finds__context_record__operation__code_patriarche", + "base_finds__context_record__operation__operation_type", + "base_finds__context_record__town__areas", + "archaeological_sites", + "archaeological_sites_context_record", + "base_finds__context_record", + "ope_relation_types", + "cr_relation_types", + ]), + (_(u"Discovery date"), [ + "base_finds__discovery_date__before", + "base_finds__discovery_date__after", + "base_finds__discovery_date_tpq__before", + "base_finds__discovery_date_tpq__after", + "base_finds__discovery_date_taq__before", + "base_finds__discovery_date_taq__after" + ]), + (_(u"Dimensions"), [ + "length__higher", "width__higher", "height__higher", + "thickness__higher", "diameter__higher", "circumference__higher", + "volume__higher", "weight__higher", "clutter_long_side__higher", + "clutter_short_side__higher", "clutter_height__higher", + "length__lower", "width__lower", "height__lower", + "thickness__lower", "diameter__lower", "circumference__lower", + "volume__lower", "weight__lower", "clutter_long_side__lower", + "clutter_short_side__lower", "clutter_height__lower", + "dimensions_comment", + ]), + (_(u"Preservation"), ( + "integrities", "remarkabilities", "conservatory_state", + "alterations", "alteration_causes", "preservation_to_considers", + "treatment_emergency") + ) + ] form_admin_name = _(u"Find - 001 - Search") form_slug = "find-001-search" @@ -840,10 +882,18 @@ class FindSelect(HistorySelect): label=_(u"Full text search"), widget=widgets.SearchWidget( 'archaeological-finds', 'find' )) - base_finds__cache_short_id = forms.CharField(label=_(u"Short ID")) - base_finds__cache_complete_id = forms.CharField(label=_(u"Complete ID")) label = forms.CharField(label=_(u"Free ID")) denomination = forms.CharField(label=_(u"Denomination")) + previous_id = forms.CharField(label=_(u"Previous ID")) + base_finds__excavation_id = forms.CharField(label=_(u"Excavation ID")) + seal_number = forms.CharField(label=_(u"Seal number")) + museum_id = forms.CharField(label=_(u"Museum ID")) + mark = forms.CharField(label=_(u"Mark")) + + base_finds__cache_short_id = forms.CharField( + label=_(u"Base find - Short ID")) + base_finds__cache_complete_id = forms.CharField( + label=_(u"Base find - Complete ID")) base_finds__context_record__town = get_town_field() base_finds__context_record__operation__year = forms.IntegerField( label=_(u"Year")) @@ -878,26 +928,169 @@ class FindSelect(HistorySelect): reverse_lazy('autocomplete-contextrecord'), associated_model=ContextRecord), validators=[valid_id(ContextRecord)]) - basket = forms.ChoiceField(label=_(u"Basket"), choices=[]) ope_relation_types = forms.ChoiceField( label=_(u"Search within related operations"), choices=[]) cr_relation_types = forms.ChoiceField( label=_(u"Search within related context records"), choices=[]) + + basket = forms.ChoiceField(label=_(u"Basket"), choices=[]) + + description = forms.CharField(label=_(u"Description")) + base_finds__discovery_date__after = forms.DateField( + label=_(u"Discovery date after"), widget=DatePicker + ) + base_finds__discovery_date__before = forms.DateField( + label=_(u"Discovery date before"), widget=DatePicker + ) + base_finds__discovery_date_tpq__after = forms.DateField( + label=_(u"Discovery date (exact or TPQ) after"), widget=DatePicker + ) + base_finds__discovery_date_tpq__before = forms.DateField( + label=_(u"Discovery date (exact or TPQ) before"), widget=DatePicker + ) + base_finds__discovery_date_taq__after = forms.DateField( + label=_(u"Discovery date (TAQ) after"), widget=DatePicker + ) + base_finds__discovery_date_taq__before = forms.DateField( + label=_(u"Discovery date (TAQ) before"), widget=DatePicker + ) + base_finds__batch = forms.ChoiceField(label=_(u"Batch/object"), choices=[]) + is_complete = forms.NullBooleanField(label=_(u"Is complete?")) + material_types = forms.IntegerField( + label=_(u"Material type"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-materialtype'), + associated_model=models.MaterialType), + ) + material_type_quality = forms.ChoiceField(label=_(u"Material type quality"), + choices=[]) + object_types = forms.IntegerField( + label=_(u"Object type"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-objecttype'), + associated_model=models.ObjectType), + ) + object_type_quality = forms.ChoiceField( + label=_(u"Object type quality"), choices=[]) + + find_number = forms.IntegerField(label=_(u"Find number")) + min_number_of_individuals = forms.IntegerField( + label=_(u"Minimum number of individuals (MNI)")) + + manufacturing_place = forms.CharField(label=_(u"Manufacturing place")) + decoration = forms.CharField(label=_(u"Decoration")) + inscription = forms.CharField(label=_(u"Inscription")) + + communicabilities = forms.ChoiceField(label=_(u"Communicability")) + comment = forms.CharField(label=_(u"Comment")) + datings__period = forms.ChoiceField(label=_(u"Period"), choices=[]) - material_types = forms.ChoiceField(label=_(u"Material type"), choices=[]) - object_types = forms.ChoiceField(label=_(u"Object type"), choices=[]) - preservation_to_considers = forms.ChoiceField( - choices=[], label=_(u"Preservation type")) - conservatory_state = forms.ChoiceField(label=_(u"Conservatory state"), - choices=[]) + dating_comment = forms.CharField(label=_(u"Comment on dating")) + + length__higher = FloatField(label=_(u"Length - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + length__lower = FloatField(label=_(u"Length - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + width__lower = FloatField( + label=_(u"Width - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + width__higher = FloatField( + label=_(u"Width - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + height__lower = FloatField( + label=_(u"Height - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + height__higher = FloatField( + label=_(u"Height - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + thickness__lower = FloatField( + label=_(u"Thickness - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + thickness__higher = FloatField( + label=_(u"Thickness - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + diameter__lower = FloatField( + label=_(u"Diameter - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + diameter__higher = FloatField( + label=_(u"Diameter - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + circumference__lower = FloatField( + label=_(u"Circumference - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + circumference__higher = FloatField( + label=_(u"Circumference - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + volume__lower = FloatField(label=_(u"Volume - lower than (l)")) + volume__higher = FloatField(label=_(u"Volume - higher than (l)")) + weight__lower = FloatField( + label=_(u"Weight - lower than (g)"), + widget=widgets.GramKilogramWidget) + weight__higher = FloatField( + label=_(u"Weight - higher than (g)"), + widget=widgets.GramKilogramWidget) + clutter_long_side__lower = FloatField( + label=_(u"Clutter long side - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + clutter_long_side__higher = FloatField( + label=_(u"Clutter long side - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + clutter_short_side__lower = FloatField( + label=_(u"Clutter short side - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + clutter_short_side__higher = FloatField( + label=_(u"Clutter short side - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + clutter_height__lower = FloatField( + label=_(u"Clutter height - lower than (cm)"), + widget=widgets.CentimeterMeterWidget) + clutter_height__higher = FloatField( + label=_(u"Clutter height - higher than (cm)"), + widget=widgets.CentimeterMeterWidget) + dimensions_comment = forms.CharField( + label=_(u"Dimensions comment")) + + base_finds__topographic_localisation = forms.CharField( + label=_(u"Point of topographic reference"), + ) + checked_type = forms.ChoiceField(label=_("Check")) + check_date__after = forms.DateField( + label=_(u"Check date after"), widget=DatePicker + ) + check_date__before = forms.DateField( + label=_(u"Check date before"), widget=DatePicker + ) integrities = forms.ChoiceField(label=_(u"Integrity / interest"), choices=[]) remarkabilities = forms.ChoiceField(label=_(u"Remarkability"), choices=[]) - base_finds__find__description = forms.CharField(label=_(u"Description")) - base_finds__batch = forms.ChoiceField( - label=_(u"Batch/object"), choices=[]) - checked_type = forms.ChoiceField(label=_("Check")) + conservatory_state = forms.ChoiceField(label=_(u"Conservatory state"), + choices=[]) + alterations = forms.ChoiceField( + label=_(u"Alteration"), choices=[]) + alteration_causes = forms.ChoiceField( + label=_(u"Alteration cause"), choices=[]) + preservation_to_considers = forms.ChoiceField( + choices=[], label=_(u"Preservation type")) + treatment_emergency = forms.ChoiceField( + choices=[], label=_(u"Treatment emergency") + ) + + estimated_value__higher = FloatField( + label=_(u"Estimated value - higher than")) + estimated_value__lower = FloatField( + label=_(u"Estimated value - lower than")) + insurance_value__higher = FloatField( + label=_(u"Insurance value - higher than")) + insurance_value__lower = FloatField( + label=_(u"Insurance value - lower than")) + appraisal_date__after = forms.DateField( + label=_(u"Appraisal date after"), widget=DatePicker) + appraisal_date__before = forms.DateField( + label=_(u"Appraisal date before"), widget=DatePicker) + conservatory_comment = forms.CharField( + label=_(u"Conservatory comment")) + documents__image__isnull = forms.NullBooleanField(label=_(u"Has an image?")) loan = forms.NullBooleanField(label=_(u"Loan?")) treatments_file_end_date = forms.DateField( @@ -906,10 +1099,8 @@ class FindSelect(HistorySelect): TYPES = [ FieldType('datings__period', Period), - FieldType('material_types', models.MaterialType), FieldType('conservatory_state', models.ConservatoryState), FieldType('base_finds__batch', models.BatchType), - FieldType('object_types', models.ObjectType), FieldType('preservation_to_considers', models.TreatmentType), FieldType('integrities', models.IntegrityType), FieldType('remarkabilities', models.RemarkabilityType), @@ -917,6 +1108,11 @@ class FindSelect(HistorySelect): FieldType('base_finds__context_record__operation__operation_type', OperationType), FieldType('checked_type', models.CheckedType), + FieldType('material_type_quality', models.MaterialTypeQualityType), + FieldType('object_type_quality', models.ObjectTypeQualityType), + FieldType('communicabilities', models.CommunicabilityType), + FieldType('alterations', models.AlterationType), + FieldType('alteration_causes', models.AlterationCauseType), ] def __init__(self, *args, **kwargs): diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 81ac94a41..b49c4655e 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -798,8 +798,7 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms, 'base_finds__context_record__archaeological_site__name': 'base_finds__context_record__archaeological_site__name', 'datings__period': 'datings__period__pk', - 'base_finds__find__description': - 'base_finds__find__description__icontains', + 'description': 'description__icontains', 'base_finds__batch': 'base_finds__batch', 'basket_id': 'basket__pk', 'denomination': 'denomination', @@ -914,10 +913,10 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms, SearchAltName( pgettext_lazy("key for text search", u"remarkability"), 'remarkabilities__label__iexact'), - 'base_finds__find__description': + 'description': SearchAltName( pgettext_lazy("key for text search", u"description"), - 'base_finds__find__description__iexact'), + 'description__iexact'), 'base_finds__batch': SearchAltName( pgettext_lazy("key for text search", u"batch"), @@ -994,6 +993,247 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms, pgettext_lazy("key for text search", u"treatment-end-date-before"), 'treatments__file__end_date__lte'), + 'previous_id': + SearchAltName( + pgettext_lazy("key for text search", u"previous-id"), + 'previous_id__iexact'), + 'seal_number': + SearchAltName( + pgettext_lazy(u"key for text search", u"seal-number"), + 'seal_number__iexact'), + 'base_finds__excavation_id': + SearchAltName( + pgettext_lazy(u"key for text search", u"excavation-id"), + 'base_finds__excavation_id__iexact'), + 'museum_id': + SearchAltName( + pgettext_lazy(u"key for text search", u"museum-id"), + 'museum_id__iexact'), + 'mark': + SearchAltName( + pgettext_lazy(u"key for text search", u"mark"), + 'mark__iexact'), + 'base_finds__discovery_date__before': + SearchAltName( + pgettext_lazy(u"key for text search", u"discovery-date-before"), + 'base_finds__discovery_date__lte'), + 'base_finds__discovery_date__after': + SearchAltName( + pgettext_lazy(u"key for text search", u"discovery-date-after"), + 'base_finds__discovery_date__gte'), + 'base_finds__discovery_date_tpq__before': + SearchAltName( + pgettext_lazy(u"key for text search", + u"discovery-date-tpq-before"), + 'base_finds__discovery_date_tpq__lte'), + 'base_finds__discovery_date_tpq__after': + SearchAltName( + pgettext_lazy(u"key for text search", + u"discovery-date-tpq-after"), + 'base_finds__discovery_date_tpq__gte'), + 'base_finds__discovery_date_taq__before': + SearchAltName( + pgettext_lazy(u"key for text search", + u"discovery-date-taq-before"), + 'base_finds__discovery_date_taq__lte'), + 'base_finds__discovery_date_taq__after': + SearchAltName( + pgettext_lazy(u"key for text search", + u"discovery-date-taq-after"), + 'base_finds__discovery_date_taq__gte'), + 'is_complete': + SearchAltName( + pgettext_lazy(u"key for text search", u"is-complete"), + 'is_complete'), + 'material_type_quality': + SearchAltName( + pgettext_lazy(u"key for text search", u"material-type-quality"), + 'material_type_quality__label__iexact'), + 'object_type_quality': + SearchAltName( + pgettext_lazy(u"key for text search", u"object-type-quality"), + 'object_type_quality__label__iexact'), + 'find_number': + SearchAltName( + pgettext_lazy(u"key for text search", u"find-number"), + 'find_number'), + 'min_number_of_individuals': + SearchAltName( + pgettext_lazy(u"key for text search", + u"min-number-of-individuals"), + 'min_number_of_individuals'), + 'decoration': + SearchAltName( + pgettext_lazy(u"key for text search", u"decoration"), + 'decoration__iexact'), + 'inscription': + SearchAltName( + pgettext_lazy(u"key for text search", u"inscription"), + 'inscription__iexact'), + 'manufacturing_place': + SearchAltName( + pgettext_lazy(u"key for text search", u"manufacturing-place"), + 'manufacturing_place__iexact'), + 'communicabilities': + SearchAltName( + pgettext_lazy(u"key for text search", u"communicabilities"), + 'communicabilities__label__iexact'), + 'comment': + SearchAltName( + pgettext_lazy(u"key for text search", u"comment"), + 'comment__iexact'), + 'dating_comment': + SearchAltName( + pgettext_lazy(u"key for text search", u"dating-comment"), + 'dating_comment__iexact'), + 'length__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"length-lower"), + 'length__lte'), + 'width__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"width-lower"), + 'width__lte'), + 'height__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"height-lower"), + 'height__lte'), + 'thickness__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"thickness-lower"), + 'thickness__lte'), + 'diameter__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"diameter-lower"), + 'diameter__lte'), + 'circumference__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"circumference-lower"), + 'circumference__lte'), + 'volume__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"volume-lower"), + 'volume__lte'), + 'weight__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"weight-lower"), + 'weight__lte'), + 'clutter_long_side__lower': + SearchAltName( + pgettext_lazy(u"key for text search", + u"clutter-long-side-lower"), + 'clutter_long_side__lte'), + 'clutter_short_side__lower': + SearchAltName( + pgettext_lazy(u"key for text search", + u"clutter-short-side-lower"), + 'clutter_short_side__lte'), + 'clutter_height__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"clutter-height-lower"), + 'clutter_height__lte'), + 'length__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"length-higher"), + 'length__gte'), + 'width__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"width-higher"), + 'width__gte'), + 'height__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"height-higher"), + 'height__gte'), + 'thickness__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"thickness-higher"), + 'thickness__gte'), + 'diameter__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"diameter-higher"), + 'diameter__gte'), + 'circumference__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"circumference-higher"), + 'circumference__gte'), + 'volume__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"volume-higher"), + 'volume__gte'), + 'weight__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"weight-higher"), + 'weight__gte'), + 'clutter_long_side__higher': + SearchAltName( + pgettext_lazy(u"key for text search", + u"clutter-long-side-higher"), + 'clutter_long_side__gte'), + 'clutter_short_side__higher': + SearchAltName( + pgettext_lazy(u"key for text search", + u"clutter-short-side-higher"), + 'clutter_short_side__gte'), + 'clutter_height__higher': + SearchAltName( + pgettext_lazy(u"key for text search", u"clutter-height-higher"), + 'clutter_height__gte'), + + 'dimensions_comment': + SearchAltName( + pgettext_lazy(u"key for text search", u"dimensions-comment"), + 'dimensions_comment__icontains'), + 'base_finds__topographic_localisation': + SearchAltName( + pgettext_lazy(u"key for text search", + u"topographic-localisation"), + 'base_finds__topographic_localisation__iexact'), + 'check_date__before': + SearchAltName( + pgettext_lazy(u"key for text search", u"check-date-before"), + 'check_date__lte'), + 'check_date__after': + SearchAltName( + pgettext_lazy(u"key for text search", u"check-date-after"), + 'check_date__gte'), + 'alterations': + SearchAltName( + pgettext_lazy(u"key for text search", u"alterations"), + 'alterations__label__iexact'), + 'alteration_causes': + SearchAltName( + pgettext_lazy(u"key for text search", u"alteration-causes"), + 'alteration_causes__label__iexact'), + 'treatment_emergency': + SearchAltName( + pgettext_lazy(u"key for text search", u"treatment-emergency"), + 'treatment_emergency__label__iexact'), + 'estimated_value__higher': + SearchAltName( + pgettext_lazy(u"key for text search", + u"estimated-value-higher"), + 'estimated_value__gte'), + 'estimated_value__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"estimated-value-lower"), + 'estimated_value__lte'), + 'insurance_value__higher': + SearchAltName( + pgettext_lazy(u"key for text search", + u"insurance-value-higher"), + 'insurance_value__gte'), + 'insurance_value__lower': + SearchAltName( + pgettext_lazy(u"key for text search", u"insurance-value-lower"), + 'insurance_value__lte'), + 'appraisal_date__before': + SearchAltName( + pgettext_lazy(u"key for text search", u"appraisal-date-before"), + 'appraisal_date__lte'), + 'appraisal_date__after': + SearchAltName( + pgettext_lazy(u"key for text search", u"appraisal-date-after"), + 'appraisal_date__gte'), } DYNAMIC_REQUESTS = { diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js index 43ef6ff1a..715ba85d5 100644 --- a/ishtar_common/static/js/ishtar.js +++ b/ishtar_common/static/js/ishtar.js @@ -655,29 +655,29 @@ function open_window(url){ } function save_and_close_window(name_label, name_pk, item_name, item_pk){ - var main_page = opener.document; - jQuery(main_page).find("#"+name_label).val(item_name); - jQuery(main_page).find("#"+name_pk).val(item_pk); - opener.focus(); - self.close(); + var main_page = opener.document; + jQuery(main_page).find("#"+name_label).val(item_name); + jQuery(main_page).find("#"+name_pk).val(item_pk); + opener.focus(); + self.close(); } function save_and_close_window_many(name_label, name_pk, item_name, item_pk){ - var main_page = opener.document; - var lbl_ = jQuery(main_page).find("#"+name_label); - var val_ = jQuery(main_page).find("#"+name_pk); - if (val_.val()){ - var v = lbl_.val(); - v = v.slice(0, v.lastIndexOf(",")); - lbl_.val(v + ", " + item_name + ", "); - val_.val(val_.val() + ", " + item_pk); - lbl_.change(); - } else { - jQuery(main_page).find("#"+name_label).val(item_name); - jQuery(main_page).find("#"+name_pk).val(item_pk); - } - opener.focus(); - self.close(); + var main_page = opener.document; + var lbl_ = jQuery(main_page).find("#" + name_label); + var val_ = jQuery(main_page).find("#" + name_pk); + if (val_.val()){ + var v = lbl_.val(); + v = v.slice(0, v.lastIndexOf(",")); + lbl_.val(v + ", " + item_name + ", "); + val_.val(val_.val() + ", " + item_pk); + lbl_.change(); + } else { + jQuery(main_page).find("#" + name_label).val(item_name); + jQuery(main_page).find("#" + name_pk).val(item_pk); + } + opener.focus(); + self.close(); } function multiRemoveItem(selItems, name, idx){ @@ -782,6 +782,11 @@ function update_search_field(){ } } else if ($(this).filter(":text").length){ v = $(this).val(); + if (v.match( new RegExp(' > ') )){ + matches = v.split(' > '); + v = matches[matches.length - 1]; + } + } else if ($(this).filter('input[type="number"]').length){ v = $(this).val(); } diff --git a/ishtar_common/static/media/styles.css b/ishtar_common/static/media/styles.css index b5e8bab48..507948915 100644 --- a/ishtar_common/static/media/styles.css +++ b/ishtar_common/static/media/styles.css @@ -30,11 +30,6 @@ html{ display: none; } -.search .form-group { - margin-bottom: 0.2rem; - font-size: 0.9em; -} - #id_parcel_0, #id_parcel_1, #id_parcel_2{ width: 30%; display: inline-block; diff --git a/ishtar_common/templates/blocks/bs_form_snippet.html b/ishtar_common/templates/blocks/bs_form_snippet.html index caa20b016..f0f729e2c 100644 --- a/ishtar_common/templates/blocks/bs_form_snippet.html +++ b/ishtar_common/templates/blocks/bs_form_snippet.html @@ -50,10 +50,8 @@ <span aria-hidden="true">×</span> </button> <div class="form-group col-12" id="advanced-search-info"></div> - </div> - <div class="modal-body body-scroll search-fields"> - <div class="form-row justify-content-md-center"> - <div class="form-row col-md-6"> + <div class="row col-12 justify-content-center"> + <div class="form-row col-md-8"> <div class="input-group search-widget"> <span class="input-group-prepend"> <span class="input-group-text" title="{% trans 'Filter...' %}"> @@ -71,8 +69,8 @@ </div> </div> </div> - <hr> - + </div> + <div class="modal-body body-scroll search-fields"> {% endif %} {% if field.name in form.HEADERS %} {% if forloop.counter0 %} diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 8b2602dbc..5050f2d0d 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -192,9 +192,12 @@ account_deletion_wizard = wizards.IshtarUserDeletionWizard.as_view( def get_autocomplete_generic(model, extra=None): if not extra: extra = {'available': True} + def func(request): q = request.GET.get('term') query = Q(**extra) + if not q: + q = "" for q in q.split(' '): if not q: continue diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index aee4eb95d..cb9250b9c 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -30,7 +30,7 @@ from django.db.models import fields from django.forms import ClearableFileInput from django.forms.utils import flatatt from django.forms.widgets import CheckboxSelectMultiple as \ - CheckboxSelectMultipleBase + CheckboxSelectMultipleBase, NumberInput from django.template import loader from django.template.defaultfilters import slugify from django.utils.encoding import smart_unicode @@ -1115,3 +1115,7 @@ class DataTable(Select2Media, forms.RadioSelect): t = loader.get_template('blocks/DataTables.html') rendered += t.render(dct) return mark_safe(rendered) + + +class RangeInput(NumberInput): + input_type = 'range' diff --git a/scss/custom.scss b/scss/custom.scss index 4798291ea..b877a1255 100644 --- a/scss/custom.scss +++ b/scss/custom.scss @@ -106,6 +106,11 @@ pre { padding-bottom: 0; } +#advanced-search-info .alert{ + margin-bottom: 0.6rem; +} + + #modal-advanced-search .modal-header .alert-secondary{ background-color: $white; } @@ -114,8 +119,13 @@ pre { background-color: $gray-200; } +.modal-header .input-group-text{ + background-color: $gray-300; + border-color: $gray-400; +} + .modal-body.body-scroll{ - max-height: calc(100vh - 200px); + max-height: calc(100vh - 300px); overflow-y: auto; } @@ -576,6 +586,14 @@ ul.compact{ /* search */ +.search .form-group { + font-size: 0.9em; + margin-bottom: 0; +} +.search .search-widget { + margin-bottom: 1rem; +} + .search_button{ display: none; } |