diff --git a/module/common/model.php b/module/common/model.php index 62a1ecc89b..c5d70c701c 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -722,7 +722,7 @@ class commonModel extends model * * @static * @access public - * @return void + * @return array */ public static function printVisionSwitcherZin() { @@ -773,7 +773,7 @@ class commonModel extends model * * @static * @access public - * @return void + * @return array */ public static function printCreateListZin() { diff --git a/zin/func.php b/zin/func.php index 9a378fe424..7e002d0c3a 100644 --- a/zin/func.php +++ b/zin/func.php @@ -40,3 +40,6 @@ function forminput() {return createWg('forminput', func_get_args());} function dropdown() {return createWg('dropdown', func_get_args());} function pageheader() {return createWg('pageheader', func_get_args());} function pageheading() {return createWg('pageheading', func_get_args());} +function pagenavbar() {return createWg('pagenavbar', func_get_args());} +function pagetoolbar() {return createWg('pagetoolbar', func_get_args());} +function avatar() {return createWg('avatar', func_get_args());} diff --git a/zin/wg/avatar/v1.php b/zin/wg/avatar/v1.php index e949b1b735..ffa5f38137 100644 --- a/zin/wg/avatar/v1.php +++ b/zin/wg/avatar/v1.php @@ -1,95 +1,76 @@ 'userMenu dropdown-toggle', - 'data-arrow' => true, - 'data-toggle' => 'dropdown', - 'data-trigger' => 'hover', - 'data-placement' => 'bottom', - 'href' => '#userMenu', - 'theme' => 'success', - 'radius' => 'circle', - 'size' => '', - 'outline' => '', - 'showName' => false, + protected static $defineProps = array + ( + 'class?:string="userMenu dropdown-toggle"', + 'data-arrow?:string="true"', + 'data-toggle?:string="dropdown"', + 'data-trigger?:string="hover"', + 'data-placement?:string="bottom"', + 'href?:string="#userMenu"', + 'theme?:string="success"', + 'radius?:string="circle"', + 'size?:string', + 'outline?:string', + 'trigger?:string', + 'showName' => array + ( + 'type' => 'bool', + 'default' => false + ) ); - static $customProps = 'text,theme,radius,size,outline,name,role'; + private $skipProps = array('theme', 'radius', 'showName', 'outline', 'size', 'avatar', 'name', 'trigger'); + private $skipTriggerProps = array('data-arrow', 'data-toggle', 'data-placement', 'data-trigger', 'href'); - static function create($props) + protected function onAddChild($child) { - $avatar = new avatar(); - foreach($props as $key => $value) $avatar->prop($key, $value); - return $avatar; - } - - protected function acceptChild($child, $strAsHtml = false) - { - $child = parent::acceptChild($child, $strAsHtml); - - if(!$strAsHtml && is_string($child) && !$this->props->has('name')) + if(is_string($child) && !$this->props->has('name')) { - $this->prop('name', strtoupper($child[0])); - return NULL; + $this->setProp('name', $child); + return false; } + return $child; } - protected function build($isPrint = false, $parent = NULL) + protected function build() { - $builder = parent::build($isPrint, $parent); - - $name = strtoupper($this->prop('name')[0]); + $name = $this->prop('name'); $avatar = $this->prop('avatar'); - if(empty($name) and empty($avatar)) return $builder; + /* Without name and avatar url. */ + if(empty($name) and empty($avatar)) return null; - /* Strig avatar. */ - if(!empty($avatar)) - { - /* Image avatar. */ - $div = h5::div(h5::img(\zin\set('src', $this->prop('avatar'))))->addClass('avatar'); - if(!empty($this->prop('radius'))) $div->addClass($this->prop('radius')); - if(!empty($this->prop('theme'))) $div->addClass($this->prop('theme')); - if(!empty($this->prop('outline'))) $div->addClass($this->prop('outline') . '-outline'); - if(!empty($this->prop('size'))) $div->addClass($this->prop('size')); - $builder->append($div); + $radius = $this->prop('radius'); + $theme = $this->prop('theme'); + $outline = $this->prop('outline'); + $size = $this->prop('size'); + $role = $this->prop('role'); + $showName = $this->prop('showName'); + $trigger = $this->prop('trigger'); - /* Show name and role. */ - if(!empty($this->prop('showName'))) - { - $builder->append(h5::span($name)); - if(!empty($this->prop('role'))) $builder->append(h5::span($this->prop('role'))); - } + $skipProps = !empty($trigger) ? $this->skipProps : array_merge($this->skipProps, $this->skipTriggerProps); + if(!empty($trigger)) $this->setProp('href', $trigger); - return $builder; - } - - $div = h5::div($name)->addClass('avatar'); - if(!empty($this->prop('radius'))) $div->addClass($this->prop('radius')); - if(!empty($this->prop('theme'))) $div->addClass($this->prop('theme')); - if(!empty($this->prop('outline'))) $div->addClass($this->prop('outline') . '-outline'); - if(!empty($this->prop('size'))) $div->addClass($this->prop('size')); - $builder->append($div); - - if(!empty($this->prop('showName'))) - { - $builder->append(h5::span($name)); - if(!empty($this->prop('role'))) $builder->append(h5::span($this->prop('role'))); - } - - return $builder; + return h::div + ( + set($this->props->skip($skipProps)), + h::div + ( + setClass('avatar'), + empty($radius) ? null : setClass($radius), + empty($theme) ? null : setClass($theme), + empty($outline) ? null : setClass($outline . '-outline'), + empty($size) ? null : setClass($size), + !empty($avatar) ? h::img(set('src', $avatar)) : strtoupper(mb_substr($name, 0, 1)) + ), + empty($showName) ? null : h::span($name), + empty($showName) or empty($role) ? null : h::span($role) + ); } } diff --git a/zin/wg/dropdown/v1.php b/zin/wg/dropdown/v1.php index a61650e768..f7352b21da 100644 --- a/zin/wg/dropdown/v1.php +++ b/zin/wg/dropdown/v1.php @@ -3,11 +3,13 @@ namespace zin; class dropdown extends wg { - static $tag = 'menu'; + protected static $defineProps = array + ( + 'class?:string="dropdown-menu menu"', + 'id?:string' + ); - static $defaultProps = array('class' => 'dropdown-menu menu'); - - static $customProps = 'items'; + private $skipProps = array('items'); protected function buildItem($item) { @@ -65,4 +67,16 @@ class dropdown extends wg return $li; } + + protected function build() + { + $items = $this->prop('items'); + + return h::menu + ( + set($this->props->skip($this->skipProps)), + is_array($items) ? array_map(array($this, 'buildItem'), $items) : null, + $this->children() + ); + } } diff --git a/zin/wg/pageheading/v1.php b/zin/wg/pageheading/v1.php index 97c04f7081..09960483ad 100644 --- a/zin/wg/pageheading/v1.php +++ b/zin/wg/pageheading/v1.php @@ -19,6 +19,8 @@ class pageheading extends wg $this->props->set('text', $child); return false; } + + return $child; } /** diff --git a/zin/wg/pagenavbar/v1.php b/zin/wg/pagenavbar/v1.php index 3beeddaca7..9def77cc70 100644 --- a/zin/wg/pagenavbar/v1.php +++ b/zin/wg/pagenavbar/v1.php @@ -1,9 +1,8 @@ 'navbar'); +class pagenavbar extends nav +{ } diff --git a/zin/wg/pagetoolbar/v1.php b/zin/wg/pagetoolbar/v1.php index 3e7047eb01..9274a67f92 100644 --- a/zin/wg/pagetoolbar/v1.php +++ b/zin/wg/pagetoolbar/v1.php @@ -1,49 +1,58 @@ 'toolbar'); - - static $customProps = 'globalCreate,avatar,switcher'; - - private function buildGlobalCreate($props) + private function buildGlobalCreate() { - $div = h::create('div', NULL, $props); - $div->append(h::div(Icon('plus'))->addClass('rounded-sm btn square size-sm secondary')); - $div->addClass('globalGreate'); + $props = $this->prop('create'); - return $div; + if(!isset($props['data-arrow'])) $props['data-arrow'] = true; + if(!isset($props['data-toggle'])) $props['data-toggle'] = 'dropdown'; + if(!isset($props['data-trigger'])) $props['data-trigger'] = 'hover'; + if(!isset($props['href'])) $props['href'] = '#globalCreateMenu'; + + return h::div + ( + setClass('globalCreate'), + h::div + ( + set($props), + setClass('rounded-sm btn square size-sm secondary'), + icon('plus') + ) + ); } - private function buildAvatar($props) + private function buildSwitcher() { - return Avatar::create($props); + $props = $this->prop('switcher'); + + if(!isset($props['data-arrow'])) $props['data-arrow'] = true; + if(!isset($props['data-toggle'])) $props['data-toggle'] = 'dropdown'; + if(!isset($props['data-trigger'])) $props['data-trigger'] = 'hover'; + if(!isset($props['href'])) $props['href'] = '#globalCreateMenu'; + + return h::div + ( + setClass('vision-switcher'), + h::div + ( + set($props), + setClass('switcher-text'), + $props['text'] + ) + ); } - private function buildSwitcher($props) + protected function build() { - $div = h::create('div', NULL, $props); - $div->append(h::div($props['text'])->addClass('switcher-text')); - $div->addClass('vision-switcher'); - - return $div; - } - - protected function build($isPrint = false, $parent = null) - { - $builder = parent::build($isPrint, $parent); - $builder->append($this->buildGlobalCreate($this->prop('globalCreate'))); - $builder->append($this->buildAvatar($this->prop('avatar'))); - $builder->append($this->buildSwitcher($this->prop('switcher'))); - return $builder; + return h::div + ( + setId('toolbar'), + $this->buildGlobalCreate(), + $this->block('avatar'), + $this->buildSwitcher() + ); } }