PageSourceSearch

https://www.gcpclinplus.com/assets/js/kaka/kaka-1.0.0.js

js gcpclinplus.com collected 2026-10-04 05:44:35 UTC 25,767 bytes, 586 lines download raw bytes

1kaka = function () {
2    var self = this;
3    self.init = function (container) {
4        self.bindPlugin(container);
5        self.bindSelectorSearchFallback();
6        $('[data-toggle=tooltip]').mouseover(function () {
7            // 初始化 tooltip
8            $(this).tooltip();
9            // 然后再调用 show 方法
10            $(this).tooltip('show');
11        });
12    }
13    self.bindSelectorSearchFallback = function () {
14        var runSelectorSearch = function (form, event) {
15            if (event) {
16                event.preventDefault();
17                event.stopPropagation();
18            }
19
20            if (form.id === 'content-selector-search-form' && $.contentSelectorSubmit) {
21                return $.contentSelectorSubmit(form, event);
22            }
23            if (form.id === 'image-selector-search-form' && $.imageSelectorSubmit) {
24                return $.imageSelectorSubmit(form, event);
25            }
26            if (form.id === 'content-selector-search-form' && $.contentSelectorQuery) {
27                $.contentSelectorQuery(form);
28                return false;
29            }
30            if (form.id === 'image-selector-search-form' && $.imageSelectorQuery) {
31                $.imageSelectorQuery(form);
32                return false;
33            }
34
35            var modal = $(form).closest('#resource-selector, #img-selector');
36            var ajaxBody = modal.find('.js-ajax-body');
37            var ajaxUrl = modal.data('selectorSearchUrl');
38            if (!ajaxUrl || !ajaxBody.length) {
39                return false;
40            }
41
42            var q = $(form).find('[name=q]').val() || '';
43            ajaxBody.load(ajaxUrl + '&page=1&q=' + encodeURIComponent(q));
44            return false;
45        };
46
47        $(document).off('submit.kakaSelectorSearch', '#resource-selector form, #img-selector form')
48            .on('submit.kakaSelectorSearch', '#resource-selector form, #img-selector form', function (event) {
49                return runSelectorSearch(this, event);
50            });
51
52        $(document).off('click.kakaSelectorSearch', '#resource-selector form button[type="submit"], #img-selector form button[type="submit"]')
53            .on('click.kakaSelectorSearch', '#resource-selector form button[type="submit"], #img-selector form button[type="submit"]', function (event) {
54                return runSelectorSearch(this.form, event);
55            });
56    }
57    self.bindPlugin = function (container) {
58        // 处理 data-plugin 的元素
59        $('[data-plugin]', container).each(function () {
60            var el = $(this);
61            var data = el.data();
62            var pluginName = data.plugin;
63
64            // 将插件名称转换为 camelCase
65            var funcName = pluginName.replace(/-([a-z])/g, function (g) {
66                return g[1].toUpperCase();
67            });
68
69            // 检查函数是否存在于 self 对象中
70            var func = self[funcName];
71            if (typeof func === 'function') {
72                func(el, data);
73            }
74        });
75
76        // 处理 data-selected 的元素
77        $('[data-selected]').each(function () {
78            var $this = $(this);
79            var selectedValue = $this.data('selected');
80
81            $this.find('option').each(function () {
82                var $option = $(this);
83                if ($option.val() == selectedValue) {
84                    $option.prop('selected', true);
85                }
86            });
87        });
88    };
89
90    self.validator = function (el, opts) {
91        seajs.use(['/assets/js/kaka/libs/kaka.validator.js'],
92            function () {
93                new kakaValidator(el, opts);
94            });
95    }
96    self.datetimePicker = function (el, opts) {
97        $(el).data('type', 'datetime');
98        self.datePicker(el, opts);
99    }
100    self.datePicker = function (el, opts) {
101        seajs.use(['/assets/js/kaka/libs/datetime/bootstrap-datetimepicker.min.js',
102                '/assets/js/kaka/libs/datetime/css/bootstrap-datetimepicker.min.css'
103            ],
104            function () {
105                seajs.use(['/assets/js/kaka/libs/datetime/locales/bootstrap-datetimepicker.zh-CN.js'],
106                    function () {
107                        var defaults = {
108                            format: 'yyyy/mm/dd',
109                            language: 'zh-CN',
110                            weekStart: 1,
111                            todayBtn: 1,
112                            autoclose: 1,
113                            minView: 2,
114                            todayHighlight: 1,
115                            startView: 2,
116                            forceParse: 0,
117                            showMeridian: 0
118                        };
119                        opts = $.extend(true, defaults, opts);
120                        switch (opts.type) {
121                            case 'datetime':
122                                opts.format = 'yyyy/mm/dd hh:ii';
123                                opts.minView = 0;
124                                opts.minuteStep = 5;
125                                break;
126                            case 'datehour':
127                                opts.format = 'yyyy/mm/dd hh:00';
128                                opts.minView = 1;
129                                break;
130                        }
131                        $(el).datetimepicker(opts);
132                    });
133            });
134    }
135    self.chkGroup = function (el, opts) {
136        var $el = $(el);
137
138        // 处理全选复选框的点击事件
139        $el.find('[role=chk-all]').off('click').on('click', function () {
140            var isChecked = $(this).is(":checked");
141            $el.find('[role=chk-item]').prop('checked', isChecked);
142        });
143
144        // 处理单个复选框的点击事件
145        $el.find('[role=chk-item]').off('click').on('click', function () {
146            var allChecked = $el.find('[role=chk-item]').length === $el.find('[role=chk-item]:checked').length;
147            $el.find('[role=chk-all]').prop('checked', allChecked);
148        });
149    };
150
151
152    self.codeEditor = function (el, opts) {
153        var mode = $(el).data('mode');
154        el.hide();
155        seajs.use(['/assets/js/kaka/libs/ace/ace.sea.js'],
156            function (ace) {
157                var domId = 'ace-' + $(el).index();
158                var editorDom = '<div class="ace-editor-wrap" style="height:400px"><div class="form-control" id="' + domId + '" style="height:100%; font-size:13px"></div></div>';
159                $(editorDom).insertAfter(el);
160                var editor = ace.edit(domId);
161                editor.getSession().setValue($(el).val());
162                editor.getSession().setMode('ace/mode/' + mode);
163                editor.getSession().on('change',
164                    function (e) {
165                        var val = editor.getSession().getValue();
166                        $(el).val(val);
167                    });
168                editor.commands.addCommand({
169                    name: "fullscreen",
170                    bindKey: {
171                        win: "Ctrl-Enter",
172                        mac: "Command-Enter"
173                    },
174                    exec: function (editor) {
175                        var vp = $('body');
176                        var div = $(el).siblings('.ace-editor-wrap');
177                        if (editor.isFullScreen) {
178                            div.css('position', 'static');
179                            div.css('height', '360px');
180                            div.css('z-index', '1');
181                            editor.resize();
182                            editor.isFullScreen = false;
183                        } else {
184                            div.css('position', 'fixed');
185                            div.css('left', '0px');
186                            div.css('right', '0px');
187                            div.css('top', '0px');
188                            div.css('bottom', '0px');
189                            div.css('height', 'auto');
190                            div.css('z-index', '9999999');
191                            editor.resize();
192                            editor.isFullScreen = true;
193                        }
194                    }
195                });
196            });
197    }
198
199    self.resourceSelector = function (el, opts) {
200        var id = 'resource-selector';
201        var limit = $(el).data('limit');
202        var idx = $(el).index();
203        var ipt = $(el).data('ipt');
204        var ref = $(el).data('ref') ? $(el).data('ref') : 0;
205        var dom = $('[data-ipt="' + ipt + '"]>.sui-selector-box');
206        var url = '/?module=admincp&controller=content&action=selector&ipt=' + ipt + '&ref=' + ref + '&limit=' + limit + '&idx=' + idx;
207        var ajaxUrl = '/?module=admincp&controller=content&action=selector&aj=1&ref=' + ref;
208        var val = $('[data-ipt="' + ipt + '"]>.sui-selector-value').html();
209
210        var refreshResourceInputs = function (DOM, ipt) {
211            $('.js-item', DOM).each(function (index) {
212                $('input[data-field]', this).each(function () {
213                    var field = $(this).data('field');
214                    $(this).attr('name', ipt + '[' + index + '][' + field + ']');
215                });
216            });
217        }
218
219        var getResourceIds = function (DOM) {
220            var ids = {};
221            $('.js-item', DOM).each(function () {
222                var id = $(this).data('id');
223                if (id !== undefined && id !== null && id !== '') {
224                    ids[String(id)] = true;
225                }
226            });
227            return ids;
228        }
229
230        var bindResourceEvents = function (DOM, ipt) {
231            $('.js-del-item', DOM).off('click.resourceSelector').on('click.resourceSelector',
232                function () {
233                    $(this).parents('.js-item').remove();
234                    refreshResourceInputs(DOM, ipt);
235                });
236        }
237
238        $.applyResource = function (files, ipt, DOM, append) {
239            if (typeof files == 'string') {
240                var files = [{
241                    id: 0,
242                    src: files,
243                    alt: ''
244                }];
245            }
246            if (!append) {
247                $(DOM).empty();
248            }
249
250            var exists = append ? getResourceIds(DOM) : {};
251            for (var x in files) {
252                var file = files[x];
253                if (append && file.id !== undefined && file.id !== null && exists[String(file.id)]) {
254                    continue;
255                }
256                exists[String(file.id)] = true;
257                var tpl = '<div class="js-item img-item" data-id="' + file.id + '" data-thumb="' + file.thumb + '" data-title="' + file.title + '" data-summary="' + file.summary + '">' + '<div class="box">' + '<input type="hidden" data-field="id" name="" value="' + file.id + '">' + '<input type="hidden" data-field="thumb" name="" value="' + file.thumb + '">' + '<input type="hidden" data-field="title" name="" value="' + file.title + '">' + '<input type="hidden" data-field="summary" name="" value="' + file.summary + '">' + '<a class="thumb" title="' + (file.title ? file.title : '') + '">' + (file.thumb ? '<img src="' + file.thumb + '">' : file.title) + '</a>' + '<div class="title cutstr">' + (file.title) + '</div>' + '<div class="summary">' + (file.summary) + '</div>' + '<div class="operate">' + '<a href="javascript:;" class="js-del-item">' + '<i class="fa fa-remove"></i> 移除</a>' + '</div></div></div>';
258                $(DOM).append(tpl);
259            }
260            refreshResourceInputs(DOM, ipt);
261            bindResourceEvents(DOM, ipt);
262            seajs.use(['/assets/js/kaka/libs/dragsort/jquery.dragsort-0.5.2.js'],
263                function (dragsort) {
264                    $(DOM).dragsort("destroy");
265                    $(DOM).dragsort({
266                        placeHolderTemplate: "<div class='img-item'></div>",
267                        dragEnd: function () {
268                            refreshResourceInputs(DOM, ipt);
269                        }
270                    });
271                });
272        }
273        if (val) {
274            $.applyResource(eval('(' + val + ')'), ipt, dom);
275        }
276        $('[role="btn"]', el).unbind('click');
277        $('[role="btn"]', el).bind('click',
278            function () {
279                $('#' + id).remove();
280                $('body').append('<div class="modal fade" id="' + id + '" tabindex="-1" role="dialog" aria-hidden="false"></div>');
281                $('#' + id).data('selectorSearchUrl', ajaxUrl);
282                $('#' + id).load(url,
283                    function () {
284                        $('#' + id).modal("show");
285                        $('#' + id).find('.btn-ok').click(function () {
286                            var selectedResources = $.contentSelectorGetSelected ? $.contentSelectorGetSelected() : [];
287                            $.applyResource(selectedResources, ipt, dom, limit > 1);
288                        });
289                    })
290            });
291    }
292
293    self.imgSelector = function (el, opts) {
294        var id = 'img-selector';
295        var limit = $(el).data('limit');
296        var name = $(el).data('name') ? $(el).data('name') : '';  // ***
297        var idx = $(el).index();
298        var ipt = $(el).data('ipt');
299        var ref = $(el).data('ref') ? $(el).data('ref') : 0;
300        var dom = $('.sui-selector-box', el).first();
301        if (!dom.length) {
302            dom = $('[data-ipt="' + ipt + '"]>.sui-selector-box').first();
303        }
304        if (!dom.length) {
305            dom = $('<div class="sui-selector-box"></div>');
306            var btns = $('.sui-selector-btns', el).first();
307            if (btns.length) {
308                dom.insertBefore(btns);
309            } else {
310                $(el).append(dom);
311            }
312        }
313        var url = '/?module=admincp&controller=image&action=selector&ipt=' + ipt + '&ref=' + ref + '&limit=' + limit + '&idx=' + idx + '&name=' + name;  // ***这里添了name
314        var ajaxUrl = '/?module=admincp&controller=image&action=selector&aj=1&ref=' + ref;
315        var val = $('.sui-selector-value', el).html();
316
317        var getSelectedImages = function (modal) {
318            var selectedImages = $.imageSelectorGetSelected ? $.imageSelectorGetSelected() : [];
319            if (selectedImages.length) {
320                return selectedImages;
321            }
322
323            return modal.find('.js-ajax-body dl.selected').map(function () {
324                var item = $(this);
325                return {
326                    id: item.data('id'),
327                    src: item.data('src'),
328                    alt: item.data('name') || ''
329                };
330            }).get();
331        };
332
333        $.applyImage = function (file, ipt, DOM) {
334            var _src = file;
335            var _pdfTitle = '';
336
337            if (file) {
338                var pdfArr = file.split(',');
339                _pdfTitle = pdfArr.map(function (x) {
340                    var parts = x.split('/');
341                    return parts[parts.length - 1];
342                }).join(', ');
343            }
344
345            var tpl = `
346                    <input type="hidden" name="${ipt}" value="${file}" />
347                    <a class="img-preview">
348                        <img src="${_src}" data-test="1" role="btn" />
349                    </a>
350                    <div class="file_title" style="text-align:center;margin-bottom:20px;font-size:14px;color:#333;">
351                        ${_pdfTitle}
352                    </div>
353                    <a class="js-del-item img-remove" href="javascript:;">
354                        <i class="fa fa-remove"></i> <span>移除</span>
355                    </a>`;
356
357            $(DOM).html(tpl);
358            $(DOM).siblings('.sui-selector-value').html(file || '');
359
360            $(DOM).find('.js-del-item').on('click', function (event) {
361                $(DOM).empty().html(`<input type="hidden" name="${ipt}" value="" />`);
362                $(DOM).siblings('.sui-selector-value').html('');
363                event.stopPropagation();
364            });
365        };
366        $.applyImages = function (files, ipt, DOM) {
367            if (typeof files == 'string') {
368                var files = [{
369                    id: 0,
370                    src: files,
371                    alt: ''
372                }];
373            }
374            $(DOM).empty();
375            $(DOM).siblings('.sui-selector-value').html(JSON.stringify(files));
376            for (x in files) {
377                var file = files[x];
378                var tpl = '<div class="js-item img-item">' + '<div class="alt">
378' + '<input type="hidden" name="' + ipt + '[' + x + '][id]" value="' + file.id + '">' + '<input type="hidden" name="' + ipt + '[' + x + '][src]" value="' + file.src + '">' + '<textarea name="' + ipt + '[' + x + '][alt]" value="' + file.alt + '" rows="2" class="form-control" placeholder="请输入图片说明">' + (file.alt ? file.alt : '') + '</textarea>' + '<a href="javascript:;$(\'.alt\',\'.js-item\').hide();" class="btn btn-primary btn-xs">确定</a>' + '</div>' + '<a class="thumb" title="' + (file.alt ? file.alt : '') + '"><img src="' + file.src + '" data-id="' + file.id + '" alt="' + (file.alt ? file.alt : '') + '"></a>' + '<div class="operate">' + '<a href="javascript:;" class="js-del-item">' + '<i class="fa fa-remove"></i> 移除</a>' + '</div></div>';
379                $(DOM).append(tpl);
380            }
381            $('.js-item', DOM).on('click', function (event) {
382                var el = $(this);
383                // 初始化拖拽,避免影响点击事件的逻辑
384                seajs.use(['/assets/js/kaka/libs/dragsort/jquery.dragsort-0.5.2.js'], function (dragsort) {
385                    $(DOM).dragsort("destroy");
386                    $(DOM).dragsort({
387                        placeHolderTemplate: "<div class='img-item place-holder'></div>",
388                        dragEnd: function () {
389                            $(DOM).find('.img-item').removeAttr('style');
390                        }
391                    });
392                });
393                // 显示/隐藏 .alt 元素
394                $('.alt', DOM).hide();
395                $('.alt', el).show();
396                // 阻止拖拽时触发的 mouseup 事件
397                $(document).mouseup(function (e) {
398                    var _con = el;
399                    if (!_con.is(e.target) && _con.has(e.target).length === 0) {
400                        $('.alt', DOM).hide();
401                    }
402                });
403                // 防止事件冒泡
404                event.stopPropagation();
405            });
406            $('.js-del-item', DOM).on('click',
407                function () {
408                    $(this).parents('.js-item').remove();
409                });
410        }
411        if (val) {
412            if (limit > 1) {
413                $.applyImages(eval('(' + val + ')'), ipt, dom);
414            } else {
415                $.applyImage(val, ipt, dom);
416            }
417        }
418        $('[role="btn"]', el).unbind('click');
419        $('[role="btn"]', el).bind('click',
420            function () {
421                $('#' + id).remove();
422                $('body').append('<div class="modal fade" id="' + id + '" tabindex="-1" role="dialog" aria-hidden="false"></div>');
423                $('#' + id).data('selectorSearchUrl', ajaxUrl);
424                $('#' + id).load(url,
425                    function () {
426                        $('#' + id).modal("show");
427                        $('#' + id).find('.btn-ok').click(function () {
428                            var selectedImages = getSelectedImages($('#' + id));
429                            if (limit > 1) {
430                                $.applyImages(selectedImages, ipt, dom);
431                            } else if (selectedImages[0]) {
432                                $.applyImage(selectedImages[0].src, ipt, dom);
433                            }
434                        });
435                    })
436            });
437    }
438    self.userSelector = function (el, opts) {
439        var id = 'user-selector';
440        var role = $(el).data('role');
441        var url = '/?module=admincp&controller=user&action=selector&role=' + role;
442        $('[role="btn"]', el).unbind('click');
443        $('[role="btn"]', el).bind('click',
444            function () {
445                $('#' + id).remove();
446                $('body').append('<div class="modal fade" id="' + id + '" tabindex="-1" role="dialog" aria-hidden="false"></div>');
447                $('#' + id).load(url,
448                    function () {
449                        $('#' + id).modal("show");
450                    });
451            });
452    }
453    self.tagsinput = function (el, opts) {
454        seajs.use(['/assets/js/kaka/libs/tagsinput/bootstrap-typeahead.js', '/assets/js/kaka/libs/tagsinput/bootstrap-tagsinput.js', '/assets/js/kaka/libs/tagsinput/bootstrap-tagsinput.css'],
455            function () {
456                var remoteUrl = $(el).data('typeahead');
457                if (remoteUrl) {
458                    $(el).tagsinput({
459                        typeaheadjs: {
460                            valueKey: 'value',
461                            source: function (query, process) {
462                                $.getJSON(remoteUrl, {
463                                        q: query
464                                    },
465                                    function (data) {
466                                        process(data);
467                                    });
468                            }
469                        }
470                    });
471                } else {
472                    $(el).tagsinput();
473                }
474            });
475    }
476    self.dragsort = function (el, opts) {
477        seajs.use(['/assets/js/kaka/libs/dragsort/jquery.dragsort
477-0.5.2.js'],
478            function (dragsort) {
479                $(el).dragsort({
480                    dragSelectorExclude: "input, textarea, select, a, button",
481                    dragSelector: 'tr',
482                });
483            });
484    }
485    self.chart = function (el, opts) {
486        seajs.use(['/assets/js/kaka/libs/highcharts/highcharts.js'],
487            function () {
488                var defaults = {
489                    title: {
490                        text: false
491                    },
492                    chart: {},
493                    legend: {},
494                    credits: {
495                        enabled: false
496                    },
497                    yAxis: {
498                        title: {
499                            text: ''
500                        },
501                    }
502                };
503                opts = $.extend(true, defaults, opts);
504                if ($(el).attr('id')) {
505                    var obj = $(el).attr('id');
506                } else {
507                    var obj = 'charts-' + $(el).index();
508                    $(el).attr('id', obj);
509                }
510                if (opts.series && opts.series.length == 1) {
511                }
512                Highcharts.chart(obj, opts);
513            });
514    }
515    self.peity = function (el, opts) {
516        seajs.use(['/assets/js/kaka/libs/peity/peity.min.js'],
517            function () {
518                var defaults = {
519                    width: $(el).css('width'),
520                    height: $(el).css('height'),
521                }
522                opts = $.extend(true, defaults, opts);
523                $(el).peity(opts.type, opts);
524            });
525    }
526    self.dmenu = function (el, opts) {
527        seajs.use(['/assets/js/kaka/libs/kaka.dmenu.js'],
528            function () {
529                var className = 'js-kaka-dmenu-' + $(el).index();
530                $(el).hide().after('<div class="' + className + ' form-inline"></div>');
531                if (opts.rows) {
532                    var tpl = '<select size="' + (opts.rows) + '" class="form-control" style="margin-right:8px; width:200px"></select>';
533                } else {
534                    var tpl = '<select class="form-control form-control-select" style="margin-right:8px; width:200px"></select>';
535                }
536                var defaults = {
537                    htmlTpl: tpl,
538                    script: opts.srv,
539                    selected: $(opts.iptDom).val(),
540                    firstText: opts.deftext ? opts.deftext : '主分类',
541                    callback: function (el, data) {
542                        $(el).val(data.id > 0 ? data.id : 0);
543                        var path = new Array();
544                        $('.' + className + '>select').each(function () {
545                            path.push($('option:selected', this).text());
546                        });
547                        $(opts.textDom).val(path.join(' > '));
548                        $(opts.iptDom).val(data.id);
549                    }
550                }
551                opts = $.extend(true, defaults, opts);
552                new kakaDmenu('.' + className, opts);
553            });
554    }
555    self.slider = function (el, opts) {
556        seajs.use(['/assets/js/kaka/libs/slider/bxslider.min.js'],
557            function () {
558                var defaults = {
559                    'controls': false,
560                    'pager': false,
561                    'auto': true,
562                }
563                opts = $.extend(true, defaults, opts);
564                if (opts.min) {
565                    opts.minSlides = opts.min;
566                }
567                if (opts.max) {
568                    opts.maxSlides = opts.max;
569                }
570                if (opts.move) {
571                    opts.moveSlides = opts.move;
572                }
573                return $(el).bxSlider(opts);
574            });
575    }
576    self.explorer = function (el, opts) {
577        seajs.use(['/assets/js/kaka/libs/kaka.explorer.js?v=1.43'],
578            function () {
579                return new kakaExplorer(el, opts);
580            });
581    }
582    self.init('body');
583    return self;
584}
585var kaka = new kaka();
586window.kaka = kaka;

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.