Procházet zdrojové kódy

structures details basis completed

Olivier Massot před 4 roky
rodič
revize
8da41f32e3
23 změnil soubory, kde provedl 288 přidání a 82 odebrání
  1. 89 30
      ot_core/Classes/Http/ApiController.php
  2. 6 0
      ot_core/Configuration/Backend/Routes.php
  3. 67 30
      ot_templating/Resources/Private/Layouts/Classic/StructuresFrame.html
  4. 78 20
      ot_templating/Resources/Public/assets/Classic/script/structures.js
  5. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-blue.css
  6. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-blue.css.map
  7. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-green.css
  8. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-green.css.map
  9. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-grey.css
  10. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-grey.css.map
  11. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-light-blue.css
  12. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-light-blue.css.map
  13. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-light-red.css
  14. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-light-red.css.map
  15. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-orange.css
  16. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-orange.css.map
  17. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-purple.css
  18. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-purple.css.map
  19. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-red.css
  20. 0 0
      ot_templating/Resources/Public/assets/Classic/style/classic-red.css.map
  21. 48 2
      ot_templating/Resources/Public/assets/Classic/style/module/_structuresframe.scss
  22. 0 0
      ot_templating/Resources/Public/assets/Classic/style/style.css
  23. 0 0
      ot_templating/Resources/Public/assets/Classic/style/style.css.map

+ 89 - 30
ot_core/Classes/Http/ApiController.php

@@ -2,6 +2,7 @@
 
 namespace Opentalent\OtCore\Http;
 
+use Opentalent\OtCore\Exception\ApiRequestException;
 use PDO;
 use TYPO3\CMS\Core\Http\JsonResponse;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -14,16 +15,12 @@ use TYPO3\CMS\Core\Http\ServerRequest;
 class ApiController
 {
     /**
-     * -- Target of the route 'all' --
-     *
-     * Get all of the Opentalent structures directly
-     * from the Opentalent DB (API Platform is too slow with so many records)
+     * Return a connection to the DB matching the current context
      *
      * @param ServerRequest $request
-     * @return JsonResponse
+     * @return PDO
      */
-    public function getAllStructures(ServerRequest $request)
-    {
+    private function getCnn(ServerRequest $request) {
         if ($_SERVER['HTTP_HOST'] == 'typo3' | $_SERVER['HTTP_HOST'] == 'local.sub.opentalent.fr') {
             $db_host = 'db';
         } elseif ($_SERVER['HTTP_HOST'] == 'preprod.opentalent.fr') {
@@ -40,34 +37,96 @@ class ApiController
         );
         $cnn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
+        return $cnn;
+    }
+
+    /**
+     * -- Target of the route 'all' --
+     *
+     * Get all of the Opentalent structures directly
+     * from the Opentalent DB (API Platform is too slow with so many records)
+     *
+     * @param ServerRequest $request
+     * @return JsonResponse
+     */
+    public function getAllStructures(ServerRequest $request)
+    {
+        $cnn = $this->getCnn($request);
+
         $stmt = $cnn->prepare(
             "SELECT o.id, o.name, o.logo_id as logoId, o.principalType, p.otherWebsite as website, a.latitude, a.longitude,
-           TRIM(BOTH ' ' FROM CONCAT(a.streetAddress, ' ', a.streetAddressSecond, ' ', a.streetAddressThird)) AS streetAddress,
-           a.postalCode, a.addressCity, c.name AS country,
-            (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(f.code)))
-            FROM Activity AS a
-            LEFT JOIN activity_categories AS ac ON(ac.activity_id = a.id)
-            LEFT JOIN Categories AS cs ON (cs.id = ac.categories_id)
-            LEFT JOIN Familly AS f ON(f.id = cs.familly_id)
-            WHERE a.organization_id = o.id) AS categories,
-           n1.parent_id as n1Id, net1.name as n1Name, n2.parent_id as n2Id, n3.parent_id as n3Id, n4.parent_id as n4Id, n5.parent_id as n5Id,
-           CONCAT_WS(',', n1.parent_id, n2.parent_id, n3.parent_id, n4.parent_id, n5.parent_id) as parents
-    FROM opentalent.Organization o
-        INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
-        INNER JOIN (SELECT * FROM opentalent.OrganizationAddressPostal WHERE `type`='ADDRESS_HEAD_OFFICE') oa on oa.organization_id = o.id
-        INNER JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
-        LEFT JOIN opentalent.Country c ON (c.id = a.addressCountry_id)
-        INNER JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n1 on n1.organization_id = o.id
-        INNER JOIN Organization net1 ON net1.id = n1.parent_id
-        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n2 on n2.organization_id = n1.parent_id
-        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n3 on n3.organization_id = n2.parent_id
-        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n4 on n4.organization_id = n3.parent_id
-        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n5 on n5.organization_id = n4.parent_id
-"
-        );
+                       TRIM(BOTH ' ' FROM CONCAT(a.streetAddress, ' ', a.streetAddressSecond, ' ', a.streetAddressThird)) AS streetAddress,
+                       a.postalCode, a.addressCity, c.name AS country,
+                        (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(f.code)))
+                        FROM Activity AS a
+                        LEFT JOIN activity_categories AS ac ON(ac.activity_id = a.id)
+                        LEFT JOIN Categories AS cs ON (cs.id = ac.categories_id)
+                        LEFT JOIN Familly AS f ON(f.id = cs.familly_id)
+                        WHERE a.organization_id = o.id) AS categories,
+                       n1.parent_id as n1Id, net1.name as n1Name, n2.parent_id as n2Id, n3.parent_id as n3Id, n4.parent_id as n4Id, n5.parent_id as n5Id,
+                       CONCAT_WS(',', n1.parent_id, n2.parent_id, n3.parent_id, n4.parent_id, n5.parent_id) as parents
+                    FROM opentalent.Organization o
+                        INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
+                        INNER JOIN (SELECT * FROM opentalent.OrganizationAddressPostal WHERE `type`='ADDRESS_HEAD_OFFICE') oa on oa.organization_id = o.id
+                        INNER JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
+                        LEFT JOIN opentalent.Country c ON (c.id = a.addressCountry_id)
+                        INNER JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n1 on n1.organization_id = o.id
+                        INNER JOIN Organization net1 ON net1.id = n1.parent_id
+                        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n2 on n2.organization_id = n1.parent_id
+                        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n3 on n3.organization_id = n2.parent_id
+                        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n4 on n4.organization_id = n3.parent_id
+                        LEFT JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n5 on n5.organization_id = n4.parent_id
+        ;");
         $stmt->execute();
         $stmt->setFetchMode(PDO::FETCH_ASSOC);
         $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
         return new JsonResponse($data);
     }
+
+    /**
+     * -- Target of the route 'get' --
+     *
+     * Get a structure directly with the specific data required in the structures template
+     *
+     * @param ServerRequest $request
+     * @return JsonResponse
+     * @throws ApiRequestException
+     */
+    public function getStructureById(ServerRequest $request)
+    {
+        $params = $request->getQueryParams();
+        $organizationId = $params['organization-id'];
+        if (!$organizationId) {
+            throw new ApiRequestException('Missing argument: organization-id');
+        }
+        $cnn = $this->getCnn($request);
+
+        $stmt = $cnn->prepare(
+            "SELECT o.id, o.name, o.logo_id as logoId, o.principalType, p.otherWebsite as website, a.latitude, a.longitude,
+                       TRIM(BOTH ' ' FROM CONCAT(a.streetAddress, ' ', a.streetAddressSecond, ' ', a.streetAddressThird)) AS streetAddress,
+                       a.postalCode, a.addressCity, c.name AS country, cp.telphone, cp.email,
+                        (SELECT CONCAT(GROUP_CONCAT(DISTINCT CONCAT(f.code)))
+                            FROM Activity AS a
+                            LEFT JOIN activity_categories AS ac ON (ac.activity_id = a.id)
+                            LEFT JOIN Categories AS cs ON (cs.id = ac.categories_id)
+                            LEFT JOIN Familly AS f ON (f.id = cs.familly_id)
+                            WHERE a.organization_id = o.id) 
+                        AS categories,
+                       n1.parent_id as n1Id, net1.name as n1Name
+                    FROM opentalent.Organization o
+                        INNER JOIN opentalent.Parameters p on o.parameters_id = p.id
+                        INNER JOIN (SELECT * FROM opentalent.OrganizationAddressPostal WHERE `type`='ADDRESS_HEAD_OFFICE') oa on oa.organization_id = o.id
+                        INNER JOIN opentalent.AddressPostal a on oa.addressPostal_id = a.id
+                        LEFT JOIN opentalent.Country c ON (c.id = a.addressCountry_id)
+                        INNER JOIN (SELECT * FROM NetworkOrganization WHERE parent_id NOT IN (32366, 13) AND (endDate IS NULL OR endDate = '0000-00-00')) n1 on n1.organization_id = o.id
+                        INNER JOIN Organization net1 ON net1.id = n1.parent_id
+                        LEFT JOIN opentalent.organization_contactpoint ocp ON ocp.organization_id = o.id
+                        LEFT JOIN opentalent.ContactPoint cp ON cp.id = ocp.contactPoint_id and cp.contactType = 'PRINCIPAL'
+                    WHERE o.id=" . $organizationId . ";"
+        );
+        $stmt->execute();
+        $stmt->setFetchMode(PDO::FETCH_ASSOC);
+        $data = $stmt->fetch(PDO::FETCH_ASSOC);
+        return new JsonResponse($data);
+    }
 }

+ 6 - 0
ot_core/Configuration/Backend/Routes.php

@@ -11,5 +11,11 @@ return [
         'path' => '/otcore/structures/all',
         'target' => ApiController::class . '::getAllStructures',
         'access' => 'public'
+    ],
+    // Get a json array containing the data for the requested opentalent structure
+    'get-by-id' => [
+        'path' => '/otcore/structures/get',
+        'target' => ApiController::class . '::getStructureById',
+        'access' => 'public'
     ]
 ];

+ 67 - 30
ot_templating/Resources/Private/Layouts/Classic/StructuresFrame.html

@@ -231,41 +231,78 @@
                 <a class="btn go-back" href="#"><f:translate key="go-back"/></a>
                 <h2><f:translate key="member-companies"/></h2>
             </header>
-            <div class="structure-header">
-                <img src="" alt="logo" class="logo" />
-                <h3 class="name"></h3>
-                <span class="social">
-                    <a href="" class="facebook" style="display: none">
-                        <i class="fab fa-facebook" style="color: #129af6"></i>
-                    </a>
-                    <a href="" class="instagram" style="display: none">
-                        <i class="fab fa-instagram-square" style="color: #f2f2f2"></i>
-                    </a>
-                    <a href="" class="twitter" style="display: none">
-                        <i class="fab fa-twitter" style="color: #1da1f2"></i>
-                    </a>
-                </span>
-            </div>
-            <div class="illustration-container">
-
-            </div>
-            <div class="categories-tags">
-
-            </div>
-            <div class="details">
-                <div class="description">
-
+            <span class="please-wait">
+                <f:image src="EXT:ot_templating/Resources/Public/media/gear.gif"
+                         alt="{f:translate(key: 'please-wait')}"
+                         style="margin-top:100px; width:70px"/>
+            </span>
+            <div class="content" style="display: none">
+                <div class="structure-header">
+                    <f:image src="EXT:ot_templating/Resources/Public/media/event-default.jpg" alt="logo" class="logo"/>
+                    <h3 class="name"></h3>
+                    <span class="social">
+                        <a href="" class="facebook" style="display: none">
+                            <i class="fab fa-facebook" style="color: #129af6"></i>
+                        </a>
+                        <a href="" class="instagram" style="display: none">
+                            <i class="fab fa-instagram-square" style="color: #f2f2f2"></i>
+                        </a>
+                        <a href="" class="twitter" style="display: none">
+                            <i class="fab fa-twitter" style="color: #1da1f2"></i>
+                        </a>
+                    </span>
+                </div>
+                <div class="illustration-container">
+                    <f:image src="EXT:ot_templating/Resources/Public/media/event-default-modern.jpg" alt=""/>
                 </div>
-                <div class="contact">
+                <div class="categories-tags">
 
                 </div>
-            </div>
+                <div class="details">
+                    <div class="description">
+                        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
+                        dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
+                        ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
+                        eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
+                        deserunt mollit anim id est laborum.
+                    </div>
+                    <div class="contact">
+                        <table>
+                            <tr>
+                                <td><i class="fas fa-map-marker-alt"></i></td>
+                                <td class="address"></td>
+                            </tr>
+                            <tr>
+                                <td><i class="fas fa-phone-alt"></i></td>
+                                <td class="phone"></td>
+                            </tr>
+                            <tr>
+                                <td><i class="fas fa-envelope"></i></td>
+                                <td class="mail"></td>
+                            </tr>
+                            <tr>
+                                <td><i class="fas fa-globe-europe"></i></td>
+                                <td class="website"></td>
+                            </tr>
+                            <f:comment>
+                                <!-- <tr> -->
+                                <!--   <td><i class="fas fa-flag"></i></td> -->
+                                <!--   <td class="province"></td> -->
+                                <!-- </tr> -->
+                            </f:comment>
+                            <tr>
+                                <td><i class="fas fa-project-diagram"></i></td>
+                                <td class="network"></td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
 
-            <div class="spot-on-bar">
-                <a href="" class="btn"><f:translate key="spot-on-from"/></a>
-            </div>
+                <div class="spot-on-bar">
+                    <a href="" class="btn" disabled><f:translate key="spot-on-from"/> 01/01/2021</a>
+                </div>
 
-            <div id="structure-details-map">
+                <div id="structure-details-map" style="display: none"></div>
             </div>
         </div>
     </div>

+ 78 - 20
ot_templating/Resources/Public/assets/Classic/script/structures.js

@@ -1,6 +1,7 @@
 // Specific code for the 'federation-structures' page
 
-const apiGetUrl = "/typo3/index.php?route=/otcore/structures/all";
+const apiGetAllUrl = "/typo3/index.php?route=/otcore/structures/all";
+const apiGetByIdUrl = "/typo3/index.php?route=/otcore/structures/get";
 
 // Converts numeric degrees to radians
 function toRad(Value)
@@ -68,7 +69,6 @@ $(document).ready(function() {
         throw 'Missing organization-id parameter';
     }
 
-
     // Translations
     let tr = {};
     $('#labels').find('span').each(function (i, elt) {
@@ -87,7 +87,7 @@ $(document).ready(function() {
         'OTAU':tr['OTAU'],
     }
 
-    // #### Instanciate and populate leaflet map
+    // #### Instanciate and populate leaflet maps
     let mapDiv = $('#structure-map').first();
     let mapId = $(mapDiv).attr("id");
 
@@ -95,8 +95,6 @@ $(document).ready(function() {
     const mapOptions = {scrollWheelZoom: false, zoomSnap: 0.25};
     map = L.map(mapId, mapOptions);
     map.setView([46.71, 2.14], 6);
-
-    // Add the tile layer
     L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
         attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
     }).addTo(map);
@@ -118,6 +116,19 @@ $(document).ready(function() {
 
     var clusters = null;
 
+    // Details view map
+    const structureMapOptions = {scrollWheelZoom: true, zoomSnap: 0.25};
+    let structureMap = L.map('structure-details-map', structureMapOptions);
+    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
+        attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+    }).addTo(structureMap);
+
+    // Call this method when a map is hidden or shown to force a re-rendering
+    function resizeMaps() {
+        map.invalidateSize();
+        structureMap.invalidateSize();
+    }
+
 
     // #### Filters
 
@@ -370,7 +381,7 @@ $(document).ready(function() {
 
         $.ajax({
             type: 'GET',
-            url: apiGetUrl,
+            url: apiGetAllUrl,
             dataType: "json",
             contentType: "application/json; charset=utf-8",
             timeout : 12000,
@@ -624,45 +635,92 @@ $(document).ready(function() {
     });
 
     // Structure details
+
+    function formatFrenchPhoneNumber(number) {
+        const regexPhoneNumber = /\+33([1-9])(\d{2})(\d{2})(\d{2})(\d{2})$/;
+
+        if (number && number.match(regexPhoneNumber)) {
+            return number.replace(regexPhoneNumber, '0$1 $2 $3 $4 $5');
+        } else {
+            return number;
+        }
+    }
+
     function populateDetailsView(structure) {
+        console.log(structure);
         let logo = structureFrameDetails.find('.structure-header .logo').first();
         logo.attr('src', structure.logoUri);
 
         let title = structureFrameDetails.find('.structure-header .name').first();
         title.text(structure.name)
+
+        let contact = structureFrameDetails.find('.contact').first();
+        contact.find('.address').first().text(
+            [structure.streetAddress, structure.postalCode, structure.addressCity].join(" ")
+        );
+        contact.find('.phone').first().text(formatFrenchPhoneNumber(structure.telphone));
+        contact.find('.mail').first().text(structure.email);
+        contact.find('.website').first().text(structure.website);
+        contact.find('.province').first().text('...');
+        contact.find('.network').first().text(structure.n1Name);
+
+        if (structure.longitude && structure.latitude) {
+            // clear previous markers
+            structureMap.eachLayer(function(layer) {
+                if (layer instanceof L.MarkerClusterGroup) { map.removeLayer(layer) }
+            })
+
+            // add structure position
+            let marker = L.marker([structure.latitude, structure.longitude]);
+            marker.bindPopup(`<b>${structure.name}</b><br/>${structure.postalCode} ${structure.addressCity}<br/><a href="${structure.website}" target="_blank">${structure.website}</a>`);
+            marker.addTo(structureMap);
+
+            // zoom on the newly created marker
+            var latLngs = [ marker.getLatLng() ];
+            var markerBounds = L.latLngBounds(latLngs);
+            structureMap.fitBounds(markerBounds);
+
+            // show map
+            structureFrameDetails.find('#structure-details-map').first().show();
+        }
     }
 
     structureFrame.on('click', '.structure-see', function(e) {
         e.preventDefault();
         const organizationId = $(this).data('organization-id');
 
+        structureFrame.hide();
+        structureFrameDetails.show();
+
         $.ajax({
             type: 'GET',
-            url: '',
+            url: apiGetByIdUrl + '&organization-id=' + organizationId,
             dataType: "json",
             contentType: "application/json; charset=utf-8",
             timeout : 5000
         })
-            .done(function(res) {
-                structure = res["hydra:member"];
-
-                populateDetailsView(structure)
-                structureFrame.hide();
-                structureFrameDetails.show();
-            })
-            .fail(function(xhr, textStatus, errorThrown) {
-                pleaseWaitSpan.hide();
-                errorMsgSpan.show();
-                throw 'Error while fetching the API data: ' + textStatus  + ' - ' + errorThrown;
-            });
-
+        .done(function(res) {
+            structure = res;
+            populateDetailsView(structure)
 
+            structureFrameDetails.find('.please-wait').first().hide();
+            structureFrameDetails.find('.content').first().show();
+            resizeMaps()
+        })
+        .fail(function(xhr, textStatus, errorThrown) {
+            pleaseWaitSpan.hide();
+            errorMsgSpan.show();
+            throw 'Error while fetching the API data: ' + textStatus  + ' - ' + errorThrown;
+        });
     })
 
     structureFrameDetails.on('click', '.go-back', function (e) {
         e.preventDefault();
 
+        structureFrameDetails.find('.please-wait').first().show();
+        structureFrameDetails.find('.content').first().hide();
         structureFrameDetails.hide();
         structureFrame.show();
+        resizeMaps();
     })
 });

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-blue.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-blue.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-green.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-green.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-grey.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-grey.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-light-blue.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-light-blue.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-light-red.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-light-red.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-orange.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-orange.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-purple.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-purple.css.map


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-red.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/classic-red.css.map


+ 48 - 2
ot_templating/Resources/Public/assets/Classic/style/module/_structuresframe.scss

@@ -470,11 +470,30 @@ $input-border-color: #bfbfbf;
 .ot-structures-frame-details {
   flex-direction: column;
 
+  .please-wait {
+    @include flex;
+    flex-direction: row;
+    width: 100vw;
+    height: 100vh;
+    justify-content: center;
+    align-items: center;
+  }
+
+  .content {
+    margin: 18px 10%;
+    max-width: 80%;
+  }
+
   header {
     @include flex;
     flex-direction: row;
     background-color: #d9d9d9;
 
+    .go-back {
+      margin: 0 16px;
+      padding: 4px 8px;
+    }
+
     h2 {
       font-size: 14px;
       flex: 1
@@ -487,9 +506,13 @@ $input-border-color: #bfbfbf;
 
     .logo {
       width: 45px;
+      margin: 4px 12px;
     }
 
     h3 {
+      font-size: 18px;
+      color: $btn-background-color;
+      font-weight: 750;
       flex: 1
     }
 
@@ -500,9 +523,14 @@ $input-border-color: #bfbfbf;
   }
 
   .illustration-container {
+    @include flex;
+    flex-direction: row;
     margin: 40px 20%;
+    justify-content: center;
 
     img {
+      max-height: 180px;
+      width: auto;
     }
   }
 
@@ -514,17 +542,30 @@ $input-border-color: #bfbfbf;
   .details {
     @include flex;
     flex-direction: row;
+    max-width: 100%;
 
     .description {
       @include flex;
       flex-direction: column;
-      padding-right: 25px;
       border-right: solid 2px $btn-background-color;
+      width: 45%;
+      padding-right: 5%;
     }
     .contact {
       @include flex;
       flex-direction: column;
-      padding-left: 25px;
+      width: 45%;
+      padding-left: 5%;
+    }
+
+    .contact td {
+      background: none;
+      border: none;
+      width: 80%;
+    }
+    .contact td:first-child {
+      width: 20%;
+      color: $btn-background-color;
     }
   }
 
@@ -533,4 +574,9 @@ $input-border-color: #bfbfbf;
     flex-direction: row;
   }
 
+  #structure-details-map {
+    height: 300px;
+    margin-top: 45px;
+  }
+
 }

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/style.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ot_templating/Resources/Public/assets/Classic/style/style.css.map


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů