From 0b0bb4be517c458afd3477cc3514eed25223b21c Mon Sep 17 00:00:00 2001 From: vnmedeiros Date: Fri, 2 Dec 2022 15:59:53 -0300 Subject: [PATCH] feat: add geo coordinate metadata component --- .../geocoordinate/FormGeoCoordinate.vue | 49 ++++++++++++++ .../geocoordinate/GeoCoordinate.vue | 47 ++++++++++++++ .../class-tainacan-geocoordinate.php | 64 +++++++++++++++++++ .../class-tainacan-metadata-type-helper.php | 1 + src/views/admin/js/admin-main.js | 7 ++ 5 files changed, 168 insertions(+) create mode 100644 src/views/admin/components/metadata-types/geocoordinate/FormGeoCoordinate.vue create mode 100644 src/views/admin/components/metadata-types/geocoordinate/GeoCoordinate.vue create mode 100644 src/views/admin/components/metadata-types/geocoordinate/class-tainacan-geocoordinate.php diff --git a/src/views/admin/components/metadata-types/geocoordinate/FormGeoCoordinate.vue b/src/views/admin/components/metadata-types/geocoordinate/FormGeoCoordinate.vue new file mode 100644 index 000000000..0dbe20a18 --- /dev/null +++ b/src/views/admin/components/metadata-types/geocoordinate/FormGeoCoordinate.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/src/views/admin/components/metadata-types/geocoordinate/GeoCoordinate.vue b/src/views/admin/components/metadata-types/geocoordinate/GeoCoordinate.vue new file mode 100644 index 000000000..e51f431b3 --- /dev/null +++ b/src/views/admin/components/metadata-types/geocoordinate/GeoCoordinate.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/src/views/admin/components/metadata-types/geocoordinate/class-tainacan-geocoordinate.php b/src/views/admin/components/metadata-types/geocoordinate/class-tainacan-geocoordinate.php new file mode 100644 index 000000000..82a26ad3f --- /dev/null +++ b/src/views/admin/components/metadata-types/geocoordinate/class-tainacan-geocoordinate.php @@ -0,0 +1,64 @@ +set_primitive_type('geo'); + $this->set_component('tainacan-geocoordinate'); + $this->set_form_component('tainacan-form-geocoordinate'); + $this->set_name( __('Geographical Location', 'tainacan') ); + $this->set_description( __('Represents a geographical location that is determined by latitude and longitude coordinates.', 'tainacan') ); + $this->set_preview_template(' +
+
+ !!POINT IN MAP!! +
+
+ '); + } + + /** + * Validates a given coordinate + * + * @param float|int|string $lat Latitude + * @param float|int|string $long Longitude + * @return bool `true` if the coordinate is valid, `false` if not + */ + private function validateLatLong($lat, $long) { + return preg_match('/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?),[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/', $lat.','.$long); + } + + public function validate( Item_Metadata_Entity $item_metadata) { + $value = $item_metadata->get_value(); + $value = is_array($value) ? $value : [$value]; + foreach ($value as $coordinate) { + $arr_coordinate = explode(",", $coordinate); + if( count($arr_coordinate) != 2 || !$this->validateLatLong($arr_coordinate[0], $arr_coordinate[1])) { + $this->add_error( sprintf(__('The value (%s) is not a valid geo coordinate', 'tainacan'), $coordinate ) ); + return false; + } + } + return true; + } + + /** + * Get the value as a HTML string with proper date format set in admin + * @return string + */ + public function get_value_as_html(\Tainacan\Entities\Item_Metadata_Entity $item_metadata) { + $value = $item_metadata->get_value(); + $return = is_array($value) ? implode(" - ", $value) : $value; + return $return; + } +} \ No newline at end of file diff --git a/src/views/admin/components/metadata-types/metadata-type-helper/class-tainacan-metadata-type-helper.php b/src/views/admin/components/metadata-types/metadata-type-helper/class-tainacan-metadata-type-helper.php index a70d192e5..b2157c651 100644 --- a/src/views/admin/components/metadata-types/metadata-type-helper/class-tainacan-metadata-type-helper.php +++ b/src/views/admin/components/metadata-types/metadata-type-helper/class-tainacan-metadata-type-helper.php @@ -42,6 +42,7 @@ class Metadata_Type_Helper { $this->Tainacan_Metadata->register_metadata_type('Tainacan\Metadata_Types\Compound'); $this->Tainacan_Metadata->register_metadata_type('Tainacan\Metadata_Types\User'); $this->Tainacan_Metadata->register_metadata_type('Tainacan\Metadata_Types\Control'); + $this->Tainacan_Metadata->register_metadata_type('Tainacan\Metadata_Types\GeoCoordinate'); // the priority should see less than on function // `load_admin_page()` of class `Admin` in file /src/views/class-tainacan-admin.php diff --git a/src/views/admin/js/admin-main.js b/src/views/admin/js/admin-main.js index aacdcb910..d8deacbf7 100644 --- a/src/views/admin/js/admin-main.js +++ b/src/views/admin/js/admin-main.js @@ -45,6 +45,7 @@ import Relationship from '../components/metadata-types/relationship/Relationship import Taxonomy from '../components/metadata-types/taxonomy/Taxonomy.vue'; import Compound from '../components/metadata-types/compound/Compound.vue'; import User from '../components/metadata-types/user/User.vue'; +import GeoCoordinate from '../components/metadata-types/geocoordinate/GeoCoordinate.vue' import FormText from '../components/metadata-types/text/FormText.vue'; import FormRelationship from '../components/metadata-types/relationship/FormRelationship.vue'; @@ -52,6 +53,8 @@ import FormTaxonomy from '../components/metadata-types/taxonomy/FormTaxonomy.vue import FormSelectbox from '../components/metadata-types/selectbox/FormSelectbox.vue'; import FormNumeric from '../components/metadata-types/numeric/FormNumeric.vue'; import FormUser from '../components/metadata-types/user/FormUser.vue'; +import FormGeoCoordinate from '../components/metadata-types/geocoordinate/FormGeoCoordinate.vue'; + import FilterNumeric from '../components/filter-types/numeric/Numeric.vue'; import FilterDate from '../components/filter-types/date/Date.vue'; @@ -212,6 +215,8 @@ export default (element) => { Vue.component('tainacan-taxonomy', Taxonomy); Vue.component('tainacan-compound', Compound); Vue.component('tainacan-user', User); + Vue.component('tainacan-geocoordinate', GeoCoordinate); + /* Metadata Option forms */ Vue.component('tainacan-form-text', FormText); @@ -221,6 +226,8 @@ export default (element) => { Vue.component('tainacan-form-numeric', FormNumeric); Vue.component('tainacan-form-user', FormUser); Vue.component('term-edition-form', TermEditionForm); + Vue.component('tainacan-form-geocoordinate', FormGeoCoordinate); + /* Filters */ Vue.component('tainacan-filter-numeric', FilterNumeric);