index.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /**
  2. * UI v1.1.0
  3. * Copyright 2017-2018 Muyao
  4. * Licensed under the Muyao License 1.0
  5. */
  6. (function (docuemnt, window, $) {
  7. 'use strict';
  8. /* globals Breakpoints, screenfull*/
  9. $.extend($.site, {
  10. theme: function () { // 主题渲染
  11. var $body = $('body'),
  12. settingsName = 'admui.base.skinTools',
  13. $parentLink = $('#admui-siteStyle', $('head')),
  14. settings = localStorage.getItem(settingsName),
  15. parentEtx = $parentLink.prop('href').indexOf('?v=') === -1 ? '' : '.min', themeColor, sidebar, navbar,
  16. menuDisplay, menuTxtIcon;
  17. if (!settings) {
  18. return;
  19. }
  20. settings = JSON.parse(settings).val;
  21. themeColor = this.themeColor = settings.themeColor;
  22. sidebar = settings.sidebar;
  23. navbar = settings.navbar;
  24. menuDisplay = settings.menuDisplay;
  25. menuTxtIcon = settings.menuTxtIcon;
  26. // 在前端渲染主题不是最优雅体验最好的,建议通过后端渲染
  27. if (themeColor && themeColor !== 'primary') {
  28. setTimeout(function () {
  29. $parentLink.attr('href', 'lib/admui/skins/' + themeColor + '/index' + parentEtx + '.css');
  30. }, 130);
  31. }
  32. if (sidebar && sidebar === 'site-menubar-light') {
  33. $('#admui-siteMenubar').addClass('site-menubar-light');
  34. }
  35. if (navbar && navbar !== '') {
  36. $('.site-navbar').addClass(navbar);
  37. }
  38. if (settings.navbarInverse === '') {
  39. $('.site-navbar').removeClass('navbar-inverse');
  40. }
  41. if (menuDisplay && menuDisplay === 'site-menubar-fold') {
  42. $.site.menubar.fold();
  43. if (menuTxtIcon && menuTxtIcon === 'site-menubar-keep') {
  44. $body.addClass('site-menubar-keep');
  45. } else {
  46. $body.addClass('site-menubar-fold-alt');
  47. }
  48. }
  49. if (settings.tabFlag === '') {
  50. $body.removeClass('site-contabs-open');
  51. }
  52. },
  53. iframeTheme: function () { // 子框架主体内容部分主题
  54. var $iframeLink = $('#admui-siteStyle', this.iframeDocument),
  55. iframeEtx = $iframeLink.prop('href').indexOf('?v=') === -1 ? '' : '.min',
  56. themeColor = this.themeColor;
  57. if (themeColor && themeColor !== 'primary') {
  58. $iframeLink.attr('href', 'lib/admui/skins/' + this.themeColor + '/site' + iframeEtx + '.css');
  59. }
  60. },
  61. _tabsDraw: function () { // 标签页重绘
  62. var self = this,
  63. settingsName = 'admui.base.contentTabs',
  64. settings = $.sessionStorage.get(settingsName),
  65. tab, checkedTabId, checkedTabUrl, tabTpl, tabUrl, tabName, tabIframe,
  66. locationUrl = location.hash.substring(2),
  67. $conTabs = $('.con-tabs'),
  68. contentTabs = $.site.contentTabs,
  69. callback = function (key, tabId, url) {
  70. var $firstIframe = self.$content.find('iframe:first');
  71. if (key === tabId || !locationUrl) {
  72. checkedTabUrl = url;
  73. $conTabs.find('li:first').addClass('active');
  74. $firstIframe.attr('src', url);
  75. self.iframeEvents($firstIframe);
  76. }else{
  77. $firstIframe.removeClass('active');
  78. }
  79. };
  80. checkedTabId = settings.checked;
  81. for (var key in settings) {
  82. tab = settings[key];
  83. if (key === 'checked' || key === 'tabId') {
  84. continue;
  85. } else if (key === 'iframe-0') {
  86. callback(key, checkedTabId, tab.url);
  87. continue;
  88. }
  89. tabUrl = tab.url;
  90. tabName = tab.name;
  91. tabTpl = '<a href="' + tabUrl + '" ' + 'target="' + key + '"' +
  92. '" title="' + tabName + '' + '" rel="contents"><span>' + tabName + '</span><i class="icon' +
  93. ' wb-close-mini">' + '</i></a></li>';
  94. if (key === checkedTabId && locationUrl) {
  95. checkedTabUrl = tabUrl;
  96. tabTpl = '<li class="active">' + tabTpl;
  97. tabIframe = '<iframe src="' + tabUrl + '" frameborder="0" name="' + key + '" class="page-frame animation-fade active"></iframe>';
  98. } else {
  99. tabTpl = '<li>' + tabTpl;
  100. tabIframe = '<iframe src="" frameborder="0" name="' + key + '" class="page-frame animation-fade"></iframe>';
  101. }
  102. $conTabs.append(tabTpl);
  103. self.$content.append(tabIframe);
  104. }
  105. if (locationUrl !== checkedTabUrl && locationUrl) {
  106. this._urlRequest(locationUrl);
  107. }
  108. contentTabs.enable($conTabs.find('.active'));
  109. if (Object.keys(settings).length >= 19) {
  110. contentTabs.tabSize();
  111. contentTabs.tabEvent($conTabs, 'media');
  112. }
  113. },
  114. _urlRequest: function (url) { // 处理存储信息中没有的页面访问(创建新的标签页)
  115. var title = '未知页面';
  116. $('.site-menu a').each(function () {
  117. var $item = $(this);
  118. if ($item.attr('href') === url) {
  119. title = $.trim($item.attr('title') || $item.text());
  120. return false;
  121. }
  122. });
  123. $.site.contentTabs.buildTab({name: title, url: url});
  124. },
  125. _hideNavbar: function () { // 隐藏导航条
  126. var $body = $('body');
  127. $body.addClass('site-navbar-collapsing');
  128. $('#admui-navbarCollapse').collapse('hide');
  129. setTimeout(function () {
  130. $body.removeClass('site-navbar-collapsing');
  131. }, 10);
  132. $body.removeClass('site-navbar-collapse-show');
  133. },
  134. iframeEvents: function ($el) { // 子框架主体内容事件处理
  135. var self = this, _callback = function (obj) {
  136. $('#admui-siteStyle', obj).load(function () {
  137. self.iframeTheme();
  138. });
  139. };
  140. /*
  141. * 菜单收起
  142. * 导航条收起
  143. * */
  144. $el.load(function () {
  145. var iframeDocument = self.iframeDocument = $.content.document();
  146. $(iframeDocument).on('click', function () {
  147. // 小屏下收起顶部导航条和左侧菜单
  148. if (Breakpoints.is('xs') && $('body').hasClass('site-menubar-open')) {
  149. $.site.menubar.hide();
  150. self._hideNavbar();
  151. }
  152. // 核心框架中下拉菜单切换操作
  153. $('[data-toggle="dropdown"]').parent().removeClass('open');
  154. });
  155. _callback(iframeDocument);
  156. });
  157. },
  158. run: function () {
  159. var self = this,
  160. $content = this.$content = $('#admui-pageContent');
  161. // 获取iframe框架中变量&方法
  162. $.content = $.content || {};
  163. $.extend($.content, {
  164. window: function () {
  165. var name = $content.find('iframe.active').attr('name');
  166. return window.frames[name];
  167. },
  168. document: function () { // 获取iframe框架中document
  169. var name = $content.find('iframe.active').attr('name');
  170. return window.frames[name].document;
  171. }
  172. });
  173. // 当前iframe框架document
  174. this.iframeDocument = null;
  175. // 项目名称获取
  176. $.ctx = $('#admui-signOut').data('ctx') || $.ctx;
  177. if (typeof $.site.menu !== 'undefined') {
  178. $.site.menu.init();
  179. }
  180. if (typeof $.site.contentTabs !== 'undefined') {
  181. $.site.contentTabs.init();
  182. }
  183. // 导航条响应式
  184. $('#admui-navbar').responsiveHorizontalTabs({
  185. tabParentSelector: '#admui-navTabs',
  186. fnCallback: function (el) {
  187. if ($('#admui-navbar').is(':visible')) {
  188. el.removeClass('is-load');
  189. }
  190. }
  191. });
  192. // 导航条&菜单的响应式工作
  193. if (typeof $.site.menubar !== 'undefined') {
  194. $('#admui-siteMenubar').on('changing.site.menubar', function () {
  195. var $menubar = $('[data-toggle="menubar"]');
  196. $menubar.toggleClass('hided', !$.site.menubar.opened);
  197. $menubar.toggleClass('unfolded', !$.site.menubar.folded);
  198. });
  199. $.site.menubar.init();
  200. Breakpoints.on('change', function () {
  201. $.site.menubar.change();
  202. });
  203. /*
  204. * 小屏幕下导航条展开 | 收起按钮
  205. * 搜索按钮(href)
  206. * */
  207. $(document).on('click', '[data-toggle="collapse"]', function (e) {
  208. var $trigger = $(e.target),
  209. href, target, $target;
  210. if (!$trigger.is('[data-toggle="collapse"]')) {
  211. $trigger = $trigger.parents('[data-toggle="collapse"]');
  212. }
  213. target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '');
  214. $target = $(target);
  215. if ($target.hasClass('navbar-search-overlap')) {
  216. $target.find('input').focus();
  217. e.preventDefault();
  218. } else if ($target.attr('id') === 'admui-navbarCollapse') {
  219. var isOpen = !$trigger.hasClass('collapsed'),
  220. $body = $(document.body);
  221. $body.addClass('site-navbar-collapsing');
  222. $body.toggleClass('site-navbar-collapse-show', isOpen);
  223. $('#admui-navbar').responsiveHorizontalTabs({
  224. tabParentSelector: '#admui-navTabs',
  225. fnCallback: function (el) {
  226. el.removeClass('is-load');
  227. }
  228. });
  229. setTimeout(function () {
  230. $body.removeClass('site-navbar-collapsing');
  231. }, 350);
  232. }
  233. });
  234. $(document).on('click', '[data-toggle="menubar"]', function () { // 菜单展开|收起控制按钮
  235. if (Breakpoints.is('xs') && $('body').hasClass('site-menubar-open')) {
  236. self._hideNavbar();
  237. }
  238. $.site.menubar.toggle();
  239. });
  240. // 图标对应菜单展开
  241. $('#admui-navbar >.nav-tabs >li:not(.no-menu)').on('click', function (e) {
  242. if ($(e.target).closest('li').is('.dropdown')) {
  243. return;
  244. }
  245. if (Breakpoints.is('xs')) {
  246. $.site.menubar.open();
  247. }
  248. });
  249. }
  250. // 全屏模式操作
  251. if (typeof screenfull !== 'undefined') {
  252. $(document).on('click', '[data-toggle="fullscreen"]', function () {
  253. if (screenfull.enabled) {
  254. screenfull.toggle();
  255. }
  256. return false;
  257. });
  258. if (screenfull.enabled) {
  259. document.addEventListener(screenfull.raw.fullscreenchange, function () {
  260. $('[data-toggle="fullscreen"]').toggleClass('active', screenfull.isFullscreen);
  261. });
  262. }
  263. }
  264. // 对下拉列表的其他功能
  265. $(document).on('show.bs.dropdown', function (e) {
  266. var $target = $(e.target), $menu,
  267. $trigger = e.relatedTarget ? $(e.relatedTarget) : $target.children('[data-toggle="dropdown"]'),
  268. animation = $trigger.data('animation');
  269. if (animation) {
  270. $menu = $target.children('.dropdown-menu');
  271. $menu.addClass('animation-' + animation);
  272. $menu.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {
  273. $menu.removeClass('animation-' + animation);
  274. });
  275. }
  276. });
  277. // 父框架工具提示和弹框初始化
  278. $('[data-toggle="tooltip"]').tooltip({trigger: 'hover'});
  279. $('[data-toggle="popover"]').popover();
  280. if (window.localStorage) {
  281. this.theme();
  282. this._tabsDraw();
  283. }
  284. $.components.init();
  285. }
  286. });
  287. $.site.run();
  288. })(document, window, jQuery);