PageSourceSearch

https://linella.md/js/tygh/tabs.js?ver=1790854873

js linella.md collected 2026-10-01 14:10:29 UTC 7,559 bytes, 213 lines download raw bytes

1(function (_, $) {
2  (function ($) {
3    function _getTabTools(id) {
4      return $('.cm-tab-tools[id^="tools_' + id + '"]');
5    }
6    function _getTabIds(id) {
7      var result_ids = ['content_' + id];
8      var additional_ids = $('#content_' + id).data('caTabTargetId');
9      if (additional_ids) {
10        result_ids.push(additional_ids);
11      }
12      _getTabTools(id).each(function () {
13        result_ids.push($(this).prop('id'));
14      });
15      return result_ids.join(',');
16    }
17    function _switchTab(tab_id, tabs_elm, show) {
18      var id_obj = $('#content_' + tab_id);
19      var tab_tools = _getTabTools(tab_id);
20      if (show) {
21        id_obj.removeClass('hidden');
22        tab_tools.removeClass('hidden');
23        if (id_obj.hasClass('cm-hide-save-button')) {
24          $('.cm-save-buttons').addClass('hidden');
25        } else {
26          $('.cm-save-buttons').removeClass('hidden');
27        }
28        $.ceEvent('trigger', 'ce.tab.show', [tab_id, tabs_elm]);
29      } else {
30        id_obj.addClass('hidden');
31        tab_tools.addClass('hidden');
32      }
33      return true;
34    }
35    function _cloneTools(tab_id, prev_id) {
36      if (!tab_id || !prev_id) {
37        return;
38      }
39      var _prev_tools = _getTabTools(prev_id);
40      _prev_tools.each(function () {
41        var self = $(this);
42        var _new_id = self.prop('id').replace(prev_id, tab_id);
43        if (!$('#' + _new_id).length) {
44          var _new_tool = self.clone();
45          _new_tool.children().remove();
46          _new_tool.prop('id', _new_id).addClass('hidden').appendTo(self.parent());
47        }
48      });
49    }
50    var methods = {
51      switch: function (tab_id) {
52        if (!tab_id) {
53          return false;
54        }
55        var tabs_elm = $(this);
56        var ul = tabs_elm.data('ceTabs').ul;
57        var elm = tabs_elm.data('ceTabs').tabs[tab_id];
58        if (!ul || !elm) {
59          return false;
60        }
61
62        // we set selected_section to keep active tab opened after form submit
63        // we do it for all forms to fix settings_dev situation: forms under tabs
64        let $tabs = $(tabs_elm);
65        if ($tabs.hasClass('cm-track')) {
66          let input_name = 'selected_section';
67          if (typeof $tabs.data('caTabsInputName') !== 'undefined') {
68            input_name = $tabs.data('caTabsInputName') === '' ? 'selected_sub_section' : $tabs.data('caTabsInputName');
69          }
70          $("input[name=".concat(input_name, "]")).val(tab_id);
71        }
72        if (elm.hasClass('cm-js') == false) {
73          return false;
74        }
75        var active_id = $('li.active:first', ul).prop('id');
76        var content_id = 'content_' + tab_id;
77        $('li', ul).each(function () {
78          var self = $(this);
79          self.removeClass('active');
80          _switchTab(self.prop('id'), tabs_elm, false);
81        });
82
83        //Select clicked tab and show content
84        elm.addClass('active');
85        var sub_tab = elm.parents('.cm-subtabs', ul);
86        if (sub_tab.length && elm.hasClass('cm-no-highlight')) {
87          sub_tab.addClass('active');
88        }
89        if (elm.hasClass('cm-ajax-onclick') && !elm.hasClass('cm-ajax-onclick-active')) {
90          $.ceAjax('request', $('a', elm).prop('href'), {
91            result_ids: _getTabIds(tab_id),
92            callback: function (data) {
93              _switchTab(tab_id, tabs_elm, true);
94            }
95          });
96          elm.addClass('cm-ajax-onclick-active');
97          return true;
98        }
99        if (elm.hasClass('cm-ajax-onclick-active')) {
100          _switchTab(tab_id, tabs_elm, true);
101          return true;
102        }
103        if (elm.hasClass('cm-ajax') && $('#' + content_id).length == 0) {
104          const $tabsContent = tabs_elm.closest('#content_top_navigation').next('.cm-tabs-content').length ? tabs_elm.closest('#content_top_navigation').next('.cm-tabs-content') : tabs_elm;
105
106          // Create tab content if it is not exist
107          $tabsContent.after('<div id="' + content_id + '"></div>');
108          _cloneTools(tab_id, active_id);
109          $.ceAjax('request', $('a', elm).prop('href'), {
110            result_ids: _getTabIds(tab_id),
111            callback: function (data) {
112              _switchTab(tab_id, tabs_elm, true);
113            }
114          });
115        } else {
116          _switchTab(tab_id, tabs_elm, true);
117        }
118        return true;
119      },
120      init: function () {
121        $(this).each(function () {
122          var tabs_elm = $(this);
123          $.ceEvent('trigger', 'ce.tab.pre_init', [tabs_elm]);
124
125          //Setup Tabs
126          var ul = $('ul:first', tabs_elm);
127          var list = $('li', ul);
128          if (!list.length) {
129            return;
130          }
131          var data = {
132            ul: ul,
133            tabs: {}
134          };
135          list.each(function () {
136            var elm = $(this);
137            var tab_id = elm.prop('id');
138            data.tabs[tab_id] = elm;
139          });
140          tabs_elm.data('ceTabs', data);
141          list.on('click', function (e) {
142            var $clickedElm = $(e.target);
143            if ($clickedElm.data('caStopEventPropagation')) {
144              e.stopPropagation();
145              return;
146            }
147            var elm = $(this);
148            var tab_id = elm.prop('id');
149            if (tabs_elm.ceTabs('switch', tab_id)) {
150              e.preventDefault();
151            }
152            return true;
153          });
154
155          //Select default tab
156          var test;
157          if ((test = list.filter('.active')).length) {
158            test.trigger('click'); //Select tab with class 'active'
159          } else {
160            test = list.filter(':first').trigger('click'); //Select first tab
161          }
162
163          // create similar active tab tools
164          var active_id = test.prop('id');
165          list.filter('.cm-ajax.cm-js').each(function () {
166            var self = $(this);
167            var tab_id = self.prop('id');
168
169            // Check if the active content needs to be loaded
170            if (self.hasClass('active')) {
171              content = $('#content_' + tab_id).html().replace(/<!--.*?-->/, '').replace(/(^\s+|\s+$)/, '');
172              if (content.length) {
173                return true;
174              }
175            }
176            if (!self.data('passed') && $('a', self).prop('href')) {
177              self.data('passed', true);
178              var id = 'content_' + tab_id;
179              // Check if block already exists
180              var block = $('#' + id);
181              if (!block.length) {
182                self.parents('.cm-j-tabs').eq(0).next().prepend('<div id="' + id + '"></div>');
183                block = $('#' + id);
184              }
185              if (!self.hasClass('active')) {
186                block.addClass('hidden');
187              }
188              _cloneTools(tab_id, active_id);
189              if (!self.hasClass('cm-ajax-onclick')) {
190                $.ceAjax('request', $('a', self).prop('href'), {
191                  result_ids: _getTabIds(tab_id),
192                  hidden: true,
193                  repeat_on_error: true
194                });
195              }
196            }
197          });
198          return true;
199        });
200        $.ceEvent('trigger', 'ce.tab.init');
201      }
202    };
203    $.fn.ceTabs = function (method) {
204      if (methods[method]) {
205        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
206      } else if (typeof method === 'object' || !method) {
207        return methods.init.apply(this, arguments);
208      } else {
209        $.error('ty.tabs: method ' + method + ' does not exist');
210      }
211    };
212  })($);
213})(Tygh, Tygh.$);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.