From 1646c97b11045496e8808434d690ea94551ccf95 Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch>
Date: Fri, 3 May 2024 16:29:43 +0200
Subject: [PATCH] add line in sidebar menu; add getFormSelect

---
 public_html/classes/render-adminlte.class.php | 75 +++++++++++++++++--
 1 file changed, 70 insertions(+), 5 deletions(-)

diff --git a/public_html/classes/render-adminlte.class.php b/public_html/classes/render-adminlte.class.php
index 72f2e76..1035af9 100755
--- a/public_html/classes/render-adminlte.class.php
+++ b/public_html/classes/render-adminlte.class.php
@@ -11,6 +11,7 @@ require_once 'htmlelements.class.php';
  * 2023-09-11  <axel.hahn@unibe.ch>  add shadows on card + callout
  * 2023-09-27  <axel.hahn@unibe.ch>  add form input fields
  * 2023-11-17  <axel.hahn@unibe.ch>  add tabbed content; "=" renders hamburger item
+ * 2024-05-03  <axel.hahn@unibe.ch>  add line in sidebar menu; add getFormSelect
  * ======================================================================
  *
  * @author Axel
@@ -669,7 +670,12 @@ class renderadminlte {
 
 
     /** 
-     * get a navigation items for sidebar
+     * Get a navigation items for sidebar
+     * Links can be nested with the key "children".
+     * 
+     * Remark: for a horizontal line ($aLink['label']='-') this css is required
+     *   .nav-item hr{color: #505860; border-top: 1px solid; height: 1px; padding: 0; margin: 0; }
+     * 
      * @param  array  $aLinks  list of link items
      */
     public function getNavi2Items($aLinks){
@@ -677,7 +683,14 @@ class renderadminlte {
         if (!$aLinks || !is_array($aLinks) || !count($aLinks)){
             return false;
         }
+        
         foreach($aLinks as $aLink){
+
+            if ($aLink['label']=='-') {
+                // TODO: draw a nice line
+                $sReturn.='<li class="nav-item"><hr></li>';  
+                continue;
+            }
             // to render active or open links: 
             $aLink['class']='nav-link' . (isset($aLink['class']) ? ' '.$aLink['class'] : '');
 
@@ -1117,7 +1130,7 @@ class renderadminlte {
      * A colored box with large icon, text and a value.
      * https://adminlte.io/docs/3.2/components/boxes.html
      * 
-     * @param type $aOptions  hash with keys for all options
+     * @param array $aOptions  hash with keys for all options
      *                        styling:
      *                          - type    - color of the box; one of [none]|danger|dark|info|primary|secondary|success|warning
      *                          - iconbg  - background color or type of icon; use it for default type (type="")
@@ -1242,7 +1255,7 @@ class renderadminlte {
      * return a text input field:
      * https://adminlte.io/themes/v3/pages/forms/general.html
      * 
-     * @param type $aOptions  hash with keys for all options
+     * @param array $aOptions  hash with keys for all options
      *                        styling:
      *                          - type    - field type: text, email, password, hidden and all other html 5 input types
       *                        content
@@ -1310,8 +1323,8 @@ class renderadminlte {
     }
 
     /**
-     * return a textare field .. or html editor using summernote
-     * @param type $aOptions  hash with keys for all options
+     * return a textarea field .. or html editor using summernote
+     * @param array $aOptions  hash with keys for all options
      *                        styling:
      *                          - type    - field type: [none]|html
      *                        content
@@ -1348,6 +1361,58 @@ class renderadminlte {
 
     }
 
+    /**
+     * return a select box field
+     * @param array $aOptions  hash with keys for all options
+     *                        styling:
+     *                          - class   - css class
+     *                        option fields
+     *                          - options - array of options with keys per item:
+     *                              - value   - value in the option
+     *                              - label   - visible text in the option
+     *                              other keys are attributes in the option
+     *                        select tag
+     *                          - label   - label tag
+     *                          - name    - name attribute for sending form
+     *                          other keys are attributes in the select
+     * @return string
+     */
+    public function getFormSelect($aOptions){
+        $aElement=$aOptions;
+        $aElement['class']=''
+            . 'form-control '
+            . (isset($aOptions['class']) ? $aOptions['class']: '')
+        ;
+        
+        $sLabel=isset($aOptions['label']) ? $aOptions['label'] : '';
+        $sFormid=(isset($aOptions['id']) 
+        
+            ? $aOptions['id'] 
+            : (isset($aOptions['name']) ? $aOptions['name'] : 'field' ).'-'.md5(microtime(true))
+        );
+
+        $sOptionTags='';
+        foreach($aOptions['options'] as $aField){
+            $optionText=$aField['label'];
+            unset($aField['label']);
+            $sOptionTags.=$this->_tag('option', $aField, $optionText )."\n";
+        }
+
+        foreach(['_infos', 'label', 'debug','type', 'value', 'options'] as $sDeleteKey){
+            if(isset($aElement[$sDeleteKey])){
+                unset($aElement[$sDeleteKey]);
+            }
+        }
+        return $this->getHorizontalFormElement(
+            $this->_tag('div', ['class'=>'form-group'],
+                $this->_tag('select', $aElement, $sOptionTags)
+                ), 
+                $sLabel, 
+                $sFormid
+            );
+
+    }
+
     // ----------------------------------------------------------------------
     // 
     // PUBLIC FUNCTIONS :: CONTENT - TABBED CONTENT
-- 
GitLab