From 118468784c46aa339dd7e134dbd03e8b12b3e188 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= <francois.agneray@lam.fr>
Date: Mon, 10 Oct 2022 12:39:42 +0200
Subject: [PATCH] Add default ra dec unit (degree or hms)

---
 .../cone-search-config-form.component.html    |  8 ++++++
 .../cone-search-config-form.component.ts      |  3 +++
 .../components/cone-search.component.ts       |  5 ++++
 .../cone-search/components/dec.component.ts   |  7 ++++-
 .../cone-search/components/ra.component.ts    |  7 ++++-
 .../criteria/cone-search-tab.component.html   |  1 +
 .../models/cone-search-config.model.ts        |  1 +
 conf-dev/create-db.sh                         |  2 +-
 .../__CG__AppEntityConeSearchConfig.php       | 26 +++++++++++++++++--
 server/src/Action/ConeSearchConfigAction.php  |  3 +++
 server/src/Entity/ConeSearchConfig.php        | 24 ++++++++++++++---
 11 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.html b/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.html
index 09c4b3e1..f75a949f 100644
--- a/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.html
+++ b/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.html
@@ -43,6 +43,14 @@
         <label for="default_radius">Default radius</label>
         <input type="number" class="form-control" id="default_radius" name="default_radius" formControlName="default_radius">
     </div>
+    <div class="form-group">
+        <label for="default_ra_dec_unit">Default Ra & Dec unit</label>
+        <select class="form-control" id="default_ra_dec_unit" name="default_ra_dec_unit" formControlName="default_ra_dec_unit">
+            <option></option>
+            <option value="degree">Degree</option>
+            <option value="hms">HMS</option>
+        </select>
+    </div>
     <div class="custom-control custom-switch">
         <input class="custom-control-input" type="checkbox" id="plot_enabled" name="plot_enabled" formControlName="plot_enabled">
         <label class="custom-control-label" for="plot_enabled">Plot enabled</label>
diff --git a/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.ts b/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.ts
index 6b9300cb..d42ca619 100644
--- a/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.ts
+++ b/client/src/app/admin/instance/dataset/components/cone-search-config/cone-search-config-form.component.ts
@@ -31,6 +31,7 @@ export class ConeSearchConfigFormComponent implements OnInit {
         default_ra: new UntypedFormControl({value: null, disabled: true}),
         default_dec: new UntypedFormControl({value: null, disabled: true}),
         default_radius: new UntypedFormControl({value: 2.0, disabled: true}),
+        default_ra_dec_unit: new UntypedFormControl({value: 'degree', disabled: true}),
         plot_enabled: new UntypedFormControl({value: false, disabled: true})
     });
 
@@ -48,6 +49,7 @@ export class ConeSearchConfigFormComponent implements OnInit {
             this.form.controls.default_ra.enable();
             this.form.controls.default_dec.enable();
             this.form.controls.default_radius.enable();
+            this.form.controls.default_ra_dec_unit.enable();
             this.form.controls.plot_enabled.enable();
         } else {
             this.form.controls.opened.setValue(false);
@@ -58,6 +60,7 @@ export class ConeSearchConfigFormComponent implements OnInit {
             this.form.controls.default_ra.disable();
             this.form.controls.default_dec.disable();
             this.form.controls.default_radius.disable();
+            this.form.controls.default_ra_dec_unit.disable();
             this.form.controls.plot_enabled.disable();
         }
     }
diff --git a/client/src/app/instance/cone-search/components/cone-search.component.ts b/client/src/app/instance/cone-search/components/cone-search.component.ts
index d84ac055..e6b5921b 100644
--- a/client/src/app/instance/cone-search/components/cone-search.component.ts
+++ b/client/src/app/instance/cone-search/components/cone-search.component.ts
@@ -28,6 +28,7 @@ import { nanValidator, rangeValidator } from '../validators';
 export class ConeSearchComponent implements OnChanges, OnInit, OnDestroy {
     @Input() coneSearch: ConeSearch;
     @Input() defaultRadius: number;
+    @Input() defaultRaDecUnit: string;
     @Input() resolverEnabled: boolean;
     @Input() resolverIsLoading: boolean;
     @Input() resolverIsLoaded: boolean;
@@ -67,6 +68,10 @@ export class ConeSearchComponent implements OnChanges, OnInit, OnDestroy {
         if (this.defaultRadius) {
             this.form.controls.radius.setValue(this.defaultRadius);
         }
+
+        if (this.defaultRaDecUnit) {
+            this.unit = this.defaultRaDecUnit;
+        }
     }
 
     ngOnChanges(changes: SimpleChanges): void {
diff --git a/client/src/app/instance/cone-search/components/dec.component.ts b/client/src/app/instance/cone-search/components/dec.component.ts
index 7d8c3180..c6f3a72a 100644
--- a/client/src/app/instance/cone-search/components/dec.component.ts
+++ b/client/src/app/instance/cone-search/components/dec.component.ts
@@ -38,7 +38,12 @@ export class DecComponent implements OnInit, OnDestroy, OnChanges {
     public decDmsSubscription: Subscription;
 
     ngOnInit(): void {
-        this.form.controls.dec_dms.disable();
+        if (this.unit === 'degree') {
+            this.form.controls.dec_dms.disable();
+        } else {
+            this.form.controls.dec.disable();
+        }
+        
         this.decControlSubscription = this.form.controls.dec.valueChanges.pipe(debounceTime(250))
             .subscribe(deg => this.deg2DMS(deg));
     }
diff --git a/client/src/app/instance/cone-search/components/ra.component.ts b/client/src/app/instance/cone-search/components/ra.component.ts
index a177faac..3dec1ea4 100644
--- a/client/src/app/instance/cone-search/components/ra.component.ts
+++ b/client/src/app/instance/cone-search/components/ra.component.ts
@@ -38,7 +38,12 @@ export class RaComponent implements OnInit, OnDestroy, OnChanges  {
     public raHmsFormSubscription: Subscription;
 
     ngOnInit(): void {
-        this.form.controls.ra_hms.disable();
+        if (this.unit === 'degree') {
+            this.form.controls.ra_hms.disable();
+        } else {
+            this.form.controls.ra.disable();
+        }
+
         this.raControlSubscription = this.form.controls.ra.valueChanges.pipe(debounceTime(250))
             .subscribe(deg => this.deg2HMS(deg));
     }
diff --git a/client/src/app/instance/search/components/criteria/cone-search-tab.component.html b/client/src/app/instance/search/components/criteria/cone-search-tab.component.html
index 93a49003..ce576d70 100644
--- a/client/src/app/instance/search/components/criteria/cone-search-tab.component.html
+++ b/client/src/app/instance/search/components/criteria/cone-search-tab.component.html
@@ -17,6 +17,7 @@
                 <app-cone-search
                     [coneSearch]="coneSearch"
                     [defaultRadius]="coneSearchConfig.default_radius"
+                    [defaultRaDecUnit]="coneSearchConfig.default_ra_dec_unit"
                     [resolverEnabled]="coneSearchConfig.resolver_enabled"
                     [resolverIsLoading]="resolverIsLoading"
                     [resolverIsLoaded]="resolverIsLoaded"
diff --git a/client/src/app/metamodel/models/cone-search-config.model.ts b/client/src/app/metamodel/models/cone-search-config.model.ts
index e9adcd5d..85228e87 100644
--- a/client/src/app/metamodel/models/cone-search-config.model.ts
+++ b/client/src/app/metamodel/models/cone-search-config.model.ts
@@ -22,5 +22,6 @@ export interface ConeSearchConfig {
     default_ra: number;
     default_dec: number;
     default_radius: number;
+    default_ra_dec_unit: string;
     plot_enabled: boolean;
 }
diff --git a/conf-dev/create-db.sh b/conf-dev/create-db.sh
index b31c0258..d2bc1ce1 100644
--- a/conf-dev/create-db.sh
+++ b/conf-dev/create-db.sh
@@ -96,7 +96,7 @@ curl -d '{"id":6,"name":"zflag","label":"zflag","form_label":"zflag","descriptio
 curl -d '{"id":7,"name":"sel_mag","label":"sel_mag","form_label":"sel_mag","description":null,"primary_key":false,"output_display":70,"criteria_display":70,"search_type":"between","type":"decimal","operator":null,"dynamic_operator":true,"min":null,"max":null,"placeholder_min":null,"placeholder_max":null,"renderer":null,"renderer_config":null,"detail_display":70,"selected":true,"order_by":true,"archive":false,"detail":false,"options":null,"vo_utype":null,"vo_ucd":null,"vo_unit":null,"vo_description":null,"vo_datatype":null,"vo_size":null,"id_criteria_family":4,"id_output_category":5,"id_detail_output_category":null}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/attribute
 
 # Add vvds_f02_udeep cone search
-curl -d '{"enabled":true,"opened":false,"column_ra":3,"column_dec":4,"resolver_enabled":true,"default_ra":null,"default_dec":null,"default_radius":2.0,"plot_enabled":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/cone-search-config
+curl -d '{"enabled":true,"opened":false,"column_ra":3,"column_dec":4,"resolver_enabled":true,"default_ra":null,"default_dec":null,"default_radius":2.0,"default_ra_dec_unit":"degree","plot_enabled":true}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/cone-search-config
 
 # Add vvds_f02_udeep image
 curl -d '{"label":"Mag i","file_path":"/IMAGES/CFHTLS_D-85_i_022559-042940_T0007_MEDIAN.fits","file_size":1498320000,"ra_min":35.994643451078,"ra_max":36.99765934121,"dec_min":-3.9943006310031,"dec_max":-4.9941936740893,"stretch":"linear","pmin":0.2,"pmax":99}' --header 'Content-Type: application/json' -X POST http://localhost/dataset/vvds_f02_udeep/image
diff --git a/server/doctrine-proxy/__CG__AppEntityConeSearchConfig.php b/server/doctrine-proxy/__CG__AppEntityConeSearchConfig.php
index 34418046..ddb98c40 100644
--- a/server/doctrine-proxy/__CG__AppEntityConeSearchConfig.php
+++ b/server/doctrine-proxy/__CG__AppEntityConeSearchConfig.php
@@ -67,10 +67,10 @@ class ConeSearchConfig extends \App\Entity\ConeSearchConfig implements \Doctrine
     public function __sleep()
     {
         if ($this->__isInitialized__) {
-            return ['__isInitialized__', 'id', 'enabled', 'opened', 'columnRa', 'columnDec', 'resolverEnabled', 'defaultRa', 'defaultDec', 'defaultRadius', 'plotEnabled'];
+            return ['__isInitialized__', 'id', 'enabled', 'opened', 'columnRa', 'columnDec', 'resolverEnabled', 'defaultRa', 'defaultDec', 'defaultRadius', 'defaultRaDecUnit', 'plotEnabled'];
         }
 
-        return ['__isInitialized__', 'id', 'enabled', 'opened', 'columnRa', 'columnDec', 'resolverEnabled', 'defaultRa', 'defaultDec', 'defaultRadius', 'plotEnabled'];
+        return ['__isInitialized__', 'id', 'enabled', 'opened', 'columnRa', 'columnDec', 'resolverEnabled', 'defaultRa', 'defaultDec', 'defaultRadius', 'defaultRaDecUnit', 'plotEnabled'];
     }
 
     /**
@@ -368,6 +368,28 @@ class ConeSearchConfig extends \App\Entity\ConeSearchConfig implements \Doctrine
         return parent::setDefaultRadius($defaultRadius);
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultRaDecUnit()
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'getDefaultRaDecUnit', []);
+
+        return parent::getDefaultRaDecUnit();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setDefaultRaDecUnit($defaultRaDecUnit)
+    {
+
+        $this->__initializer__ && $this->__initializer__->__invoke($this, 'setDefaultRaDecUnit', [$defaultRaDecUnit]);
+
+        return parent::setDefaultRaDecUnit($defaultRaDecUnit);
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/server/src/Action/ConeSearchConfigAction.php b/server/src/Action/ConeSearchConfigAction.php
index 0ac63186..a6ab51ea 100644
--- a/server/src/Action/ConeSearchConfigAction.php
+++ b/server/src/Action/ConeSearchConfigAction.php
@@ -112,6 +112,7 @@ final class ConeSearchConfigAction extends AbstractAction
             'default_ra',
             'default_dec',
             'default_radius',
+            'default_ra_dec_unit',
             'plot_enabled'
         );
 
@@ -143,6 +144,7 @@ final class ConeSearchConfigAction extends AbstractAction
         $coneSearchConfig->setDefaultRa($parsedBody['default_ra']);
         $coneSearchConfig->setDefaultDec($parsedBody['default_dec']);
         $coneSearchConfig->setDefaultRadius($parsedBody['default_radius']);
+        $coneSearchConfig->setDefaultRaDecUnit($parsedBody['default_ra_dec_unit']);
         $coneSearchConfig->setPlotEnabled($parsedBody['plot_enabled']);
 
         $dataset->setConeSearchConfig($coneSearchConfig);
@@ -169,6 +171,7 @@ final class ConeSearchConfigAction extends AbstractAction
         $coneSearchConfig->setDefaultRa($parsedBody['default_ra']);
         $coneSearchConfig->setDefaultDec($parsedBody['default_dec']);
         $coneSearchConfig->setDefaultRadius($parsedBody['default_radius']);
+        $coneSearchConfig->setDefaultRaDecUnit($parsedBody['default_ra_dec_unit']);
         $coneSearchConfig->setPlotEnabled($parsedBody['plot_enabled']);
         $this->em->flush();
     }
diff --git a/server/src/Entity/ConeSearchConfig.php b/server/src/Entity/ConeSearchConfig.php
index 78423043..9ec28c9f 100644
--- a/server/src/Entity/ConeSearchConfig.php
+++ b/server/src/Entity/ConeSearchConfig.php
@@ -66,26 +66,33 @@ class ConeSearchConfig implements \JsonSerializable
     protected $resolverEnabled;
 
     /**
-     * @var bool
+     * @var float
      *
      * @Column(type="float", name="default_ra", nullable=true)
      */
     protected $defaultRa;
 
     /**
-     * @var bool
+     * @var float
      *
      * @Column(type="float", name="default_dec", nullable=true)
      */
     protected $defaultDec;
 
     /**
-     * @var bool
+     * @var float
      *
      * @Column(type="float", name="default_radius", nullable=false, options={"default" : "2.0"}))
      */
     protected $defaultRadius;
 
+    /**
+     * @var string
+     *
+     * @Column(type="string", name="default_ra_dec_unit", nullable=false, options={"default" : "degree"}))
+     */
+    protected $defaultRaDecUnit;
+
     /**
      * @var bool
      *
@@ -178,6 +185,16 @@ class ConeSearchConfig implements \JsonSerializable
         $this->defaultRadius = $defaultRadius;
     }
 
+    public function getDefaultRaDecUnit()
+    {
+        return $this->defaultRaDecUnit;
+    }
+
+    public function setDefaultRaDecUnit($defaultRaDecUnit)
+    {
+        $this->defaultRaDecUnit = $defaultRaDecUnit;
+    }
+
     public function getPlotEnabled()
     {
         return $this->plotEnabled;
@@ -200,6 +217,7 @@ class ConeSearchConfig implements \JsonSerializable
             'default_ra' => $this->getDefaultRa(),
             'default_dec' => $this->getDefaultDec(),
             'default_radius' => $this->getDefaultRadius(),
+            'default_ra_dec_unit' => $this->getDefaultRaDecUnit(),
             'plot_enabled' => $this->getPlotEnabled()
         ];
     }
-- 
GitLab