Bläddra i källkod

#1904 Classes module: class view page, new icon, minor changes

Alex Trofimov 6 år sedan
förälder
incheckning
8fb57979d0

+ 0 - 1
modules/boonex/classes/classes/BxClssConfig.php

@@ -73,7 +73,6 @@ class BxClssConfig extends BxBaseModTextConfig
             
             // page URIs
             'URI_VIEW_ENTRY' => 'view-class',
-            'URI_AUTHOR_ENTRIES' => 'classes-author',
             'URI_ENTRIES_BY_CONTEXT' => 'classes-context',
             'URI_ADD_ENTRY' => 'create-class',
             'URI_EDIT_ENTRY' => 'edit-class',

+ 12 - 5
modules/boonex/classes/classes/BxClssDb.php

@@ -26,19 +26,20 @@ class BxClssDb extends BxBaseModTextDb
 
     public function getPrevEntry ($iClassId)
     {        
-        return $this->_getNextPrevEntry($iClassId, 'DESC');
+        return $this->_getNextPrevEntry($iClassId, 'DESC', '<=');
     }
 
     public function getNextEntry ($iClassId)
     {        
-        return $this->_getNextPrevEntry($iClassId, 'ASC');
+        return $this->_getNextPrevEntry($iClassId, 'ASC', '>=');
     }
 
-    protected function _getNextPrevEntry ($iClassId, $sSorting = 'DESC')
+    protected function _getNextPrevEntry ($iClassId, $sSorting = 'DESC', $sOp = '<=')
     {        
         $aClass = $this->getRow("SELECT `c`.`id`, `c`.`order`, `m`.`order` as `order_module` FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` AS `c` INNER JOIN `" . $this->_oConfig->CNF['TABLE_MODULES'] . "` AS `m` ON (`m`.`id` = `c`.`module_id`) WHERE `c`.`id` = :class", array('class' => $iClassId));
-        $sQuery = "SELECT `c`.`*`, `m`.`module_title` FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` AS `c` INNER JOIN `" . $this->_oConfig->CNF['TABLE_MODULES'] . "` AS `m` ON (`m`.`id` = `c`.`module_id`) WHERE `m`.`order` <= :order_module AND `c`.`order` <= :order AND `c`.`id` != :id ORDER BY `m`.`order` DESC, `c`.`order` DESC LIMIT 1";
-        
+
+        $sQuery = "SELECT `c`.`*`, `m`.`module_title` FROM `" . $this->_oConfig->CNF['TABLE_ENTRIES'] . "` AS `c` INNER JOIN `" . $this->_oConfig->CNF['TABLE_MODULES'] . "` AS `m` ON (`m`.`id` = `c`.`module_id`) WHERE `m`.`order`*1000000 + `c`.`order` $sOp :order_module*1000000 + :order AND `c`.`id` != :id ORDER BY `m`.`order`*1000000 + `c`.`order` $sSorting LIMIT 1";
+
         $a = $this->getRow($sQuery, array(
             'order_module' => $aClass['order_module'], 
             'order' => $aClass['order'],
@@ -63,6 +64,12 @@ class BxClssDb extends BxBaseModTextDb
             return $this->getAll($sQuery);
     }
 
+    public function getClassModuleTitleById ($iModuleId)
+    {
+        $sQuery = $this->prepare ("SELECT `module_title` FROM `" . $this->_oConfig->CNF['TABLE_MODULES'] . "` WHERE `id` = ?", $iModuleId);
+        return $this->getOne($sQuery);
+    }
+
     public function updateModulesOrder ($iProfileConextId, $aModulesOrder)
     {
         $iAffected = 0;

+ 30 - 0
modules/boonex/classes/classes/BxClssFormEntry.php

@@ -213,6 +213,36 @@ class BxClssFormEntry extends BxBaseModTextFormEntry
 
         return parent::getCode($bDynamicMode);
     }
+
+    protected function genCustomViewRowValueCompletedWhen($aInput)
+    {
+        unset($aInput['values_list_name']);
+        return $aInput['value'] ? '<div class="bx-classes-field-view-completed-when">' . $this->genViewRowValueForSelect($aInput) . '</div>' : '';
+    }
+
+    protected function genCustomViewRowValueModuleId($aInput)
+    {
+        return $aInput['value'] ? '<div class="bx-classes-field-view-module">' . bx_process_output($this->_oModule->_oDb->getClassModuleTitleById ($aInput['value'])) . '</div>' : '';
+    }
+
+    protected function genCustomViewRowValueStartDate($aInput)
+    {
+        return $this->_genCustomViewRowValue($aInput, 'col-green1-dark');
+    }
+
+    protected function genCustomViewRowValueEndDate($aInput)
+    {
+        return $this->_genCustomViewRowValue($aInput, 'col-red1');
+    }
+
+    protected function _genCustomViewRowValue($aInput, $sClassAdd = '')
+    {
+        $sClass = "bx-classes-field-view-" . str_replace('_', '-', $aInput['name']) . ' ' . $sClassAdd;
+        $sClass .= ' ' . $sClassAdd;
+
+        $aInput['name'] .= '!';
+        return '<div class="' . $sClass . '">' . parent::genViewRowValue($aInput) . '</div>';
+    }
 }
 
 /** @} */

+ 72 - 46
modules/boonex/classes/classes/BxClssModule.php

@@ -235,10 +235,80 @@ class BxClssModule extends BxBaseModTextModule
         return parent::serviceCheckAllowedCommentsView($iContentId, $sObjectComments);
     }
 
+    public function serviceNextClass ($iClassId = 0)
+    {
+        return $this->_serviceNextClass ($iClassId, 'getNextEntry');
+    }
+
+    public function servicePrevClass ($iClassId = 0)
+    {
+        return $this->_serviceNextClass ($iClassId, 'getPrevEntry');
+    }
+
+    protected function _serviceNextClass ($iClassId, $sFunc)
+    {
+        if (!$iClassId)
+            $iClassId = (int)bx_get('id');
+
+        if (!($aClass = $this->_oDb->$sFunc ($iClassId)))
+            return '';
+
+        return $this->_getClassRow($aClass);
+    }
+
+    protected function _getClassRow ($aClass, &$iCounterCompleted = null, &$iCounterAvail = null, &$iCounterNa = null)
+    {
+        $sStatusClass = '';
+        // check class availability
+        $mixedAvailability = $this->checkAllowedViewForProfile($aClass, bx_get_logged_profile_id());
+        $sTip = '';
+        if ($mixedAvailability !== CHECK_ACTION_RESULT_ALLOWED) {
+            if (null !== $iCounterNa) ++$iCounterNa;
+            $sStatusClass = 'bx-classes-class-status-na';
+            $sTip = strip_tags($mixedAvailability);
+        }
+        // check if class is completed
+        elseif ($this->serviceIsClassCompleted($aClass['id'])) {
+            if (null !== $iCounterCompleted) ++$iCounterCompleted;
+            $sStatusClass = 'bx-classes-class-status-completed';
+        }
+        // class is available
+        else {
+            if (null !== $iCounterAvail) ++$iCounterAvail;
+            $sStatusClass = 'bx-classes-class-status-avail';
+        }
+
+        $aContent = array (
+            'title' => bx_process_output($aClass['title']),
+            'url' => $this->serviceGetLink($aClass['id']),
+            'tip' => bx_html_attribute($sTip),
+            'date_created' => bx_time_js($aClass['added']),
+            'start_date' => $aClass['start_date'] ? _t('_bx_classes_txt_start_x', bx_time_js($aClass['start_date'], BX_FORMAT_DATE_TIME)) : '',
+            'end_date' => $aClass['end_date'] ? _t('_bx_classes_txt_due_x', bx_time_js($aClass['end_date'], BX_FORMAT_DATE_TIME)) : '',
+        );
+
+        return $this->_oTemplate->parseHtmlByName('classes_class_row.html', array(
+            'id' => $aClass['id'],                        
+            'status' => $sStatusClass,
+            'bx_if:completed' => array(
+                'condition' => 'bx-classes-class-status-completed' == $sStatusClass,
+                'content' => $aContent,
+            ),
+            'bx_if:avail' => array(
+                'condition' => 'bx-classes-class-status-avail' == $sStatusClass,
+                'content' => $aContent,
+            ),
+            'bx_if:na' => array(
+                'condition' => 'bx-classes-class-status-na' == $sStatusClass,
+                'content' => $aContent,
+            ),
+        ));
+    }
+
     public function serviceClassesInContext ($iContextProfileId = 0)
     {
         if (!$iContextProfileId)
-            $iContextProfileId = (int)bx_get('id') ? bx_get('id') : bx_get('profile_id');
+            $iContextProfileId = (int)bx_get('profile_id');
 
         if (!($oContextProfile = BxDolProfile::getInstance($iContextProfileId)))
             return MsgBox(_t('_sys_txt_error_occured'));
@@ -264,51 +334,7 @@ class BxClssModule extends BxBaseModTextModule
             $sContent = '';
             if ($aClasses) {
                 foreach ($aClasses as $aClass) {
-                    $sStatusClass = '';
-                    // check class availability
-                    $mixedAvailability = $this->checkAllowedViewForProfile($aClass, bx_get_logged_profile_id());
-                    $sTip = '';
-                    if ($mixedAvailability !== CHECK_ACTION_RESULT_ALLOWED) {
-                        ++$iCounterNa;
-                        $sStatusClass = 'bx-classes-class-status-na';
-                        $sTip = strip_tags($mixedAvailability);
-                    }
-                    // check if class is completed
-                    elseif ($this->serviceIsClassCompleted($aClass['id'])) {
-                        ++$iCounterCompleted;
-                        $sStatusClass = 'bx-classes-class-status-completed';
-                    }
-                    // class is available
-                    else {
-                        ++$iCounterAvail;
-                        $sStatusClass = 'bx-classes-class-status-avail';
-                    }
-   
-                    $aContent = array (
-                        'title' => bx_process_output($aClass['title']),
-                        'url' => $this->serviceGetLink($aClass['id']),
-                        'tip' => bx_html_attribute($sTip),
-                        'date_created' => bx_time_js($aClass['added']),
-                        'start_date' => $aClass['start_date'] ? _t('_bx_classes_txt_start_x', bx_time_js($aClass['start_date'], BX_FORMAT_DATE_TIME)) : '',
-                        'end_date' => $aClass['end_date'] ? _t('_bx_classes_txt_due_x', bx_time_js($aClass['end_date'], BX_FORMAT_DATE_TIME)) : '',
-                    );
-
-                    $sContent .= $this->_oTemplate->parseHtmlByName('classes_class_row.html', array(
-                        'id' => $aClass['id'],                        
-                        'status' => $sStatusClass,
-                        'bx_if:completed' => array(
-                            'condition' => 'bx-classes-class-status-completed' == $sStatusClass,
-                            'content' => $aContent,
-                        ),
-                        'bx_if:avail' => array(
-                            'condition' => 'bx-classes-class-status-avail' == $sStatusClass,
-                            'content' => $aContent,
-                        ),
-                        'bx_if:na' => array(
-                            'condition' => 'bx-classes-class-status-na' == $sStatusClass,
-                            'content' => $aContent,
-                        ),
-                    ));
+                    $sContent .= $this->_getClassRow($aClass, $iCounterCompleted, $iCounterAvail, $iCounterNa);
                 }
             }
 

+ 2 - 0
modules/boonex/classes/install/langs/en.xml

@@ -133,6 +133,8 @@
     <string name="_bx_classes_page_block_title_entry_info"><![CDATA[Info]]></string>
     <string name="_bx_classes_page_block_title_sys_entry_context"><![CDATA[Classed in]]></string>
     <string name="_bx_classes_page_block_title_entry_context"><![CDATA[Classed in]]></string>
+    <string name="_bx_classes_page_block_title_next_entry"><![CDATA[Next class]]></string>
+    <string name="_bx_classes_page_block_title_prev_entry"><![CDATA[Previous class]]></string>
 
     <string name="_bx_classes_menu_title_entry_attachments"><![CDATA[Form Attachments]]></string>
     <string name="_bx_classes_menu_set_title_entry_attachments"><![CDATA[Form Attachments]]></string>

+ 3 - 1
modules/boonex/classes/install/sql/enable.sql

@@ -54,9 +54,11 @@ INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `lay
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_text', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 2),
-('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_author', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:13:\"entity_author\";}', 0, 0, 1, 1),
+('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_author', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:13:\"entity_author\";}', 0, 0, 0, 1),
 ('bx_classes_view_entry', 3, 'bx_classes', '_bx_classes_page_block_title_sys_entry_context', '_bx_classes_page_block_title_entry_context', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:14:\"entity_context\";}', 0, 0, 1, 1),
 ('bx_classes_view_entry', 3, 'bx_classes', '', '_bx_classes_page_block_title_entry_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 2),
+('bx_classes_view_entry', 3, 'bx_classes', '', '_bx_classes_page_block_title_next_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_classes";s:6:"method";s:10:"next_class";}', 0, 0, 1, 3),
+('bx_classes_view_entry', 3, 'bx_classes', '', '_bx_classes_page_block_title_prev_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_classes";s:6:"method";s:10:"prev_class";}', 0, 0, 0, 4),
 ('bx_classes_view_entry', 3, 'bx_classes', '', '_bx_classes_page_block_title_entry_location', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:15:\"entity_location\";}', 0, 0, 0, 0),
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:18:\"entity_all_actions\";}', 0, 0, 1, 3),
 ('bx_classes_view_entry', 4, 'bx_classes', '', '_bx_classes_page_block_title_entry_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:14:\"entity_actions\";}', 0, 0, 0, 0),

+ 5 - 4
modules/boonex/classes/install/sql/install.sql

@@ -481,10 +481,11 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_classes_entry_edit', 'do_submit', 2147483647, 1, 16),
 
 ('bx_classes_entry_view', 'module_id', 2147483647, 1, 1),
-('bx_classes_entry_view', 'added', 2147483647, 1, 2),
-('bx_classes_entry_view', 'changed', 2147483647, 1, 3),
-('bx_classes_entry_view', 'start_date', 2147483647, 1, 4),
-('bx_classes_entry_view', 'end_date', 2147483647, 1, 5);
+('bx_classes_entry_view', 'completed_when', 2147483647, 1, 2),
+('bx_classes_entry_view', 'added', 2147483647, 1, 3),
+('bx_classes_entry_view', 'changed', 2147483647, 1, 4),
+('bx_classes_entry_view', 'start_date', 2147483647, 1, 5),
+('bx_classes_entry_view', 'end_date', 2147483647, 1, 6);
 
 -- FORMS: poll
 INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_attrs`, `submit_name`, `table`, `key`, `uri`, `uri_title`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES

+ 1 - 1
modules/boonex/classes/js/main.js

@@ -50,7 +50,7 @@ function bx_classes_reorder_classes(iProfileId, bEnable)
                 items:'.bx-classes-class',
                 connectWith: ".bx-form-input-wrapper-custom",
                 handle: '.handle',
-                placeholder: 'bx-classes-placeholder sys-icon arrow-right',
+                placeholder: 'bx-classes-placeholder bx-def-font-h3 sys-icon arrow-right col-green1 sys-colored',
                 forcePlaceholderSize: true, 
                 dropOnEmpty: true,
                 stop: function(oEvent, oUi) {

+ 9 - 2
modules/boonex/classes/template/css/main.css

@@ -12,8 +12,9 @@
     min-height:1rem;
 }
 
-html .bx-classes-class-title {
-    line-height:2rem;
+.bx-course-classes .bx-classes-placeholder:not(:first-child),
+.bx-course-classes .bx-classes-class:not(:first-child) {
+    margin-top:1rem;
 }
 
 .bx-classes-btn-done {
@@ -39,3 +40,9 @@ html .bx-classes-class-title {
 .bx-course-classes .handle {
     cursor:move;
 }
+
+.bx-classes-field-view-module,
+.bx-classes-field-view-end-date,
+.bx-classes-field-view-start-date {
+    font-weight:bold;
+}

+ 12 - 113
modules/boonex/classes/template/images/icons/std-icon.svg

@@ -1,116 +1,15 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   inkscape:version="1.0 (4035a4f, 2020-05-01)"
-   sodipodi:docname="std-icon.svg"
-   id="svg45"
-   version="1.1"
-   viewBox="0 0 64 64"
-   height="64px"
-   width="64px">
-  <title
-     id="title10">Classes</title>
-  <defs
-     id="defs28">
-    <path
-       id="path-1"
-       d="M32,64 C46.0222222,64 53.8173667,64 58.9086889,58.9086889 C64,53.8173667 64,46.0222222 64,32 C64,17.9777778 64,10.1826333 58.9086889,5.09131111 C53.8173667,0 46.0222222,0 32,0 C17.9777778,0 10.1826333,0 5.09131111,5.09131111 C0,10.1826333 0,17.9777778 0,32 C0,46.0222222 0,53.8173667 5.09131111,58.9086889 C10.1826333,64 17.9777778,64 32,64 Z" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="scale(0.87287156,1.1456439)"
-       id="linearGradient-3"
-       y2="34.914862"
-       x2="17.457431"
-       y1="0"
-       x1="17.457431">
-      <stop
-         id="stop15"
-         offset="0%"
-         stop-color="#FDFEFF" />
-      <stop
-         id="stop17"
-         offset="100%"
-         stop-opacity="0.9"
-         stop-color="#FBFCFD" />
-    </linearGradient>
-    <path
-       id="path-4"
-       d="M17.7777778,10.625 L17.7777778,0 L1.9047619,0 C0.849206349,0 0,0.8359375 0,1.875 L0,38.125 C0,39.1640625 0.849206349,40 1.9047619,40 L28.5714286,40 C29.6269841,40 30.4761905,39.1640625 30.4761905,38.125 L30.4761905,12.5 L19.6825397,12.5 C18.6349206,12.5 17.7777778,11.65625 17.7777778,10.625 Z M22.8571429,29.0625 C22.8571429,29.578125 22.4285714,30 21.9047619,30 L8.57142857,30 C8.04761905,30 7.61904762,29.578125 7.61904762,29.0625 L7.61904762,28.4375 C7.61904762,27.921875 8.04761905,27.5 8.57142857,27.5 L21.9047619,27.5 C22.4285714,27.5 22.8571429,27.921875 22.8571429,28.4375 L22.8571429,29.0625 Z M22.8571429,24.0625 C22.8571429,24.578125 22.4285714,25 21.9047619,25 L8.57142857,25 C8.04761905,25 7.61904762,24.578125 7.61904762,24.0625 L7.61904762,23.4375 C7.61904762,22.921875 8.04761905,22.5 8.57142857,22.5 L21.9047619,22.5 C22.4285714,22.5 22.8571429,22.921875 22.8571429,23.4375 L22.8571429,24.0625 Z M22.8571429,18.4375 L22.8571429,19.0625 C22.8571429,19.578125 22.4285714,20 21.9047619,20 L8.57142857,20 C8.04761905,20 7.61904762,19.578125 7.61904762,19.0625 L7.61904762,18.4375 C7.61904762,17.921875 8.04761905,17.5 8.57142857,17.5 L21.9047619,17.5 C22.4285714,17.5 22.8571429,17.921875 22.8571429,18.4375 Z M30.4761905,9.5234375 L30.4761905,10 L20.3174603,10 L20.3174603,0 L20.8015873,0 C21.3095238,0 21.7936508,0.1953125 22.1507937,0.546875 L29.9206349,8.203125 C30.2777778,8.5546875 30.4761905,9.03125 30.4761905,9.5234375 Z" />
-    <filter
-       id="filter-5"
-       filterUnits="objectBoundingBox"
-       height="110.0%"
-       width="113.1%"
-       y="-2.5%"
-       x="-6.6%">
-      <feOffset
-         id="feOffset21"
-         result="shadowOffsetOuter1"
-         in="SourceAlpha"
-         dy="1"
-         dx="0" />
-      <feGaussianBlur
-         id="feGaussianBlur23"
-         result="shadowBlurOuter1"
-         in="shadowOffsetOuter1"
-         stdDeviation="0.5" />
-      <feColorMatrix
-         id="feColorMatrix25"
-         in="shadowBlurOuter1"
-         type="matrix"
-         values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" />
-    </filter>
-  </defs>
-  <g
-     fill-rule="evenodd"
-     fill="none"
-     stroke-width="1"
-     stroke="none"
-     id="Page-1">
-    <g
-       transform="translate(-340,-430)"
-       id="Artboard">
-      <g
-         transform="translate(340,430)"
-         id="posts">
-        <mask
-           fill="#ffffff"
-           id="mask-2">
-          <use
-             height="100%"
-             width="100%"
-             y="0"
-             x="0"
-             id="use30"
-             xlink:href="#path-1" />
-        </mask>
-        <use
-           height="100%"
-           width="100%"
-           y="0"
-           x="0"
-           xlink:href="#path-1"
-           fill="#00b356"
-           id="Path" />
-        <path
-           d="M 358.39604,-56.114146 79.456041,-141.81415 c -15.2,-4.67 -31.6,-4.67 -46.79,0 l -278.950001,85.700004 c -23.54,7.23 -23.54,38.36 0,45.59 l 48.63,14.9399999 c -10.67,13.1900001 -17.23,29.2800001 -17.88,46.9000001 -9.63,5.52 -16.41,15.48 -16.41,27.37 0,10.78 5.68,19.85 13.86,25.649996 l -25.53,114.88 c -2.22,9.99 5.38,19.47 15.61,19.47 h 56.11 c 10.24,0 17.84,-9.48 15.62,-19.47 l -25.53,-114.88 c 8.18,-5.799996 13.86,-14.869996 13.86,-25.649996 0,-11.57 -6.47,-21.25 -15.66,-26.87 0.76,-15.02 8.44,-28.3 20.69,-36.72 l 195.570001,60.09 c 9.06,2.78 26.44,6.25 46.79,0 l 278.949999,-85.7 c 23.55,-7.24 23.55,-38.36 0,-45.6 z M 88.846041,105.77585 c -28.53,8.76 -52.84,3.92 -65.59,0 l -145.020001,-44.549996 -14.18,113.459996 c 0,35.35 85.960001,64 192.000001,64 106.039999,0 191.999999,-28.65 191.999999,-64 l -14.18,-113.469996 z"
-           id="path51" />
-        <path
-           id="path977"
-           d="M 7.4822014,47.56034 6.8941629,47.084175 8.0156784,42.014538 9.1371939,36.944901 8.5743518,36.154462 C 7.8222244,35.098197 7.8470078,33.863335 8.6361724,33.07417 8.9797372,32.730606 9.404317,31.879691 9.5796832,31.183248 9.7550497,30.486805 10.143003,29.57366 10.441801,29.154036 10.740599,28.734412 10.942238,28.353791 10.889888,28.308212 10.837537,28.262632 9.860643,27.951061 8.719012,27.615833 7.5773809,27.280604 6.354763,26.779347 6.0020834,26.501929 5.1784259,25.854041 5.1579786,24.717627 5.9572468,24.010019 6.3266795,23.682953 11.275956,22.038102 18.962459,19.687844 c 10.87668,-3.3257 12.562177,-3.774528 13.650909,-3.635075 2.059464,0.263792 25.323526,7.552061 25.694451,8.049673 0.457669,0.613981 0.415041,1.811993 -0.08217,2.309201 -0.439941,0.439942 -1.91772,0.924637 -16.28567,5.341517 -7.646566,2.350646 -9.340203,2.788446 -10.337581,2.672235 -0.656039,-0.07644 -4.900516,-1.279642 -9.432172,-2.673785 -4.531656,-1.394143 -8.367826,-2.534805 -8.524822,-2.534805 -0.455688,0 -1.597201,1.505794 -1.78308,2.352099 -0.134764,0.613573 -0.02933,0.91516 0.507676,1.452165 0.843314,0.843314 0.887512,2.048391 0.114922,3.133393 l -0.562842,0.790439 1.121516,5.069637 1.121515,5.069637 -0.588038,0.476165 c -0.854062,0.691576 -5.2408133,0.691576 -6.0948746,0 z"
-           style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.265066;stroke-opacity:1" />
-        <path
-           id="path979"
-           d="M 28.486065,47.752125 C 23.809129,47.392731 19.90226,46.3837 17.839641,45.002464 c -1.83833,-1.231042 -1.892029,-1.485698 -1.316496,-6.243276 0.628891,-5.198658 0.674313,-5.389905 1.241568,-5.227518 0.248515,0.07114 3.01636,0.94129 6.150768,1.933663 5.278089,1.671074 5.875087,1.804465 8.084519,1.806386 2.22316,0.0019 2.799366,-0.127841 8.4624,-1.905891 3.342241,-1.04938 6.147813,-1.907964 6.2346,-1.907964 0.08679,0 0.365516,1.759377 0.619394,3.909726 0.253878,2.15035 0.532367,4.338521 0.618861,4.862602 0.454273,2.752444 -4.545472,4.895735 -12.908722,5.533711 -1.956166,0.149223 -3.616305,0.254625 -3.689198,0.234227 -0.07289,-0.0204 -1.355965,-0.1311 -2.85127,-0.246005 z"
-           style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.265066;stroke-opacity:1" />
-      </g>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
+    <g transform="matrix(1,0,0,1,-453,-63)">
+        <g id="classes" transform="matrix(1,0,0,1,453,63)">
+            <path id="Path" d="M32,64C46.022,64 53.817,64 58.909,58.909C64,53.817 64,46.022 64,32C64,17.978 64,10.183 58.909,5.091C53.817,0 46.022,0 32,0C17.978,0 10.183,0 5.091,5.091C0,10.183 0,17.978 0,32C0,46.022 0,53.817 5.091,58.909C10.183,64 17.978,64 32,64Z" style="fill:rgb(0,179,86);"/>
+            <g id="users-class" transform="matrix(0.071875,0,0,0.071875,32,31.8)">
+                <g transform="matrix(1,0,0,1,-320,-256)">
+                    <path d="M608,217C590.525,201 567.693,192.082 544,192L544,64L96,64L96,192C72.307,192.083 49.476,201.002 32,217L32,49.59C32,22.25 53.53,0 80,0L560,0C586.47,0 608,22.25 608,49.59L608,217Z" style="fill:white;fill-opacity:0.4;fill-rule:nonzero;"/>
+                    <path d="M576,384L512,384C476.891,384 448,412.891 448,448L448,480C448,497.555 462.445,512 480,512L608,512C625.555,512 640,497.555 640,480L640,448C640,412.891 611.109,384 576,384ZM544,352C579.109,352 608,323.109 608,288C608,252.891 579.109,224 544,224C508.891,224 480,252.891 480,288C480,323.109 508.891,352 544,352ZM352,384L288,384C252.891,384 224,412.891 224,448L224,480C224,497.555 238.445,512 256,512L384,512C401.555,512 416,497.555 416,480L416,448C416,412.891 387.109,384 352,384ZM128,384L64,384C28.891,384 0,412.891 0,448L0,480C0,497.555 14.445,512 32,512L160,512C177.555,512 192,497.555 192,480L192,448C192,412.891 163.109,384 128,384ZM320,352C355.109,352 384,323.109 384,288C384,252.891 355.109,224 320,224C284.891,224 256,252.891 256,288C256,323.109 284.891,352 320,352ZM96,352C131.109,352 160,323.109 160,288C160,252.891 131.109,224 96,224C60.891,224 32,252.891 32,288C32,323.109 60.891,352 96,352Z" style="fill:white;fill-rule:nonzero;"/>
+                </g>
+            </g>
+        </g>
     </g>
-  </g>
 </svg>