¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * fa徿 éæ©å¨ æ ¹æ®å¼æºé¡¹ç®https://gitee.com/wujiawei0926/iconpickerä¿®æ¹èæ¥ |
| | | * @author wujiawei0926@yeah.net chung@99php.cn |
| | | * @version 1.1 |
| | | */ |
| | | |
| | | layui.define(['laypage', 'form'], function (exports) { |
| | | "use strict"; |
| | | |
| | | var IconPicker = function () { |
| | | this.v = '1.1'; |
| | | }, _MOD = 'iconPickerFa', |
| | | _this = this, |
| | | $ = layui.jquery, |
| | | laypage = layui.laypage, |
| | | form = layui.form, |
| | | BODY = 'body', |
| | | TIPS = 'è¯·éæ©å¾æ '; |
| | | |
| | | /** |
| | | * 渲æç»ä»¶ |
| | | */ |
| | | IconPicker.prototype.render = function (options) { |
| | | var opts = options, |
| | | // DOMéæ©å¨ |
| | | elem = opts.elem, |
| | | // æ°æ®ç±»åï¼fontClass/unicode |
| | | url = opts.url, |
| | | // æ¯å¦å页ï¼true/false |
| | | page = opts.page == null ? true : opts.page, |
| | | // æ¯é¡µæ¾ç¤ºæ°é |
| | | limit = opts.limit == null ? 12 : opts.limit, |
| | | // æ¯å¦å¼å¯æç´¢ï¼true/false |
| | | search = opts.search == null ? true : opts.search, |
| | | // æ¯ä¸ªå¾æ æ ¼åç宽度ï¼'43px'æ'20%' |
| | | cellWidth = opts.cellWidth, |
| | | // ç¹å»åè° |
| | | click = opts.click, |
| | | // 渲ææååçåè° |
| | | success = opts.success, |
| | | // jsonæ°æ® |
| | | data = {}, |
| | | // å¯ä¸æ è¯ |
| | | tmp = new Date().getTime(), |
| | | // åå§åæ¶inputçå¼ |
| | | ORIGINAL_ELEM_VALUE = $(elem).val(), |
| | | TITLE = 'layui-select-title', |
| | | TITLE_ID = 'layui-select-title-' + tmp, |
| | | ICON_BODY = 'layui-iconpicker-' + tmp, |
| | | PICKER_BODY = 'layui-iconpicker-body-' + tmp, |
| | | PAGE_ID = 'layui-iconpicker-page-' + tmp, |
| | | LIST_BOX = 'layui-iconpicker-list-box', |
| | | selected = 'layui-form-selected', |
| | | unselect = 'layui-unselect'; |
| | | |
| | | var a = { |
| | | init: function () { |
| | | data = common.getData(url); |
| | | |
| | | a.hideElem().createSelect().createBody().toggleSelect(); |
| | | a.preventEvent().inputListen(); |
| | | common.loadCss(); |
| | | |
| | | if (success) { |
| | | success(this.successHandle()); |
| | | } |
| | | |
| | | return a; |
| | | }, |
| | | successHandle: function () { |
| | | var d = { |
| | | options: opts, |
| | | data: data, |
| | | id: tmp, |
| | | elem: $('#' + ICON_BODY) |
| | | }; |
| | | return d; |
| | | }, |
| | | /** |
| | | * éèelem |
| | | */ |
| | | hideElem: function () { |
| | | $(elem).hide(); |
| | | return a; |
| | | }, |
| | | /** |
| | | * ç»å¶selectä¸æéæ©æ¡ |
| | | */ |
| | | createSelect: function () { |
| | | var oriIcon = '<i class="fa">'; |
| | | |
| | | // é»è®¤å¾æ |
| | | if (ORIGINAL_ELEM_VALUE === '') { |
| | | ORIGINAL_ELEM_VALUE = 'fa-adjust'; |
| | | |
| | | } |
| | | |
| | | |
| | | oriIcon = '<i class="fa ' + ORIGINAL_ELEM_VALUE + '">'; |
| | | |
| | | oriIcon += '</i>'; |
| | | |
| | | var selectHtml = '<div class="layui-iconpicker layui-unselect layui-form-select" id="' + ICON_BODY + '">' + |
| | | '<div class="' + TITLE + '" id="' + TITLE_ID + '">' + |
| | | '<div class="layui-iconpicker-item">' + |
| | | '<span class="layui-iconpicker-icon layui-unselect">' + |
| | | oriIcon + |
| | | '</span>' + |
| | | '<i class="layui-edge"></i>' + |
| | | '</div>' + |
| | | '</div>' + |
| | | '<div class="layui-anim layui-anim-upbit" style="">' + |
| | | '123' + |
| | | '</div>'; |
| | | $(elem).after(selectHtml); |
| | | return a; |
| | | }, |
| | | /** |
| | | * å±å¼/æå ä¸ææ¡ |
| | | */ |
| | | toggleSelect: function () { |
| | | var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge'; |
| | | a.event('click', item, function (e) { |
| | | var $icon = $('#' + ICON_BODY); |
| | | if ($icon.hasClass(selected)) { |
| | | $icon.removeClass(selected).addClass(unselect); |
| | | } else { |
| | | // éèå
¶ä»picker |
| | | $('.layui-form-select').removeClass(selected); |
| | | // æ¾ç¤ºå½åpicker |
| | | $icon.addClass(selected).removeClass(unselect); |
| | | } |
| | | e.stopPropagation(); |
| | | }); |
| | | return a; |
| | | }, |
| | | /** |
| | | * ç»å¶ä¸»ä½é¨å |
| | | */ |
| | | createBody: function () { |
| | | // è·åæ°æ® |
| | | var searchHtml = ''; |
| | | |
| | | if (search) { |
| | | searchHtml = '<div class="layui-iconpicker-search">' + |
| | | '<input class="layui-input">' + |
| | | '<i class="layui-icon"></i>' + |
| | | '</div>'; |
| | | } |
| | | |
| | | // ç»ådom |
| | | var bodyHtml = '<div class="layui-iconpicker-body" id="' + PICKER_BODY + '">' + |
| | | searchHtml + |
| | | '<div class="' + LIST_BOX + '"></div> ' + |
| | | '</div>'; |
| | | $('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml); |
| | | a.search().createList().check().page(); |
| | | |
| | | return a; |
| | | }, |
| | | /** |
| | | * ç»å¶å¾æ å表 |
| | | * @param text æ¨¡ç³æ¥è¯¢å
³é®å |
| | | * @returns {string} |
| | | */ |
| | | createList: function (text) { |
| | | var d = data, |
| | | l = d.length, |
| | | pageHtml = '', |
| | | listHtml = $('<div class="layui-iconpicker-list">')//'<div class="layui-iconpicker-list">'; |
| | | |
| | | // 计ç®åé¡µæ°æ® |
| | | var _limit = limit, // æ¯é¡µæ¾ç¤ºæ°é |
| | | _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // æ»è®¡å¤å°é¡µ |
| | | _id = PAGE_ID; |
| | | |
| | | // 徿 å表 |
| | | var icons = []; |
| | | |
| | | for (var i = 0; i < l; i++) { |
| | | var obj = d[i]; |
| | | |
| | | // 夿æ¯å¦æ¨¡ç³æ¥è¯¢ |
| | | if (text && obj.indexOf(text) === -1) { |
| | | continue; |
| | | } |
| | | |
| | | // æ¯å¦èªå®ä¹æ ¼å宽度 |
| | | var style = ''; |
| | | if (cellWidth !== null) { |
| | | style += ' style="width:' + cellWidth + '"'; |
| | | } |
| | | |
| | | // æ¯ä¸ªå¾æ dom |
| | | var icon = '<div class="layui-iconpicker-icon-item" title="' + obj + '" ' + style + '>'; |
| | | |
| | | icon += '<i class="fa ' + obj + '"></i>'; |
| | | |
| | | icon += '</div>'; |
| | | |
| | | icons.push(icon); |
| | | } |
| | | |
| | | // æ¥è¯¢åºå¾æ ååå页 |
| | | l = icons.length; |
| | | _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1); |
| | | for (var i = 0; i < _pages; i++) { |
| | | // ælimitåå |
| | | var lm = $('<div class="layui-iconpicker-icon-limit" id="layui-iconpicker-icon-limit-' + tmp + (i + 1) + '">'); |
| | | |
| | | for (var j = i * _limit; j < (i + 1) * _limit && j < l; j++) { |
| | | lm.append(icons[j]); |
| | | } |
| | | |
| | | listHtml.append(lm); |
| | | } |
| | | |
| | | // æ æ°æ® |
| | | if (l === 0) { |
| | | listHtml.append('<p class="layui-iconpicker-tips">æ æ°æ®</p>'); |
| | | } |
| | | |
| | | // 夿æ¯å¦å页 |
| | | if (page) { |
| | | $('#' + PICKER_BODY).addClass('layui-iconpicker-body-page'); |
| | | pageHtml = '<div class="layui-iconpicker-page" id="' + PAGE_ID + '">' + |
| | | '<div class="layui-iconpicker-page-count">' + |
| | | '<span id="' + PAGE_ID + '-current">1</span>/' + |
| | | '<span id="' + PAGE_ID + '-pages">' + _pages + '</span>' + |
| | | ' (<span id="' + PAGE_ID + '-length">' + l + '</span>)' + |
| | | '</div>' + |
| | | '<div class="layui-iconpicker-page-operate">' + |
| | | '<i class="layui-icon" id="' + PAGE_ID + '-prev" data-index="0" prev></i> ' + |
| | | '<i class="layui-icon" id="' + PAGE_ID + '-next" data-index="2" next></i> ' + |
| | | '</div>' + |
| | | '</div>'; |
| | | } |
| | | |
| | | |
| | | $('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml); |
| | | return a; |
| | | }, |
| | | // 黿¢Layuiçä¸äºé»è®¤äºä»¶ |
| | | preventEvent: function () { |
| | | var item = '#' + ICON_BODY + ' .layui-anim'; |
| | | a.event('click', item, function (e) { |
| | | e.stopPropagation(); |
| | | }); |
| | | return a; |
| | | }, |
| | | // å页 |
| | | page: function () { |
| | | var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon'; |
| | | |
| | | $(icon).unbind('click'); |
| | | a.event('click', icon, function (e) { |
| | | var elem = e.currentTarget, |
| | | total = parseInt($('#' + PAGE_ID + '-pages').html()), |
| | | isPrev = $(elem).attr('prev') !== undefined, |
| | | // æé®ä¸æ ç页ç |
| | | index = parseInt($(elem).attr('data-index')), |
| | | $cur = $('#' + PAGE_ID + '-current'), |
| | | // ç¹å»æ¶æ£å¨æ¾ç¤ºç页ç |
| | | current = parseInt($cur.html()); |
| | | |
| | | // åé¡µæ°æ® |
| | | if (isPrev && current > 1) { |
| | | current = current - 1; |
| | | $(icon + '[prev]').attr('data-index', current); |
| | | } else if (!isPrev && current < total) { |
| | | current = current + 1; |
| | | $(icon + '[next]').attr('data-index', current); |
| | | } |
| | | $cur.html(current); |
| | | |
| | | // 徿 æ°æ® |
| | | $('#' + ICON_BODY + ' .layui-iconpicker-icon-limit').hide(); |
| | | $('#layui-iconpicker-icon-limit-' + tmp + current).show(); |
| | | e.stopPropagation(); |
| | | }); |
| | | return a; |
| | | }, |
| | | /** |
| | | * æç´¢ |
| | | */ |
| | | search: function () { |
| | | var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input'; |
| | | a.event('input propertychange', item, function (e) { |
| | | var elem = e.target, |
| | | t = $(elem).val(); |
| | | a.createList(t); |
| | | }); |
| | | return a; |
| | | }, |
| | | /** |
| | | * ç¹å»éä¸å¾æ |
| | | */ |
| | | check: function () { |
| | | var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item'; |
| | | a.event('click', item, function (e) { |
| | | var el = $(e.currentTarget).find('.fa'), |
| | | icon = ''; |
| | | |
| | | var clsArr = el.attr('class').split(/[\s\n]/), |
| | | cls = clsArr[1], |
| | | icon = cls; |
| | | $('#' + TITLE_ID).find('.layui-iconpicker-item .fa').html('').attr('class', clsArr.join(' ')); |
| | | |
| | | |
| | | $('#' + ICON_BODY).removeClass(selected).addClass(unselect); |
| | | $(elem).val(icon).attr('value', icon); |
| | | // åè° |
| | | if (click) { |
| | | click({ |
| | | icon: icon |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | return a; |
| | | }, |
| | | // çå¬åå§inputæ°å¼æ¹å |
| | | inputListen: function () { |
| | | var el = $(elem); |
| | | a.event('change', elem, function () { |
| | | var value = el.val(); |
| | | }) |
| | | // el.change(function(){ |
| | | |
| | | // }); |
| | | return a; |
| | | }, |
| | | event: function (evt, el, fn) { |
| | | $(BODY).on(evt, el, fn); |
| | | } |
| | | }; |
| | | |
| | | var common = { |
| | | /** |
| | | * å è½½æ ·å¼è¡¨ |
| | | */ |
| | | loadCss: function () { |
| | | var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}'; |
| | | var $style = $('head').find('style[iconpicker]'); |
| | | if ($style.length === 0) { |
| | | $('head').append('<style rel="stylesheet" iconpicker>' + css + '</style>'); |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * è·åæ°æ® |
| | | */ |
| | | getData: function (url) { |
| | | var iconlist = []; |
| | | $.ajax({ |
| | | url: url, |
| | | type: 'get', |
| | | contentType: "application/x-www-form-urlencoded; charset=UTF-8", |
| | | async: false, |
| | | success: function (ret) { |
| | | var exp = /fa-var-(.*):/ig; |
| | | var result; |
| | | while ((result = exp.exec(ret)) != null) { |
| | | iconlist.push('fa-' + result[1]); |
| | | } |
| | | }, |
| | | error: function (xhr, textstatus, thrown) { |
| | | layer.msg('fa徿 æ¥å£æè¯¯'); |
| | | } |
| | | }); |
| | | return iconlist; |
| | | } |
| | | }; |
| | | |
| | | a.init(); |
| | | return new IconPicker(); |
| | | }; |
| | | |
| | | /** |
| | | * éä¸å¾æ |
| | | * @param filter lay-filter |
| | | * @param iconName 徿 åç§°ï¼èªå¨è¯å«fontClass/unicode |
| | | */ |
| | | IconPicker.prototype.checkIcon = function (filter, iconName) { |
| | | var el = $('*[lay-filter=' + filter + ']'), |
| | | p = el.next().find('.layui-iconpicker-item .fa'), |
| | | c = iconName; |
| | | |
| | | if (c.indexOf('#xe') > 0) { |
| | | p.html(c); |
| | | } else { |
| | | p.html('').attr('class', 'fa ' + c); |
| | | } |
| | | el.attr('value', c).val(c); |
| | | }; |
| | | |
| | | var iconPicker = new IconPicker(); |
| | | exports(_MOD, iconPicker); |
| | | }); |