v1.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace zin;
  3. require_once dirname(__DIR__) . DS . 'dropdown' . DS . 'v1.php';
  4. require_once dirname(__DIR__) . DS . 'btn' . DS . 'v1.php';
  5. class visionSwitcher extends wg
  6. {
  7. public static function getPageCSS()
  8. {
  9. return <<<CSS
  10. #versionSwitchBtn > .icon, #versionMenu .item-icon {display: flex; width: 18px; height: 18px; border-radius: var(--radius-md); align-items: center; justify-content: center; background: rgba(var(--color-inverse-rgb), .1); opacity: .7;}
  11. #versionSwitchBtn > .icon, #versionMenu .selected .item-icon {background: var(--color-primary-500); color: #fff; opacity: 1;}
  12. #versionSwitchBtn > .icon::before, #versionMenu .item-icon::before {transform: scale(.8);}
  13. #versionMenu {min-width: 160px;}
  14. #versionMenu .selected:not(:hover) .item-title {color: var(--color-fore)}
  15. CSS;
  16. }
  17. /**
  18. * @var mixed[]
  19. */
  20. public $icons = array
  21. (
  22. 'lite' => 'target',
  23. 'rnd' => 'remote',
  24. 'or' => 'or',
  25. 'manager' => 'manager',
  26. 'ipd' => 'ipd'
  27. );
  28. /**
  29. * @param string $vision
  30. */
  31. protected function getVisionIcon($vision)
  32. {
  33. return isset($this->icons[$vision]) ? $this->icons[$vision] : 'bars';
  34. }
  35. protected function buildVisionTips()
  36. {
  37. global $config, $lang;
  38. if(!empty($config->global->hideVisionTips)) return null;
  39. return div
  40. (
  41. setClass('vision-tips primary rounded-lg w-72 p-4 absolute left-0 z-100 flex items-center'),
  42. style::bottom(60),
  43. div(setClass('flex-auto'), $lang->visionTips),
  44. btn
  45. (
  46. set::type('light-outline'),
  47. on::click()->do
  48. (
  49. '$this.closest(".vision-tips").remove()',
  50. '$.post($.createLink("my", "ajaxSaveVisionTips"), {fields: 1})'
  51. ),
  52. $lang->IKnow
  53. ),
  54. div
  55. (
  56. setClass('bg-inherit w-0.5 h-8 absolute'),
  57. style::bottom(-31)->left(64),
  58. div
  59. (
  60. setClass('w-2.5 h-2.5 rounded-full border-2 relative border-primary bg-canvas'),
  61. style::left(-4)->top(32)
  62. )
  63. )
  64. );
  65. }
  66. protected function build()
  67. {
  68. global $lang, $app, $config;
  69. if(!isset($app->user)) return;
  70. $user = $app->user;
  71. if(!isset($user->visions)) $user->visions = trim($config->visions, ',');
  72. $currentVision = $app->config->vision;
  73. $userVisions = array_filter(explode(',', $user->visions));
  74. $configVisions = array_filter(explode(',', trim($config->visions, ',')));
  75. pageJS(<<<JS
  76. window.getUserVisions = () => '{$user->visions}'.split(',');
  77. window.getCurrentVision = () => '{$currentVision}';
  78. JS
  79. );
  80. /* The standalone lite version removes the lite interface button */
  81. if(trim($config->visions, ',') == 'lite') return;
  82. /* Append the current vision to the user visions to switch vision. */
  83. if(count($userVisions) == 1 && current($userVisions) != $currentVision)
  84. {
  85. $userVisions[] = $currentVision;
  86. }
  87. if(count($userVisions) < 2 || count($configVisions) < 2)
  88. {
  89. return new btn
  90. (
  91. setClass('ghost'),
  92. set::id('versionSwitchBtn'),
  93. set::icon($this->getVisionIcon($currentVision)),
  94. $lang->visionList[$currentVision]
  95. );
  96. }
  97. $items = array();
  98. $items[] = array
  99. (
  100. 'type' => 'heading',
  101. 'titleClass' => 'font-normal',
  102. 'text' => $lang->switchTo
  103. );
  104. foreach($userVisions as $vision)
  105. {
  106. $items[] = array
  107. (
  108. 'selected' => $currentVision == $vision,
  109. 'trailingIcon' => $currentVision == $vision ? 'check' : '',
  110. 'url' => "javascript:selectVision('$vision')",
  111. 'icon' => $this->getVisionIcon($vision),
  112. 'data-type' => 'ajax',
  113. 'text' => isset($lang->visionList[$vision]) ? $lang->visionList[$vision] : $vision,
  114. );
  115. }
  116. $dropdown = new dropdown
  117. (
  118. new btn
  119. (
  120. setClass('ghost'),
  121. set::id('versionSwitchBtn'),
  122. set::text($lang->visionList[$currentVision]),
  123. set::icon($this->getVisionIcon($currentVision)),
  124. set::caret('up')
  125. ),
  126. set::id('versionMenu'),
  127. set::placement('top-start'),
  128. set::menu(array('className' => 'pt-1 space-y-1', 'minWidth' => 200)),
  129. set::arrow(true),
  130. set::items($items)
  131. );
  132. $tips = $this->buildVisionTips();
  133. return $tips ? array($dropdown, $tips) : $dropdown;
  134. }
  135. }