作者 jingchen
1 个管道 的构建 取消 耗费 15 秒

增加新功能

正在显示 40 个修改的文件 包含 4035 行增加1 行删除

要显示太多修改。

为保证性能只显示 40 of 40+ 个文件。

<<<<<<< HEAD
<?php
namespace addons\ueditor;
... ... @@ -40,3 +41,47 @@ class Ueditor extends Addons
];
}
}
=======
<?php
namespace addons\ueditor;
use think\Addons;
/**
* 百度Ueditor插件
*/
class Ueditor extends Addons
{
/**
* 插件安装方法
* @return bool
*/
public function install()
{
return true;
}
/**
* 插件卸载方法
* @return bool
*/
public function uninstall()
{
return true;
}
/**
* @param $params
*/
public function configInit(&$params)
{
$config = $this->getConfig();
$params['ueditor'] = [
'classname' => $config['classname'] ?? '.editor',
'baiduMapAk' => $config['baiduMapAk'] ?? ''
];
}
}
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
<<<<<<< HEAD
window.UEDITOR_HOME_URL = Config.__CDN__ + "/assets/addons/ueditor/";
require.config({
paths: {
... ... @@ -60,4 +61,68 @@ require(['form', 'upload'], function (Form, Upload) {
console.log('绑定editor事件', e)
}
}
=======
window.UEDITOR_HOME_URL = Config.__CDN__ + "/assets/addons/ueditor/";
require.config({
paths: {
'ueditor.config': '../addons/ueditor/ueditor.config',
'ueditor': '../addons/ueditor/ueditor.all.min',
'ueditor.zh': '../addons/ueditor/i18n/zh-cn/zh-cn',
'zeroclipboard': '../addons/ueditor/third-party/zeroclipboard/ZeroClipboard.min',
},
shim: {
'ueditor': {
deps: ['zeroclipboard', 'ueditor.config'],
exports: 'UE',
init: function (ZeroClipboard) {
//导出到全局变量,供ueditor使用
window.ZeroClipboard = ZeroClipboard;
},
},
'ueditor.zh': ['ueditor']
}
});
require(['form', 'upload'], function (Form, Upload) {
var _bindevent = Form.events.bindevent;
Form.events.bindevent = function (form) {
_bindevent.apply(this, [form]);
try {
//绑定editor事件
require(['ueditor', 'ueditor.zh'], function (UE, undefined) {
UE.list = [];
window.UEDITOR_CONFIG['uploadService'] = function (context, editor) {
return {
Upload: () => { return Upload },
Fast: () => { return Fast },
}
};
$(Config.ueditor.classname || '.editor', form).each(function () {
var id = $(this).attr("id");
var name = $(this).attr("name");
$(this).removeClass('form-control');
UE.list[id] = UE.getEditor(id, {
allowDivTransToP: false, //阻止div自动转p标签
initialFrameWidth: '100%',
initialFrameHeight: 320,
autoFloatEnabled: false,
baiduMapAk: Config.ueditor.baiduMapAk || '', //百度地图api密钥(ak)
// autoHeightEnabled: true, //自动高度
zIndex: 90,
xssFilterRules: false,
outputXssFilter: false,
inputXssFilter: false,
catchRemoteImageEnable: true,
imageAllowFiles: '',//允许上传的图片格式,编辑器默认[".png", ".jpg", ".jpeg", ".gif", ".bmp"]
});
UE.list[id].addListener("contentChange", function () {
$('#' + id).val(this.getContent());
$('textarea[name="' + name + '"]').val(this.getContent());
})
});
})
} catch (e) {
console.log('绑定editor事件', e)
}
}
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
});
\ No newline at end of file
... ...
... ... @@ -4,7 +4,10 @@ namespace app\admin\controller;
use app\admin\model\AdminLog;
use app\common\controller\Backend;
<<<<<<< HEAD
use app\admin\model\Order;
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
use think\Config;
use think\Db;
use think\Hook;
... ... @@ -19,7 +22,11 @@ class Index extends Backend
{
protected $noNeedLogin = ['login'];
<<<<<<< HEAD
protected $noNeedRight = ['index', 'logout', 'timi_msg'];
=======
protected $noNeedRight = ['index', 'logout','timi_msg'];
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
protected $layout = '';
protected $whiteList = [];
... ... @@ -28,16 +35,25 @@ class Index extends Backend
parent::_initialize();
//移除HTML标签
$this->request->filter('trim,strip_tags,htmlspecialchars');
<<<<<<< HEAD
$this->whiteList = ['0.0.0.0', '127.0.0.1', '139.9.122.254', '111.164.178.189', '222.70.235.227'];
}
/**
* 使用轮询订单提醒
=======
$this->whiteList = ['0.0.0.0','127.0.0.1','139.9.122.254','111.164.178.189','222.70.235.227'];
}
/**
* 订单提醒
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
* @return void
* @throws \think\Exception
*/
public function timi_msg()
{
<<<<<<< HEAD
// 获取服务订单通知
$serviceOrderCount = Order
::where(["type" => 1, "status" => 7])
... ... @@ -81,6 +97,22 @@ class Index extends Backend
}
$this->success("有新订单消息", "", $data);
=======
//处理逻辑
//获取新订单
$count = Db::name("order")->where(["status"=>7])->whereNull('deletetime')->count('id');
$counts = Db::name("order")->whereNull('deletetime')->where(["status"=>7,'tx_status'=>0])->count('id');
$find = Db::name("order")->whereNull('deletetime')->where(["status"=>7,'tx_status'=>0])->find();
$createtime = $find['createtime'];
//有新消息或者状态未变更都提醒
if ($count > 0) {
$data['num'] = $count;
$data['nums'] = $counts;
\db('order')->where('status', 7)->update(['tx_status'=>1]);
$this->success("有新待服务订单消息", "", $data);
} else {
//$this->success('暂无消息');
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
}
... ... @@ -99,9 +131,15 @@ class Index extends Backend
//左侧菜单
list($menulist, $navlist, $fixedmenu, $referermenu) = $this->auth->getSidebar([
'dashboard' => 'hot',
<<<<<<< HEAD
'addon' => ['new', 'red', 'badge'],
'auth/rule' => __('Menu'),
'general' => ['new', 'purple'],
=======
'addon' => ['new', 'red', 'badge'],
'auth/rule' => __('Menu'),
'general' => ['new', 'purple'],
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
], $this->view->site['fixedpage']);
$action = $this->request->request('action');
if ($this->request->isPost()) {
... ... @@ -133,6 +171,7 @@ class Index extends Backend
$keeplogin = $this->request->post('keeplogin');
$token = $this->request->post('__token__');
$rule = [
<<<<<<< HEAD
'username' => 'require|length:3,30',
'password' => 'require|length:3,30',
'__token__' => 'require|token',
... ... @@ -140,6 +179,15 @@ class Index extends Backend
$data = [
'username' => $username,
'password' => $password,
=======
'username' => 'require|length:3,30',
'password' => 'require|length:3,30',
'__token__' => 'require|token',
];
$data = [
'username' => $username,
'password' => $password,
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
'__token__' => $token,
];
if (Config::get('fastadmin.login_captcha')) {
... ...
... ... @@ -4,7 +4,10 @@ return [
'Id' => 'ID',
'Name' => '充值卡名称',
'Subname' => '充值卡标题',
<<<<<<< HEAD
'Desc' => '充值卡说明',
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
'Images' => '充值卡版面',
'Createtime' => '创建时间',
'Updatetime' => '更新时间'
... ...
... ... @@ -2,7 +2,10 @@
namespace app\admin\model;
<<<<<<< HEAD
use app\admin\model\gift\Money;
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
use think\Model;
use traits\model\SoftDelete;
... ... @@ -47,8 +50,11 @@ class Order extends Model
}
<<<<<<< HEAD
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
public function getTypeList()
{
... ...
... ... @@ -55,7 +55,7 @@ class UserGift extends Model
public static function getShareCard($cardId, $userId)
{
$result = self::where(['id' => $cardId, 'user_id' => $userId])->find();
$result = self::where(['id' => $cardId, 'user_id' => $userId,'get_status' => 'unclaimed'])->find();
if (!$result) {
return false;
}
... ...
... ... @@ -18,20 +18,28 @@
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
<div class="input-group-addon no-border no-padding">
<<<<<<< HEAD
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
=======
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
<<<<<<< HEAD
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Desc')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-desc" class="form-control editor" rows="5" name="row[desc]" cols="50"></textarea>
</div>
</div>
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
... ...
... ... @@ -12,6 +12,7 @@
<input id="c-subname" class="form-control" name="row[subname]" type="text" value="{$row.subname|htmlentities}">
</div>
</div>
<<<<<<< HEAD
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
... ... @@ -33,6 +34,22 @@
<textarea id="c-desc" class="form-control editor" rows="5" name="row[desc]" cols="50">{$row.desc|htmlentities}</textarea>
</div>
</div>
=======
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">-->
<!-- <div class="input-group">-->
<!-- <input id="c-images" class="form-control" size="50" name="row[images]" type="text" value="{$row.images|htmlentities}">-->
<!-- <div class="input-group-addon no-border no-padding">-->
<!-- <span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>-->
<!-- <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>-->
<!-- </div>-->
<!-- <span class="msg-box n-right" for="c-images"></span>-->
<!-- </div>-->
<!-- <ul class="row list-inline faupload-preview" id="p-images"></ul>-->
<!-- </div>-->
<!-- </div>-->
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
... ...
... ... @@ -6,8 +6,13 @@
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
<<<<<<< HEAD
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('activity/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
=======
<!-- <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>-->
<!-- <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('activity/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>-->
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
<div class="dropdown btn-group {:$auth->check('activity/multi')?'':'hide'}">
... ... @@ -21,7 +26,11 @@
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('activity/edit')}"
<<<<<<< HEAD
data-operate-del="{:$auth->check('activity/del')}"
=======
data-operate-del=""
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
width="100%">
</table>
</div>
... ...
... ... @@ -2,6 +2,7 @@
<section class="sidebar">
<!--订单提醒信息-->
<div class="l_kf" style="padding:10px;">
<<<<<<< HEAD
<div>
<a id='service_msg' href="#" target="_blank"> 需处理的服务订单:
<span class="badge" id="service_num" style="background-color: red;">0</span>
... ... @@ -14,13 +15,24 @@
</div>
<audio id="timi_audio">
<source src="http://soospa.jcyang.cn/assets/tixing.mp3" type="audio/mpeg">
=======
<a id='timimsg' href="#" target="_blank"> 需处理的待服务订单:
<span class="badge" id="timimsg_num" style="background-color: red;">0</span>
</a>
<audio id="timi_audio">
<source src="https://soospa.cn/assets/tixing.mp3" type="audio/mpeg">
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</audio>
</div>
<!-- 管理员信息 -->
<div class="user-panel hidden-xs">
<div class="pull-left image">
<<<<<<< HEAD
<a href="general/profile" class="addtabsit"><img src="{$admin.avatar|cdnurl|htmlentities}"
class="img-circle"/></a>
=======
<a href="general/profile" class="addtabsit"><img src="{$admin.avatar|cdnurl|htmlentities}" class="img-circle" /></a>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</div>
<div class="pull-left info">
<p>{$admin.nickname|htmlentities}</p>
... ...
... ... @@ -99,6 +99,7 @@
</div>
</div>
</div>
<<<<<<< HEAD
</div>
... ... @@ -108,6 +109,9 @@
<p>Copyright @ 朴曲(上海)健康管理有限公司 版权所有 <a href="https://beian.miit.gov.cn" target="_blank">
<text style="color:blue">沪ICP备2023009811号-2X</text>
</a></p>
=======
</div>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</div>
{include file="common/script" /}
</body>
... ...
... ... @@ -2,7 +2,10 @@
namespace app\api\controller;
<<<<<<< HEAD
use app\admin\model\UserGift;
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
use app\common\controller\Api;
use app\common\model\Activity;
use app\common\model\Card;
... ... @@ -167,5 +170,8 @@ class Active extends Api
$response->send();
}
<<<<<<< HEAD
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
\ No newline at end of file
... ...
... ... @@ -2,7 +2,10 @@
namespace app\api\controller;
<<<<<<< HEAD
use app\admin\model\UserGift;
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
use app\common\controller\Api;
/**
... ... @@ -42,6 +45,7 @@ class Crontab extends Api
$this->success('',$id);
}
<<<<<<< HEAD
/**
* 每天12点执行
*/
... ... @@ -59,6 +63,8 @@ class Crontab extends Api
}
}
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
/**
* 技师状态[tech_status表]
... ...
... ... @@ -41,6 +41,7 @@ class Demo extends Api
* @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功")
* @ApiReturnParams (name="data", type="object", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}", description="扩展数据返回")
* @ApiReturn ({
<<<<<<< HEAD
'code':'1',
'msg':'返回成功'
})
... ... @@ -49,6 +50,15 @@ class Demo extends Api
{
$order = \app\admin\model\gift\Order::where('order_sn', 'G2024120754545299')->find();
$order->save(['status' => 2]);
=======
'code':'1',
'msg':'返回成功'
})
*/
public function test()
{
$this->success('返回成功', $this->request->param());
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
/**
... ... @@ -66,8 +76,13 @@ class Demo extends Api
*/
public function test2()
{
<<<<<<< HEAD
$model = new \app\common\model\Order();
$model->consumeLog('F2023090749995750');
=======
$model = new \app\common\model\Order();
$model->consumeLog('F2023090749995750');
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
/**
... ... @@ -100,9 +115,15 @@ class Demo extends Api
*/
public function test3()
{
<<<<<<< HEAD
$id = $this->request->param('id');
$model = new \app\common\model\Order();
$model->setStatus($id);
=======
$id = $this->request->param('id');
$model = new \app\common\model\Order();
$model->setStatus($id);
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
... ...
... ... @@ -95,12 +95,14 @@ class Gift extends Api
$orderId = $this->request->post('order_id');
$userGift = UserGift::where(['order_id' => $orderId])->find();
$nickname = UserModel::where('id', $userGift['user_id'])->value('nickname');
$card_name = Cover::where('id',$userGift['card_id'])->value('title');
$this->success('获取成功', [
'poster' => cdnurl(Config::where('id', 27)->value('value'), true),
'code' => cdnurl($userGift->code, true),
'card_id' => $userGift['id'],
'user_id' => $userGift['user_id'],
'nickname' => $nickname,
'card_name' => $card_name,
]);
}
... ...
... ... @@ -153,7 +153,10 @@ class Goods extends Api
'total_price'=>$pay_price,
'pay_price'=>$pay_price,
'type'=>2,
<<<<<<< HEAD
'tx_status'=>0,
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
'createtime'=>time()
];
$order->save($orderdata);
... ... @@ -230,7 +233,11 @@ class Goods extends Api
'shphone'=>$address['tel'],
'shaddress'=>$address['city'].$address['address'],
'remark'=>$param['remark'] ? $param['remark'] : null,
<<<<<<< HEAD
'updatetime'=>time(),
=======
'updatetime'=>time()
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
];
$order->save($orderdata,['id'=>$param['order_id']]);
$id = $param['order_id'];
... ...
... ... @@ -87,7 +87,10 @@ if (!function_exists('cdnurl')) {
*/
function cdnurl($url, $domain = false)
{
<<<<<<< HEAD
if (!$url) return '';
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
$regex = "/^((?:[a-z]+:)?\/\/|data:image\/)(.*)/i";
$cdnurl = \think\Config::get('upload.cdnurl');
$url = preg_match($regex, $url) || ($cdnurl && stripos($url, $cdnurl) === 0) ? $url : $cdnurl . $url;
... ... @@ -542,6 +545,7 @@ EOT;
return $icon;
}
}
<<<<<<< HEAD
if (!function_exists('status_and_chinese')) {
... ... @@ -599,3 +603,5 @@ function self_log( $log_title, $log_content, $filename = "")
return error_log($log_content, 3, $log_filename);
}
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
... ... @@ -48,7 +48,11 @@ class UserCard extends Model
$data[] = db('activity')->where('id',$v)->find();
}
foreach ($data as $k => $v1){
<<<<<<< HEAD
$data[$k]['images'] = isset($v1['images']) && $v1['images'] ? cdnurl($v1['images'],true) : '';
=======
$data[$k]['images'] = cdnurl($v1['images'],true);
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
return $data;
}
... ...
... ... @@ -267,7 +267,11 @@ return [
//会员注册验证码类型email/mobile/wechat/text/false
'user_register_captcha' => 'text',
//登录验证码
<<<<<<< HEAD
'login_captcha' => false,
=======
'login_captcha' => true,
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
//登录失败超过10次则1天后重试
'login_failure_retry' => true,
//是否同一账号同一时间只能在一个地方登录
... ...
... ... @@ -13,6 +13,7 @@
use think\Env;
return [
<<<<<<< HEAD
// 服务器地址
'hostname' => Env::get('database.hostname', ''),
// 数据库名
... ... @@ -21,6 +22,27 @@ return [
'username' => Env::get('database.username', ''),
// 密码
'password' => Env::get('database.password', ''),
=======
//测试服务器
// //数据库类型
// 'type' => Env::get('database.type', 'mysql'),
// 服务器地址
// 'hostname' => Env::get('database.hostname', '127.0.0.1'),
// // 数据库名
// 'database' => Env::get('database.database', 'soospa'),
// // 用户名
// 'username' => Env::get('database.username', 'root'),
// // 密码
// 'password' => Env::get('database.password', ''),
// 服务器地址
'hostname' => Env::get('database.hostname', '119.3.83.59'),
// 数据库名
'database' => Env::get('database.database', 'soospa'),
// 用户名
'username' => Env::get('database.username', 'shs_zhangyang'),
// 密码
'password' => Env::get('database.password', 'bronet888!'),
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
// 端口
'hostport' => Env::get('database.hostport', ''),
// // 连接dsn
... ...
... ... @@ -3,6 +3,7 @@
return [
'autoload' => false,
'hooks' => [
<<<<<<< HEAD
'epay_config_init' => [
'epay',
],
... ... @@ -13,6 +14,8 @@ return [
'epay',
'third',
],
=======
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
'user_delete_successed' => [
'third',
],
... ... @@ -22,6 +25,12 @@ return [
'module_init' => [
'third',
],
<<<<<<< HEAD
=======
'action_begin' => [
'third',
],
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
'config_init' => [
'third',
'ueditor',
... ...
... ... @@ -4,7 +4,11 @@ return array (
'name' => 'Soo spa',
'beian' => '',
'cdnurl' => '',
<<<<<<< HEAD
'version' => '1.0.3',
=======
'version' => '1.0.2',
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
'timezone' => 'Asia/Shanghai',
'forbiddenip' => '',
'languages' =>
... ...
... ... @@ -31,8 +31,12 @@
"ext-pdo": "*",
"ext-bcmath": "*",
"txthinking/mailer": "^2.0",
<<<<<<< HEAD
"tinymeng/code": "^2.0",
"topthink/think-worker": "^1.0"
=======
"tinymeng/code": "^2.0"
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
},
"config": {
"preferred-install": "dist",
... ...
<<<<<<< HEAD
<p align="center">
<a href="https://jq.qq.com/?_wv=1027&k=5qVzRh4" title="Notadd 官方技术交流群"><img src="https://img.shields.io/badge/QQ%20Group-321735506-6782d6.svg?style=flat-square"></a>
... ... @@ -163,3 +164,170 @@ https://github.com/notadd/notadd
<a href="https://www.ucloud.cn/site/active/gift.html?ytag=notadd"><img src="https://www.notadd.com/src/ucloud_logo.svg" width="150" /></a> &nbsp;
=======
<p align="center">
<a href="https://jq.qq.com/?_wv=1027&k=5qVzRh4" title="Notadd 官方技术交流群"><img src="https://img.shields.io/badge/QQ%20Group-321735506-6782d6.svg?style=flat-square"></a>
<a href="https://travis-ci.org/notadd/neditor" title="Build Status"><img src="https://img.shields.io/travis/notadd/neditor/master.svg?style=flat-square"></a>
</p>
## 新版发布
2.1 发布,此次版本移除了后端相关代码,纯 ajax 提交,请配置 `neditor.config.js` `neditor.service.js`,支持各种后端或者云存储。
## 捐赠
该项目需要您的支持, [捐赠](https://gitee.com/notadd/neditor?donate=true) 以支持此项目的发展。
## 第一步:下载编辑器
**方式一:完整安装包 (推荐)**
* [Neditor.tar.xz](https://github.com/notadd/neditor/raw/gh-pages/neditor.tar.xz)
**方式二: npm安装**
`npm i @notadd/neditor -S`
**方式三:编译安装**
```shell
git clone https://github.com/notadd/neditor.git
npm install
npm run build
```
### 第二步:在浏览器打开 index.html ###
进入到目录 `dist` , 使用浏览器打开文件 `index.html`
如果看到了下面这样的编辑器,恭喜你,初次部署成功!
![部署成功](https://www.notadd.com/src/neditor-demo.webp)
## 相关版本
[Angular 版 Neditor](https://github.com/notadd/ngx-neditor)
[Vue 版 Neditor](https://github.com/caiya/vue-neditor-wrap) 【第三方维护】
[Rails 版 Neditor](https://github.com/zcpdog/neditor_rails) 【第三方维护】
## 技术支持
该项目基于 MIT 协议开源,任何组织/企业以及个人都可以免费使用(保留版权)。
如果您需要额外商业技术支持或者定制编辑器,请联系 QQ:1256985886
其他版本待添加
### 自定义的参数
编辑器有很多可自定义的参数项,在实例化的时候可以传入给编辑器:
```javascript
var ue = UE.getEditor('container', {
autoHeight: false
});
```
配置项也可以通过 `neditor.config.js` 文件修改,具体的配置方法请看 [前端配置项说明](http://fex.baidu.com/ueditor/#start-config1.4 前端配置项说明.md)、[后端配置项说明](http://fex.baidu.com/ueditor/#server-config)
### 编辑器图片、视频、涂鸦、附件上传service
编辑器上传逻辑单独在 `neditor.service.js` 文件配置,具体的配置方法见注释
### 设置和读取编辑器的内容
通 getContent 和 setContent 方法可以设置和读取编辑器的内容
```javascript
var ue = UE.getContent();
ue.ready(function(){
//设置编辑器的内容
ue.setContent('hello');
//获取html内容,返回: <p>hello</p>
var html = ue.getContent();
//获取纯文本内容,返回: hello
var txt = ue.getContentTxt();
});
```
Ueditor 的更多API请看[API 文档](http://ueditor.baidu.com/doc "ueditor API 文档")
## 下载地址
Neditor 码云: [http://gitee.com/notadd/neditor](http://gitee.com/notadd/neditor "Neditor github 地址")
Neditor github 地址:[http://github.com/notadd/neditor](http://github.com/notadd/neditor "Neditor github 地址")
## 相关链接
Ueditor 官网:[http://ueditor.baidu.com](http://ueditor.baidu.com "ueditor 官网")
Ueditor API 文档:[http://ueditor.baidu.com/doc](http://ueditor.baidu.com/doc "ueditor API 文档")
## 详细文档
Ueditor 文档:[http://fex.baidu.com/ueditor/](http://fex.baidu.com/ueditor/)
注: 对IE8以下版本不再承诺兼容
### 关于 HTTPS
使用了 [又拍云CDN](https://console.upyun.com/register/?invite=r17EYO3BW) 服务,支持跨域 和 https。
如果有需要,也可将下面域名改成自己的。
```
imgbaidu.b0.upaiyun.com
tingapi.b0.upaiyun.com
```
## 联系我们 ##
Neditor官方交流群:257753500
QQ 群: 321735506
[issue](http://github.com/notadd/neditor/issues)
## Todo
### 2.1
- [x] 将上传封装为 service ,支持非 GraphQL 接口。
- [x] 细节样式修改(美化)
### 2.2
- [ ] word 内图片自动上传
- [x] 粘贴图片转为本地图片(图片本地化)
### 2.3
- [ ] 上传文件/图片无需后端
### 3.0
- [ ] 使用 Typescript 重构
- [ ] 草稿箱功能与离线保存
- [ ] service worker 特性
- [ ] 实现 2.0 的大部分功能
## 其他项目:Notadd
https://github.com/notadd/notadd
## 感谢提供赞助:
<a href="https://www.ucloud.cn/site/active/gift.html?ytag=notadd"><img src="https://www.notadd.com/src/ucloud_logo.svg" width="150" /></a> &nbsp;
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
<<<<<<< HEAD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
... ... @@ -37,4 +38,45 @@
$focus(anchorInput);
</script>
</body>
=======
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*{color: #838383;margin: 0;padding: 0}
html,body {font-size: 12px;overflow: hidden; }
.content{padding:15px 0 0 15px;}
input{width:210px;height:28px;line-height:28px;margin-left: 4px;border-radius: 5px;border: 1px solid #ccc;}
</style>
</head>
<body>
<div class="content">
<span><var id="lang_input_anchorName"></var></span><input id="anchorName" value="" />
</div>
<script type="text/javascript" src="../internal.js"></script>
<script type="text/javascript">
var anchorInput = $G('anchorName'),
node = editor.selection.getRange().getClosedNode();
if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
anchorInput.value = node;
}
anchorInput.onkeydown = function(evt){
evt = evt || window.event;
if(evt.keyCode == 13){
editor.execCommand('anchor', anchorInput.value);
dialog.close();
domUtils.preventDefault(evt)
}
};
dialog.onok = function (){
editor.execCommand('anchor', anchorInput.value);
dialog.close();
};
$focus(anchorInput);
</script>
</body>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</html>
\ No newline at end of file
... ...
<<<<<<< HEAD
@charset "utf-8";
/* dialog样式 */
.wrapper {
... ... @@ -680,3 +681,687 @@ i.file-preview.file-type-png,
i.file-preview.file-type-psd{
background-position: -140px center;
}
=======
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float:left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 上传附件 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
/*border: 2px dashed #e6e6e6;*/
height: 172px;
padding-top: 150px;
text-align: center;
/*background: url(./images/image.png) center 70px no-repeat;*/
background-color: #f3f3f3;
color: #cccccc;
font-size: 18px;
position: relative;
top:0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 16px;
background: #f3f3f3;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
color: #646464;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
/* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */
border: 1px solid #ccc;
}
#upload .placeholder .webuploader-pick-hover {
border: 1px solid #00a2d4;
color: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li p.imgWrap.notimage {
margin-top: 0;
width: 111px;
height: 111px;
border: 1px #eeeeee solid;
}
#upload .filelist li p.imgWrap.notimage i.file-preview {
margin-top: 15px;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display:none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background-image: url(./images/success.gif) \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(../fonts/images/addfile.svg) no-repeat center;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display:none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display:none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused{
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover{
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter:alpha(opacity=60);
-moz-opacity:0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #fileList{
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li div.file-wrapper {
cursor: pointer;
position: absolute;
display: block;
width: 111px;
height: 111px;
border: 1px solid #eee;
background: url("./images/bg.png") repeat;
}
#online li div span.file-title{
display: block;
padding: 0 3px;
margin: 3px 0 0 0;
font-size: 12px;
height: 15px;
color: #555555;
text-align: center;
width: 107px;
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif) \9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
/* 在线文件的文件预览图标 */
i.file-preview {
display: block;
margin: 10px auto;
width: 70px;
height: 70px;
background-image: url("./images/file-icons.png");
background-image: url("./images/file-icons.gif") \9;
background-position: -140px center;
background-repeat: no-repeat;
}
i.file-preview.file-type-dir{
background-position: 0 center;
}
i.file-preview.file-type-file{
background-position: -140px center;
}
i.file-preview.file-type-filelist{
background-position: -210px center;
}
i.file-preview.file-type-zip,
i.file-preview.file-type-rar,
i.file-preview.file-type-7z,
i.file-preview.file-type-tar,
i.file-preview.file-type-gz,
i.file-preview.file-type-bz2{
background-position: -280px center;
}
i.file-preview.file-type-xls,
i.file-preview.file-type-xlsx{
background-position: -350px center;
}
i.file-preview.file-type-doc,
i.file-preview.file-type-docx{
background-position: -420px center;
}
i.file-preview.file-type-ppt,
i.file-preview.file-type-pptx{
background-position: -490px center;
}
i.file-preview.file-type-vsd{
background-position: -560px center;
}
i.file-preview.file-type-pdf{
background-position: -630px center;
}
i.file-preview.file-type-txt,
i.file-preview.file-type-md,
i.file-preview.file-type-json,
i.file-preview.file-type-htm,
i.file-preview.file-type-xml,
i.file-preview.file-type-html,
i.file-preview.file-type-js,
i.file-preview.file-type-css,
i.file-preview.file-type-php,
i.file-preview.file-type-jsp,
i.file-preview.file-type-asp{
background-position: -700px center;
}
i.file-preview.file-type-apk{
background-position: -770px center;
}
i.file-preview.file-type-exe{
background-position: -840px center;
}
i.file-preview.file-type-ipa{
background-position: -910px center;
}
i.file-preview.file-type-mp4,
i.file-preview.file-type-swf,
i.file-preview.file-type-mkv,
i.file-preview.file-type-avi,
i.file-preview.file-type-flv,
i.file-preview.file-type-mov,
i.file-preview.file-type-mpg,
i.file-preview.file-type-mpeg,
i.file-preview.file-type-ogv,
i.file-preview.file-type-webm,
i.file-preview.file-type-rm,
i.file-preview.file-type-rmvb{
background-position: -980px center;
}
i.file-preview.file-type-ogg,
i.file-preview.file-type-wav,
i.file-preview.file-type-wmv,
i.file-preview.file-type-mid,
i.file-preview.file-type-mp3{
background-position: -1050px center;
}
i.file-preview.file-type-jpg,
i.file-preview.file-type-jpeg,
i.file-preview.file-type-gif,
i.file-preview.file-type-bmp,
i.file-preview.file-type-png,
i.file-preview.file-type-psd{
background-position: -140px center;
}
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
<<<<<<< HEAD
<!doctype html>
<html>
<head>
... ... @@ -57,4 +58,65 @@
<script type="text/javascript" src="attachment.js"></script>
</body>
=======
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ueditor图片对话框</title>
<script type="text/javascript" src="../internal.js"></script>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
<!-- webuploader -->
<script src="../../third-party/webuploader/webuploader.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
<!-- attachment dialog -->
<link rel="stylesheet" href="attachment.css" type="text/css" />
</head>
<body>
<div class="wrapper">
<div id="tabhead" class="tabhead">
<span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
<span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
</div>
<div id="tabbody" class="tabbody">
<!-- 上传图片 -->
<div id="upload" class="panel focus">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div><div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<!-- 在线图片 -->
<div id="online" class="panel">
<div id="fileList"><var id="lang_imgLoading"></var></div>
</div>
</div>
</div>
<script type="text/javascript" src="attachment.js"></script>
</body>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</html>
\ No newline at end of file
... ...
<<<<<<< HEAD
/**
* User: Jinqn
* Date: 14-04-08
... ... @@ -809,4 +810,817 @@
};
=======
/**
* User: Jinqn
* Date: 14-04-08
* Time: 下午16:34
* 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
*/
(function () {
var uploadFile,
onlineFile;
window.onload = function () {
initTabs();
initButtons();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
setTabFocus(target.getAttribute('data-content-id'));
});
}
setTabFocus('upload');
}
/* 初始化tabbody */
function setTabFocus(id) {
if (!id) return;
var i, bodyId, tabs = $G('tabhead').children;
for (i = 0; i < tabs.length; i++) {
bodyId = tabs[i].getAttribute('data-content-id')
if (bodyId == id) {
domUtils.addClass(tabs[i], 'focus');
domUtils.addClass($G(bodyId), 'focus');
} else {
domUtils.removeClasses(tabs[i], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
switch (id) {
case 'upload':
uploadFile = uploadFile || new UploadFile('queueList');
break;
case 'online':
// onlineFile = onlineFile || new OnlineFile('fileList');
let Fast = editor.getOpt("uploadService")(this, editor).Fast();
dialog.close(false);
Fast.api.open("general/attachment/select?element_id=&multiple=true", "选择", {
callback: function (data) {
var urlArr = data.url.split(/\,/);
urlArr.forEach(function (item, index) {
var url = Fast.api.cdnurl(item, true);
editor.execCommand('insertfile', {
url: url
});
});
}
});
break;
}
}
/* 初始化onok事件 */
function initButtons() {
dialog.onok = function () {
var list = [], id, tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
if (domUtils.hasClass(tabs[i], 'focus')) {
id = tabs[i].getAttribute('data-content-id');
break;
}
}
switch (id) {
case 'upload':
list = uploadFile.getInsertList();
var count = uploadFile.getQueueCount();
if (count) {
$('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
return false;
}
break;
case 'online':
// list = onlineFile.getInsertList();
break;
}
editor.execCommand('insertfile', list);
};
}
/* 上传附件 */
function UploadFile(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadFile.prototype = {
init: function () {
this.fileList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
filesArray = [],
actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
fileMaxSize = editor.getOpt('fileMaxSize'),
acceptExtensions = (editor.getOpt('fileAllowFiles') || [".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pdf", ".odt", ".ott", ".fodt", ".uot", ".xml", ".dot", ".htm", ".html", ".rtf", ".docm", ".zip", ".rar", ".tar", ".7z", ".tar.gz", ".tar.bz", ".tar.xz"]).join('').replace(/\./g, ',').replace(/^[,]/, '');;
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('fileActionName')) {
$('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('fileFieldName'),
duplicate: true,
fileSingleSizeLimit: fileMaxSize,
compress: false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('<li id="' + file.id + '">' +
'<p class="title">' + file.name + '</p>' +
'<p class="imgWrap"></p>' +
'<p class="progress"><span></span></p>' +
'</li>'),
$btns = $('<div class="file-panel">' +
'<span class="cancel">' + lang.uploadDelete + '</span>' +
'<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
'<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('<p class="error"></p>').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
$wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
'<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
} else {
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('<img src="' + src + '">');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
}
percentages[file.id] = [file.size, 0];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[file.id][1] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[file.id][1] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({ height: 30 });
});
$li.on('mouseleave', function () {
$btns.stop().animate({ height: 0 });
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[file.id];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[0];
loaded += v[0] * v[1];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide(); $info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide(); $info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show(); $info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show(); $info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show(); $info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide(); $info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).
replace('_KB', WebUploader.formatSize(fileSize)).
replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
fileCount++;
fileSize += file.size;
}
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
filesArray.push(file);
});
uploader.on('fileDequeued', function (file) {
if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
fileCount--;
fileSize -= file.size;
}
removeFile(file);
updateTotalProgress();
var k = filesArray.findIndex(function (v) {
return v.id == file.id
});
filesArray.splice(k, 1);
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
header['X_Requested_With'] = 'XMLHttpRequest';
}
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[file.id][1] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
if (json.state == 'SUCCESS') {
// _this.fileList.push(json);
_this.fileList[$file.index()] = json
$file.append('<span class="success"></span>');
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, file) {
if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
addFile(file);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
// if (state === 'ready') {
// uploader.upload();
// } else if (state === 'paused') {
// uploader.upload();
// } else if (state === 'uploading') {
// uploader.stop();
// }
let uploadAction = editor.getOpt("uploadService")(_this, editor).Upload();
let Fast = editor.getOpt("uploadService")(_this, editor).Fast();
//替换上传方法
var filesObj = filesArray;
for (var i = 0; i < filesObj.length; i++) {
(function (j) {
var file = filesObj[j];
var id = filesObj[j].id;
var name = filesObj[j].name;
uploadAction.api.send(file.source.source, function (data) {
var json = {
url: Fast.api.cdnurl(data.url, true),
state: "SUCCESS",
title: name
};
var $file = $("#" + id);
// _this.fileList.push(json);
_this.fileList[$file.index()] = json
$file.append('<span class="success"></span>');
uploader.skipFile(file);
var $li = $("#" + file.id),
$percent = $li.find(".progress span");
$percent.css("width", 1 * 100 + "%");
percentages[file.id][1] = 1;
updateTotalProgress();
setState("confirm")
});
})(i);
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++];) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
getInsertList: function () {
var i, link, data, list = [],
prefix = editor.getOpt('fileUrlPrefix');
for (i = 0; i < this.fileList.length; i++) {
data = this.fileList[i];
link = data.url;
if (data == undefined) { //避免图片上传失败
continue;
}
list.push({
title: data.original || link.substr(link.lastIndexOf('/') + 1),
url: prefix + link
});
}
return list;
}
};
/* 在线附件 */
function OnlineFile(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineFile.prototype = {
init: function () {
this.initContainer();
this.initEvents();
this.initData();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('fileList'), 'scroll', function (e) {
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getFileData();
}
});
/* 选中图片 */
domUtils.on(this.list, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode;
if (li.tagName.toLowerCase() == 'li') {
if (domUtils.hasClass(li, 'selected')) {
domUtils.removeClasses(li, 'selected');
} else {
domUtils.addClass(li, 'selected');
}
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('fileManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getFileData();
},
/* 向后台拉取图片列表数据 */
getFileData: function () {
var _this = this;
if (!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
timeout: 100000,
data: utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
method: 'get',
onsuccess: function (r) {
try {
var json = eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if (_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if (r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
onerror: function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, filetype, preview, icon, _this = this,
urlPrefix = editor.getOpt('fileManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if (list[i] && list[i].url) {
item = document.createElement('li');
icon = document.createElement('span');
filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
if ("png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1) {
preview = document.createElement('img');
domUtils.on(preview, 'load', (function (image) {
return function () {
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
};
})(preview));
preview.width = 113;
preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36));
} else {
var ic = document.createElement('i'),
textSpan = document.createElement('span');
textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
preview = document.createElement('div');
preview.appendChild(ic);
preview.appendChild(textSpan);
domUtils.addClass(preview, 'file-wrapper');
domUtils.addClass(textSpan, 'file-title');
domUtils.addClass(ic, 'file-type-' + filetype);
domUtils.addClass(ic, 'file-preview');
}
domUtils.addClass(icon, 'icon');
item.setAttribute('data-url', urlPrefix + list[i].url);
if (list[i].original) {
item.setAttribute('data-title', list[i].original);
}
item.appendChild(preview);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [];
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var url = lis[i].getAttribute('data-url');
var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
list.push({
title: title,
url: url
});
}
}
return list;
}
};
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
})();
\ No newline at end of file
... ...
<<<<<<< HEAD
.wrapper{ width: 424px;margin: 20px; zoom:1;position: relative}
.tabbody{height:225px;}
.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
... ... @@ -94,4 +95,102 @@ div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
=======
.wrapper{ width: 424px;margin: 20px; zoom:1;position: relative}
.tabbody{height:225px;}
.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
.tabbody .focus { display: block;}
body{font-size: 12px;color: #888;overflow: hidden;}
input,label{vertical-align:middle}
.clear{clear: both;}
.pl{padding-left: 18px;padding-left: 23px\9;}
#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
#imageList img {cursor: pointer;border: 2px solid white;}
.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;border-radius: 4px;}
.content div{margin: 10px 0 10px 5px;}
.content .iptradio{margin: 0px 5px 5px 0px;}
.txt{width:280px; margin-left: 10px;height: 26px;line-height: 26px; border-radius: 5px;border: 1px solid #ccc;}
.wrapcolor{height: 19px;}
div.color{float: left;margin: 0;}
#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0 0 0 10px;float: left;}
div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
#custom input{height: 15px;min-height: 15px;width:20px;}
#repeatType{width:100px;
margin-left: 10px;
border-radius: 4px;
height: 23px;}
/* 图片管理样式 */
#imgManager {
width: 100%;
height: 225px;
}
#imgManager #imageList{
width: 100%;
overflow-x: hidden;
overflow-y: auto;
}
#imgManager ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#imgManager li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 9px 0 0 19px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#imgManager li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#imgManager li img {
cursor: pointer;
}
#imgManager li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#imgManager li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#imgManager li.selected .icon {
background-image: url(images/success.png);
background-position: 75px 75px;
}
#imgManager li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
\ No newline at end of file
... ...
<<<<<<< HEAD
<!DOCTYPE HTML>
<html>
<head>
... ... @@ -54,3 +55,61 @@
<script type="text/javascript" src="background.js"></script>
</body>
</html>
=======
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="background.css">
</head>
<body>
<div id="bg_container" class="wrapper">
<div id="tabHeads" class="tabhead">
<span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
<!-- <span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span> -->
</div>
<div id="tabBodys" class="tabbody">
<div id="normal" class="panel focus">
<fieldset class="bgarea">
<legend><var id="lang_background_set"></var></legend>
<div class="content">
<div>
<label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
<label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
</div>
<div class="wrapcolor pl">
<div class="color">
<var id="lang_background_color"></var>:
</div>
<div id="colorPicker"></div>
<div class="clear"></div>
</div>
<div class="wrapcolor pl">
<label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
</div>
<div id="alignment" class="alignment">
<var id="lang_background_align"></var>:<select id="repeatType">
<option value="center"></option>
<option value="repeat-x"></option>
<option value="repeat-y"></option>
<option value="repeat"></option>
<option value="self"></option>
</select>
</div>
<div id="custom" >
<var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
</div>
</div>
</fieldset>
</div>
<div id="imgManager" class="panel">
<div id="imageList" style=""></div>
</div>
</div>
</div>
<script type="text/javascript" src="background.js"></script>
</body>
</html>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
<<<<<<< HEAD
(function () {
var onlineImage,
... ... @@ -373,4 +374,381 @@
editor.execCommand('background', backupStyle);
};
=======
(function () {
var onlineImage,
backupStyle = editor.queryCommandValue('background');
window.onload = function () {
initTabs();
initColorSelector();
};
/* 初始化tab标签 */
function initTabs(){
var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
for (var j = 0; j < tabs.length; j++) {
if(tabs[j] == target){
tabs[j].className = "focus";
var contentId = tabs[j].getAttribute('data-content-id');
$G(contentId).style.display = "block";
if(contentId == 'imgManager') {
initImagePanel();
}
}else {
tabs[j].className = "";
$G(tabs[j].getAttribute('data-content-id')).style.display = "none";
}
}
});
}
}
/* 初始化颜色设置 */
function initColorSelector () {
var obj = editor.queryCommandValue('background');
if (obj) {
var color = obj['background-color'],
repeat = obj['background-repeat'] || 'repeat',
image = obj['background-image'] || '',
position = obj['background-position'] || 'center center',
pos = position.split(' '),
x = parseInt(pos[0]) || 0,
y = parseInt(pos[1]) || 0;
if(repeat == 'no-repeat' && (x || y)) repeat = 'self';
image = image.match(/url[\s]*\(([^\)]*)\)/);
image = image ? image[1]:'';
updateFormState('colored', color, image, repeat, x, y);
} else {
updateFormState();
}
var updateHandler = function () {
updateFormState();
updateBackground();
}
domUtils.on($G('nocolorRadio'), 'click', updateBackground);
domUtils.on($G('coloredRadio'), 'click', updateHandler);
domUtils.on($G('url'), 'keyup', function(){
if($G('url').value && $G('alignment').style.display == "none") {
utils.each($G('repeatType').children, function(item){
item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);
});
}
updateHandler();
});
domUtils.on($G('repeatType'), 'change', updateHandler);
domUtils.on($G('x'), 'keyup', updateBackground);
domUtils.on($G('y'), 'keyup', updateBackground);
initColorPicker();
}
/* 初始化颜色选择器 */
function initColorPicker() {
var me = editor,
cp = $G("colorPicker");
/* 生成颜色选择器ui对象 */
var popup = new UE.ui.Popup({
content: new UE.ui.ColorPicker({
noColorText: me.getLang("clearColor"),
editor: me,
onpickcolor: function (t, color) {
updateFormState('colored', color);
updateBackground();
UE.ui.Popup.postHide();
},
onpicknocolor: function (t, color) {
updateFormState('colored', 'transparent');
updateBackground();
UE.ui.Popup.postHide();
}
}),
editor: me,
onhide: function () {
}
});
/* 设置颜色选择器 */
domUtils.on(cp, "click", function () {
popup.showAnchor(this);
});
domUtils.on(document, 'mousedown', function (evt) {
var el = evt.target || evt.srcElement;
UE.ui.Popup.postHide(el);
});
domUtils.on(window, 'scroll', function () {
UE.ui.Popup.postHide();
});
}
/* 初始化在线图片列表 */
function initImagePanel() {
onlineImage = onlineImage || new OnlineImage('imageList');
}
/* 更新背景色设置面板 */
function updateFormState (radio, color, url, align, x, y) {
var nocolorRadio = $G('nocolorRadio'),
coloredRadio = $G('coloredRadio');
if(radio) {
nocolorRadio.checked = (radio == 'colored' ? false:'checked');
coloredRadio.checked = (radio == 'colored' ? 'checked':false);
}
if(color) {
domUtils.setStyle($G("colorPicker"), "background-color", color);
}
if(url && /^\//.test(url)) {
var a = document.createElement('a');
a.href = url;
browser.ie && (a.href = a.href);
url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
}
if(url || url === '') {
$G('url').value = url;
}
if(align) {
utils.each($G('repeatType').children, function(item){
item.selected = (align == item.getAttribute('value') ? 'selected':false);
});
}
if(x || y) {
$G('x').value = parseInt(x) || 0;
$G('y').value = parseInt(y) || 0;
}
$G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';
$G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';
}
/* 更新背景颜色 */
function updateBackground () {
if ($G('coloredRadio').checked) {
var color = domUtils.getStyle($G("colorPicker"), "background-color"),
bgimg = $G("url").value,
align = $G("repeatType").value,
backgroundObj = {
"background-repeat": "no-repeat",
"background-position": "center center"
};
if (color) backgroundObj["background-color"] = color;
if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
if (align == 'self') {
backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
} else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
backgroundObj["background-repeat"] = align;
}
editor.execCommand('background', backgroundObj);
} else {
editor.execCommand('background', null);
}
}
/* 在线图片 */
function OnlineImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineImage.prototype = {
init: function () {
this.reset();
this.initEvents();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.id = 'imageListUl';
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('imageList'), 'scroll', function(e){
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getImageData();
}
});
/* 选中图片 */
domUtils.on(this.container, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode,
nodes = $G('imageListUl').childNodes;
if (li.tagName.toLowerCase() == 'li') {
updateFormState('nocolor', null, '');
for (var i = 0, node; node = nodes[i++];) {
if (node == li && !domUtils.hasClass(node, 'selected')) {
domUtils.addClass(node, 'selected');
updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
} else {
domUtils.removeClasses(node, 'selected');
}
}
updateBackground();
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('imageManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getImageData();
},
/* 重置界面 */
reset: function() {
this.initContainer();
this.initData();
},
/* 向后台拉取图片列表数据 */
getImageData: function () {
var _this = this;
if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
isJsonp = utils.isCrossDomainUrl(url);
ajax.request(url, {
'timeout': 100000,
'dataType': isJsonp ? 'jsonp':'',
'data': utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
'method': 'get',
'onsuccess': function (r) {
try {
var json = isJsonp ? r:eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
'onerror': function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, icon, _this = this,
urlPrefix = editor.getOpt('imageManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) {
item = document.createElement('li');
img = document.createElement('img');
icon = document.createElement('span');
domUtils.on(img, 'load', (function(image){
return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
}
})(img));
img.width = 113;
img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
img.setAttribute('_src', urlPrefix + list[i].url);
domUtils.addClass(icon, 'icon');
item.appendChild(img);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [], align = getAlign();
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var img = lis[i].firstChild,
src = img.getAttribute('_src');
list.push({
src: src,
_src: src,
floatStyle: align
});
}
}
return list;
}
};
dialog.onok = function () {
updateBackground();
editor.fireEvent('saveScene');
};
dialog.oncancel = function () {
editor.execCommand('background', backupStyle);
};
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
})();
\ No newline at end of file
... ...
<<<<<<< HEAD
/*
* 图表配置文件
* */
... ... @@ -63,3 +64,70 @@ var typeConfig = [
}
}
];
=======
/*
* 图表配置文件
* */
//不同类型的配置
var typeConfig = [
{
chart: {
type: 'line'
},
plotOptions: {
line: {
dataLabels: {
enabled: false
},
enableMouseTracking: true
}
}
}, {
chart: {
type: 'line'
},
plotOptions: {
line: {
dataLabels: {
enabled: true
},
enableMouseTracking: false
}
}
}, {
chart: {
type: 'area'
}
}, {
chart: {
type: 'bar'
}
}, {
chart: {
type: 'column'
}
}, {
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
color: '#000000',
connectorColor: '#000000',
formatter: function() {
return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
}
}
}
}
}
];
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
<<<<<<< HEAD
html, body {
width: 100%;
height: 100%;
... ... @@ -162,4 +163,170 @@ html, body {
height: 100px;
line-height: 100px;
text-align: center;
=======
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow-x: hidden;
}
.main {
width: 100%;
overflow: hidden;
}
.table-view {
height: 100%;
float: left;
margin: 20px;
width: 40%;
}
.table-view .table-container {
width: 100%;
margin-bottom: 50px;
overflow: scroll;
}
.table-view th {
padding: 5px 10px;
background-color: #F7F7F7;
}
.table-view td {
width: 50px;
text-align: center;
padding:0;
}
.table-container input {
width: 40px;
padding: 5px;
border: none;
outline: none;
}
.table-view caption {
font-size: 18px;
text-align: left;
}
.charts-view {
/*margin-left: 49%!important;*/
width: 50%;
margin-left: 49%;
height: 400px;
}
.charts-container {
border-left: 1px solid #c3c3c3;
}
.charts-format fieldset {
padding-left: 20px;
margin-bottom: 50px;
}
.charts-format legend {
padding-left: 10px;
padding-right: 10px;
}
.format-item-container {
padding: 20px;
}
.format-item-container label {
display: block;
margin: 10px 0;
}
.charts-format .data-item {
border: 1px solid black;
outline: none;
padding: 2px 3px;
}
/* 图表类型 */
.charts-type {
margin-top: 50px;
height: 300px;
}
.scroll-view {
border: 1px solid #c3c3c3;
border-left: none;
border-right: none;
overflow: hidden;
}
.scroll-container {
margin: 20px;
width: 100%;
overflow: hidden;
}
.scroll-bed {
width: 10000px;
_margin-top: 20px;
-webkit-transition: margin-left .5s ease;
-moz-transition: margin-left .5s ease;
transition: margin-left .5s ease;
}
.view-box {
display: inline-block;
*display: inline;
*zoom: 1;
margin-right: 20px;
border: 2px solid white;
line-height: 0;
overflow: hidden;
cursor: pointer;
}
.view-box img {
border: 1px solid #cecece;
}
.view-box.selected {
border-color: #7274A7;
}
.button-container {
margin-bottom: 20px;
text-align: center;
}
.button-container a {
display: inline-block;
width: 100px;
height: 25px;
line-height: 25px;
border: 1px solid #c2ccd1;
margin-right: 30px;
text-decoration: none;
color: black;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
.button-container a:HOVER {
background: #fcfcfc;
}
.button-container a:ACTIVE {
border-top-color: #c2ccd1;
box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);
}
.edui-charts-not-data {
height: 100px;
line-height: 100px;
text-align: center;
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
\ No newline at end of file
... ...
<<<<<<< HEAD
<!DOCTYPE html>
<html>
<head>
... ... @@ -86,4 +87,94 @@
<script src="chart.config.js"></script>
<script src="charts.js"></script>
</body>
=======
<!DOCTYPE html>
<html>
<head>
<title>chart</title>
<meta chartset="utf-8">
<link rel="stylesheet" type="text/css" href="charts.css">
<script type="text/javascript" src="../internal.js"></script>
</head>
<body>
<div class="main">
<div class="table-view">
<h3><var id="lang_data_source"></var></h3>
<div id="tableContainer" class="table-container"></div>
<h3><var id="lang_chart_format"></var></h3>
<form name="data-form">
<div class="charts-format">
<fieldset>
<legend><var id="lang_data_align"></var></legend>
<div class="format-item-container">
<label>
<input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
<var id="lang_chart_align_same"></var>
</label>
<label>
<input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
<var id="lang_chart_align_reverse"></var>
</label>
<br>
</div>
</fieldset>
<fieldset>
<legend><var id="lang_chart_title"></var></legend>
<div class="format-item-container">
<label>
<var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
</label>
<label>
<var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
</label>
<label>
<var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
</label>
<label>
<var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
</label>
</div>
</fieldset>
<fieldset>
<legend><var id="lang_chart_tip"></var></legend>
<div class="format-item-container">
<label>
<var id="lang_cahrt_tip_prefix"></var>
<input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
</label>
<p><var id="lang_cahrt_tip_description"></var></p>
</div>
</fieldset>
<fieldset>
<legend><var id="lang_chart_data_unit"></var></legend>
<div class="format-item-container">
<label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
<p><var id="lang_chart_data_unit_description"></var></p>
</div>
</fieldset>
</div>
</form>
</div>
<div class="charts-view">
<div id="chartsContainer" class="charts-container"></div>
<div id="chartsType" class="charts-type">
<h3><var id="lang_chart_type"></var></h3>
<div class="scroll-view">
<div class="scroll-container">
<div id="scrollBed" class="scroll-bed"></div>
</div>
<div id="buttonContainer" class="button-container">
<a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
<a href="#" data-title="next"><var id="lang_next_btn"></var></a>
</div>
</div>
</div>
</div>
</div>
<script src="../../third-party/jquery-1.10.2.min.js"></script>
<script src="../../third-party/highcharts/highcharts.js"></script>
<script src="chart.config.js"></script>
<script src="charts.js"></script>
</body>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</html>
\ No newline at end of file
... ...
<<<<<<< HEAD
/*
* 图片转换对话框脚本
**/
... ... @@ -516,4 +517,524 @@ function syncTableData () {
}
=======
/*
* 图片转换对话框脚本
**/
var tableData = [],
//编辑器页面table
editorTable = null,
chartsConfig = window.typeConfig,
resizeTimer = null,
//初始默认图表类型
currentChartType = 0;
window.onload = function () {
editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
//未找到表格, 显示错误页面
if ( !editorTable ) {
document.body.innerHTML = "<div class='edui-charts-not-data'>未找到数据</div>";
return;
}
//初始化图表类型选择
initChartsTypeView();
renderTable( editorTable );
initEvent();
initUserConfig( editorTable.getAttribute( "data-chart" ) );
$( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
updateViewType( currentChartType );
dialog.addListener( "resize", function () {
if ( resizeTimer != null ) {
window.clearTimeout( resizeTimer );
}
resizeTimer = window.setTimeout( function () {
resizeTimer = null;
renderCharts();
}, 500 );
} );
};
function initChartsTypeView () {
var contents = [];
for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {
contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
}
$( "#scrollBed" ).html( contents.join( "" ) );
}
//渲染table, 以便用户修改数据
function renderTable ( table ) {
var tableHtml = [];
//构造数据
for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
tableData[ i ] = [];
tableHtml[ i ] = [];
for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
var value = getCellValue( cell );
if ( i > 0 && j > 0 ) {
value = +value;
}
if ( i === 0 || j === 0 ) {
tableHtml[ i ].push( '<th>'+ value +'</th>' );
} else {
tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
}
tableData[ i ][ j ] = value;
}
tableHtml[ i ] = tableHtml[ i ].join( "" );
}
//draw 表格
$( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
}
/*
* 根据表格已有的图表属性初始化当前图表属性
*/
function initUserConfig ( config ) {
var parsedConfig = {};
if ( !config ) {
return;
}
config = config.split( ";" );
$.each( config, function ( index, item ) {
item = item.split( ":" );
parsedConfig[ item[ 0 ] ] = item[ 1 ];
} );
setUserConfig( parsedConfig );
}
function initEvent () {
var cacheValue = null,
//图表类型数
typeViewCount = chartsConfig.length- 1,
$chartsTypeViewBox = $( '#scrollBed .view-box' );
$( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
renderCharts();
} )
$( ".table-view" ).delegate( ".data-item", "focus", function () {
cacheValue = this.value;
} ).delegate( ".data-item", "blur", function () {
if ( this.value !== cacheValue ) {
renderCharts();
}
cacheValue = null;
} );
$( "#buttonContainer" ).delegate( "a", "click", function (e) {
e.preventDefault();
if ( this.getAttribute( "data-title" ) === 'prev' ) {
if ( currentChartType > 0 ) {
currentChartType--;
updateViewType( currentChartType );
}
} else {
if ( currentChartType < typeViewCount ) {
currentChartType++;
updateViewType( currentChartType );
}
}
} );
//图表类型变化
$( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
var index = $( this ).attr( "data-chart-type" );
$chartsTypeViewBox.removeClass( "selected" );
$( $chartsTypeViewBox[ index ] ).addClass( "selected" );
currentChartType = index | 0;
//饼图, 禁用部分配置
if ( currentChartType === chartsConfig.length - 1 ) {
disableNotPieConfig();
//启用完整配置
} else {
enableNotPieConfig();
}
renderCharts();
} );
}
function renderCharts () {
var data = collectData();
$('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
credits: {
enabled: false
},
exporting: {
enabled: false
},
title: {
text: data.title,
x: -20 //center
},
subtitle: {
text: data.subTitle,
x: -20
},
xAxis: {
title: {
text: data.xTitle
},
categories: data.categories
},
yAxis: {
title: {
text: data.yTitle
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
enabled: true,
valueSuffix: data.suffix
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 1
},
series: data.series
} ));
}
function updateViewType ( index ) {
$( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
}
function collectData () {
var form = document.forms[ 'data-form' ],
data = null;
if ( currentChartType !== chartsConfig.length - 1 ) {
data = getSeriesAndCategories();
$.extend( data, getUserConfig() );
//饼图数据格式
} else {
data = getSeriesForPieChart();
data.title = form[ 'title' ].value;
data.suffix = form[ 'unit' ].value;
}
return data;
}
/**
* 获取用户配置信息
*/
function getUserConfig () {
var form = document.forms[ 'data-form' ],
info = {
title: form[ 'title' ].value,
subTitle: form[ 'sub-title' ].value,
xTitle: form[ 'x-title' ].value,
yTitle: form[ 'y-title' ].value,
suffix: form[ 'unit' ].value,
//数据对齐方式
tableDataFormat: getTableDataFormat (),
//饼图提示文字
tip: $( "#tipInput" ).val()
};
return info;
}
function setUserConfig ( config ) {
var form = document.forms[ 'data-form' ];
config.title && ( form[ 'title' ].value = config.title );
config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
config.suffix && ( form[ 'unit' ].value = config.suffix );
config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
config.tip && ( form[ 'tip' ].value = config.tip );
currentChartType = config.chartType || 0;
}
function getSeriesAndCategories () {
var form = document.forms[ 'data-form' ],
series = [],
categories = [],
tmp = [],
tableData = getTableData();
//反转数据
if ( getTableDataFormat() === "-1" ) {
for ( var i = 0, len = tableData.length; i < len; i++ ) {
for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
if ( !tmp[ j ] ) {
tmp[ j ] = [];
}
tmp[ j ][ i ] = tableData[ i ][ j ];
}
}
tableData = tmp;
}
categories = tableData[0].slice( 1 );
for ( var i = 1, data; data = tableData[ i ]; i++ ) {
series.push( {
name: data[ 0 ],
data: data.slice( 1 )
} );
}
return {
series: series,
categories: categories
};
}
/*
* 获取数据源数据对齐方式
*/
function getTableDataFormat () {
var form = document.forms[ 'data-form' ],
items = form['charts-format'];
return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
}
/*
* 禁用非饼图类型的配置项
*/
function disableNotPieConfig() {
updateConfigItem( 'disable' );
}
/*
* 启用非饼图类型的配置项
*/
function enableNotPieConfig() {
updateConfigItem( 'enable' );
}
function updateConfigItem ( value ) {
var table = $( "#showTable" )[ 0 ],
isDisable = value === 'disable' ? true : false;
//table中的input处理
for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
$( "input", cell ).attr( "disabled", isDisable );
}
}
//其他项处理
$( "input.not-pie-item" ).attr( "disabled", isDisable );
$( "#tipInput" ).attr( "disabled", !isDisable )
}
/*
* 获取饼图数据
* 饼图的数据只取第一行的
**/
function getSeriesForPieChart () {
var series = {
type: 'pie',
name: $("#tipInput").val(),
data: []
},
tableData = getTableData();
for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
var title = tableData[ 0 ][ j ],
val = tableData[ 1 ][ j ];
series.data.push( [ title, val ] );
}
return {
series: [ series ]
};
}
function getTableData () {
var table = document.getElementById( "showTable" ),
xCount = table.rows[0].cells.length - 1,
values = getTableInputValue();
for ( var i = 0, value; value = values[ i ]; i++ ) {
tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
}
return tableData;
}
function getTableInputValue () {
var table = document.getElementById( "showTable" ),
inputs = table.getElementsByTagName( "input" ),
values = [];
for ( var i = 0, input; input = inputs[ i ]; i++ ) {
values.push( input.value | 0 );
}
return values;
}
function getCellValue ( cell ) {
var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
}
//dialog确认事件
dialog.onok = function () {
//收集信息
var form = document.forms[ 'data-form' ],
info = getUserConfig();
//添加图表类型
info.chartType = currentChartType;
//同步表格数据到编辑器
syncTableData();
//执行图表命令
editor.execCommand( 'charts', info );
};
/*
* 同步图表编辑视图的表格数据到编辑器里的原始表格
*/
function syncTableData () {
var tableData = getTableData();
for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
cell.innerHTML = tableData[ i ] [ j ];
}
}
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
}
\ No newline at end of file
... ...
<<<<<<< HEAD
.jd img{
background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
... ... @@ -40,4 +41,48 @@ img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;ba
.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
.tabbody table{width: 100%;}
.tabbody td{border:1px solid #BAC498;}
=======
.jd img{
background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.pp img{
background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:25px;height:25px;display:block;
}
.ldw img{
background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.tsj img{
background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.cat img{
background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.bb img{
background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.youa img{
background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.smileytable td {height: 37px;}
#tabPanel{margin-left:5px;overflow: hidden;}
#tabContent {float:left;background:#FFFFFF;}
#tabContent div{display: none;width:480px;overflow:hidden;}
#tabIconReview.show{left:17px;display:block;}
.menuFocus{background:#ACCD3C;}
.menuDefault{background:#FFFFFF;}
#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
.tabbody table{width: 100%;}
.tabbody td{border:1px solid #BAC498;}
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
.tabbody td span{display: block;zoom:1;padding:0 4px;}
\ No newline at end of file
... ...
<<<<<<< HEAD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
... ... @@ -51,4 +52,59 @@
};
</script>
</body>
=======
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" content="noindex, nofollow"/>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="emotion.css">
</head>
<body>
<div id="tabPanel" class="wrapper">
<div id="tabHeads" class="tabhead">
<span><var id="lang_input_choice"></var></span>
<span><var id="lang_input_Tuzki"></var></span>
<span><var id="lang_input_lvdouwa"></var></span>
<span><var id="lang_input_BOBO"></var></span>
<span><var id="lang_input_babyCat"></var></span>
<span><var id="lang_input_bubble"></var></span>
<span><var id="lang_input_youa"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="tab0"></div>
<div id="tab1"></div>
<div id="tab2"></div>
<div id="tab3"></div>
<div id="tab4"></div>
<div id="tab5"></div>
<div id="tab6"></div>
</div>
</div>
<div id="tabIconReview">
<img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/>
</div>
<script type="text/javascript" src="emotion.js"></script>
<script type="text/javascript">
var emotion = {
tabNum:7, //切换面板数量
SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
SmileyInfor:{
tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
}
};
</script>
</body>
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
</html>
\ No newline at end of file
... ...
<<<<<<< HEAD
window.onload = function () {
editor.setOpt({
emotionLocalization:false
... ... @@ -187,3 +188,194 @@ function createArr( tabNum ) {
return arr;
}
=======
window.onload = function () {
editor.setOpt({
emotionLocalization:false
});
emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "https://img.baidu.com/hi/";
emotion.SmileyBox = createTabList( emotion.tabNum );
emotion.tabExist = createArr( emotion.tabNum );
initImgName();
initEvtHandler( "tabHeads" );
};
function initImgName() {
for ( var pro in emotion.SmilmgName ) {
var tempName = emotion.SmilmgName[pro],
tempBox = emotion.SmileyBox[pro],
tempStr = "";
if ( tempBox.length ) return;
for ( var i = 1; i <= tempName[1]; i++ ) {
tempStr = tempName[0];
if ( i < 10 ) tempStr = tempStr + '0';
tempStr = tempStr + i + '.gif';
tempBox.push( tempStr );
}
}
}
function initEvtHandler( conId ) {
var tabHeads = $G( conId );
for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {
var tabObj = tabHeads.childNodes[i];
if ( tabObj.nodeType == 1 ) {
domUtils.on( tabObj, "click", (function ( index ) {
return function () {
switchTab( index );
};
})( j ) );
j++;
}
}
switchTab( 0 );
$G( "tabIconReview" ).style.display = 'none';
}
function InsertSmiley( url, evt ) {
var obj = {
src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
};
obj._src = obj.src;
editor.execCommand( 'insertimage', obj );
if ( !evt.ctrlKey ) {
dialog.popup.hide();
}
}
function switchTab( index ) {
autoHeight( index );
if ( emotion.tabExist[index] == 0 ) {
emotion.tabExist[index] = 1;
createTab( 'tab' + index );
}
//获取呈现元素句柄数组
var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ),
tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ),
i = 0, L = tabHeads.length;
//隐藏所有呈现元素
for ( ; i < L; i++ ) {
tabHeads[i].className = "";
tabBodys[i].style.display = "none";
}
//显示对应呈现元素
tabHeads[index].className = "focus";
tabBodys[index].style.display = "block";
}
function autoHeight( index ) {
var iframe = dialog.getDom( "iframe" ),
parent = iframe.parentNode.parentNode;
switch ( index ) {
case 0:
iframe.style.height = "380px";
parent.style.height = "392px";
break;
case 1:
iframe.style.height = "220px";
parent.style.height = "232px";
break;
case 2:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 3:
iframe.style.height = "300px";
parent.style.height = "312px";
break;
case 4:
iframe.style.height = "140px";
parent.style.height = "152px";
break;
case 5:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 6:
iframe.style.height = "230px";
parent.style.height = "242px";
break;
default:
}
}
function createTab( tabName ) {
var faceVersion = "?v=1.1", //版本号
tab = $G( tabName ), //获取将要生成的Div句柄
imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
positionLine = 11 / 2, //中间数
iWidth = iHeight = 35, //图片长宽
iColWidth = 3, //表格剩余空间的显示比例
tableCss = emotion.imageCss[tabName],
cssOffset = emotion.imageCssOffset[tabName],
textHTML = ['<table class="smileytable">'],
i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
sUrl, realUrl, posflag, offset, infor;
for ( ; i < imgNum; ) {
textHTML.push( '<tr>' );
for ( var j = 0; j < imgColNum; j++, i++ ) {
faceImage = emotion.SmileyBox[tabName][i];
if ( faceImage ) {
sUrl = imagePath + faceImage + faceVersion;
realUrl = imagePath + faceImage;
posflag = j < positionLine ? 0 : 1;
offset = cssOffset * i * (-1) - 1;
infor = emotion.SmileyInfor[tabName][i];
textHTML.push( '<td class="' + tableCss + '" border="1" width="' +
iColWidth + '%" style="border-collapse:collapse;" align="center" bgcolor="transparent" onclick="InsertSmiley(\'' +
realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' +
posflag + '\')" onmouseout="out(this)">' );
textHTML.push( '<span>' );
textHTML.push( '<img style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
textHTML.push( '</span>' );
} else {
textHTML.push( '<td width="' + iColWidth + '%" bgcolor="#FFFFFF">' );
}
textHTML.push( '</td>' );
}
textHTML.push( '</tr>' );
}
textHTML.push( '</table>' );
textHTML = textHTML.join( "" );
tab.innerHTML = textHTML;
}
function over( td, srcPath, posFlag ) {
td.style.backgroundColor = "#ACCD3C";
$G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")";
if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show";
$G( "tabIconReview" ).style.display = 'block';
}
function out( td ) {
td.style.backgroundColor = "transparent";
var tabIconRevew = $G( "tabIconReview" );
tabIconRevew.className = "";
tabIconRevew.style.display = 'none';
}
function createTabList( tabNum ) {
var obj = {};
for ( var i = 0; i < tabNum; i++ ) {
obj["tab" + i] = [];
}
return obj;
}
function createArr( tabNum ) {
var arr = [];
for ( var i = 0; i < tabNum; i++ ) {
arr[i] = 0;
}
return arr;
}
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...
<<<<<<< HEAD
@font-face {font-family: "edui-notadd";
src: url('../fonts/iconfont.eot?t=1544182120898'); /* IE9*/
... ... @@ -270,3 +271,277 @@
.edui-for-preitem4 .edui-icon:before { content: "\e67b"; }
=======
@font-face {font-family: "edui-notadd";
src: url('../fonts/iconfont.eot?t=1544182120898'); /* IE9*/
src: url('../fonts/iconfont.eot?t=1544182120898#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
url('../fonts/iconfont.ttf?t=1544182120898') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('../fonts/iconfont.svg?t=1544182120898#edui-notadd') format('svg'); /* iOS 4.1- */
}
.edui-notadd .edui-icon{
font-family:"edui-notadd" !important;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.edui-iconfont {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.edui-for-close .edui-icon:before { content: "\e654"; }
.edui-for-searchreplace .edui-icon:before { content: "\e70f"; }
.edui-for-italic .edui-icon:before { content: "\e62d"; }
.edui-for-insertcaption .edui-icon:before { content: "\e657"; }
.edui-for-insertparagraph .edui-icon:before { content: "\e62e"; }
.edui-for-inserttitlecol .edui-icon:before { content: "\e659"; }
.edui-for-insertimage .edui-icon:before { content: "\e617"; }
.edui-for-previousstep .edui-icon:before { content: "\e630"; }
.edui-for-nextstep .edui-icon:before { content: "\e631"; }
.edui-for-scaleboard .edui-icon:before { content: "\e632"; }
.edui-for-brush .edui-icon:before { content: "\e633"; }
.edui-for-background .edui-icon:before { content: "\e65d"; }
.edui-for-strikethrough .edui-icon:before { content: "\e60c"; }
.edui-for-spechars .edui-icon:before { content: "\e603"; }
.edui-for-clearboard .edui-icon:before { content: "\e634"; }
.edui-for-bold .edui-icon:before { content: "\e604"; }
.edui-for-fullscreen .edui-icon:before { content: "\e656"; }
.edui-for-formatmatch .edui-icon:before { content: "\e60d"; }
.edui-for-underline .edui-icon:before { content: "\e605"; }
.edui-for-removeformat .edui-icon:before { content: "\e60e"; }
.edui-for-blockquote .edui-icon:before { content: "\e60f"; }
.edui-for-anchor .edui-icon:before { content: "\e618"; }
.edui-for-help .edui-icon:before { content: "\e619"; }
.edui-for-horizontal .edui-icon:before { content: "\e638"; }
.edui-for-simpleupload .edui-icon:before { content: "\e61a"; }
.edui-for-indent .edui-icon:before { content: "\e61b"; }
.edui-for-justifycenter .edui-icon:before { content: "\e61c"; }
.edui-for-justifyleft .edui-icon:before { content: "\e61d"; }
.edui-for-justifyjustify .edui-icon:before { content: "\e61e"; }
.edui-for-justifyright .edui-icon:before { content: "\e61f"; }
.edui-for-link .edui-icon:before { content: "\e620"; }
.edui-for-cleardoc .edui-icon:before { content: "\e621"; }
.edui-for-drafts .edui-icon:before { content: "\e610"; }
.edui-for-subscript .edui-icon:before { content: "\e611"; }
.edui-for-unlink .edui-icon:before { content: "\e622"; }
.edui-for-superscript .edui-icon:before { content: "\e612"; }
.edui-for-forecolor .edui-icon:before { content: "\e63a"; }
.edui-for-backcolor .edui-icon:before { content: "\e655"; }
.edui-for-touppercase .edui-icon:before { content: "\e623"; }
.edui-for-tolowercase .edui-icon:before { content: "\e624"; }
.edui-for-insertvideo .edui-icon:before { content: "\e627"; }
.edui-for-emotion .edui-icon:before { content: "\e606"; }
.edui-for-pasteplain .edui-icon:before { content: "\e613"; }
.edui-for-preview .edui-icon:before { content: "\e63b"; }
.edui-for-print .edui-icon:before { content: "\e63c"; }
.edui-for-selectall .edui-icon:before { content: "\e614"; }
.edui-for-mergecells .edui-icon:before { content: "\e63d"; }
.edui-for-deletecol .edui-icon:before { content: "\e63e"; }
.edui-for-deleterow .edui-icon:before { content: "\e63f"; }
.edui-for-attachment .edui-icon:before { content: "\e628"; }
.edui-for-music .edui-icon:before { content: "\e640"; }
.edui-for-gmap .edui-icon:before { content: "\e629"; }
.edui-for-insertframe .edui-icon:before { content: "\e645"; }
.edui-for-pdfformat .edui-icon:before { content: "\e62f"; }
.edui-for-word .edui-icon:before { content: "\e646"; }
.edui-for-excel .edui-icon:before { content: "\e647"; }
.edui-for-time .edui-icon:before { content: "\e64a"; }
.edui-for-snapscreen .edui-icon:before { content: "\e650"; }
.edui-for-wordimage .edui-icon:before { content: "\e652"; }
.edui-for-edittd .edui-icon:before { content: "\e65a"; }
.edui-for-lineheight .edui-icon:before { content: "\e62a"; }
.edui-for-rowspacingbottom .edui-icon:before { content: "\e62b"; }
.edui-for-rowspacingtop .edui-icon:before { content: "\e62c"; }
.edui-for-scrawl .edui-icon:before { content: "\e616"; }
.edui-for-redo .edui-icon:before { content: "\e609"; }
.edui-for-undo .edui-icon:before { content: "\e600"; }
.edui-for-inserttitle .edui-icon:before { content: "\e65b"; }
.edui-for-insertparagraphtrue .edui-icon:before { content: "\e660"; }
.edui-for-aligntable .edui-icon:before { content: "\e662"; }
.edui-for-table .edui-icon:before { content: "\e664"; }
.edui-for-tablealignment-left .edui-icon:before { content: "\e663"; }
.edui-for-tablealignment-center .edui-icon:before { content: "\e665"; }
.edui-for-tablealignment-right .edui-icon:before { content: "\e666"; }
.edui-for-paste .edui-icon:before { content: "\e667"; }
.edui-for-map .edui-icon:before { content: "\e668"; }
.edui-for-directionalityrtl .edui-icon:before { content: "\e601"; }
.edui-for-imagecenter .edui-icon:before { content: "\e602"; }
.edui-for-imagenone .edui-icon:before { content: "\e607"; }
.edui-for-fontborder .edui-icon:before { content: "\e608"; }
.edui-for-edittable .edui-icon:before { content: "\e60a"; }
.edui-for-imageleft .edui-icon:before { content: "\e60b"; }
.edui-for-imageright .edui-icon:before { content: "\e615"; }
.edui-for-insertcol .edui-icon:before { content: "\e625"; }
.edui-for-insertcolnext .edui-icon:before { content: "\e626"; }
.edui-for-insertorderedlist .edui-icon:before { content: "\e635"; }
.edui-for-insertparagraphbeforetable .edui-icon:before { content: "\e636"; }
.edui-for-insertrow .edui-icon:before { content: "\e637"; }
.edui-for-insertrownext .edui-icon:before { content: "\e639"; }
.edui-for-insertunorderedlist .edui-icon:before { content: "\e641"; }
.edui-for-mergeright .edui-icon:before { content: "\e642"; }
.edui-for-mergedown .edui-icon:before { content: "\e643"; }
.edui-for-inserttable .edui-icon:before { content: "\e644"; }
.edui-for-pagebreak .edui-icon:before { content: "\e648"; }
.edui-for-source .edui-icon:before { content: "\e649"; }
.edui-for-splittorows .edui-icon:before { content: "\e64b"; }
.edui-for-splittocols .edui-icon:before { content: "\e64c"; }
.edui-for-splittocells .edui-icon:before { content: "\e64d"; }
.edui-for-arrow .edui-icon:before { content: "\e64f"; }
.edui-for-aligntd .edui-icon:before { content: "\e651"; }
.edui-for-autotypeset .edui-icon:before { content: "\e653"; }
.edui-for-charts .edui-icon:before { content: "\e658"; }
.edui-for-closeerror .edui-icon:before { content: "\e65c"; }
.edui-for-copy .edui-icon:before { content: "\e65f"; }
.edui-for-date .edui-icon:before { content: "\e661"; }
.edui-for-deletetable .edui-icon:before { content: "\e669"; }
.edui-for-directionalityltr .edui-icon:before { content: "\e66a"; }
.edui-for-arrowright .edui-icon:before { content: "\e66b"; }
.edui-for-tableleft .edui-icon:before { content: "\e66c"; }
.edui-for-tableright .edui-icon:before { content: "\e66d"; }
.edui-for-tablecenter .edui-icon:before { content: "\e66e"; }
.edui-for-videoleft .edui-icon:before { content: "\e66f"; }
.edui-for-videocenter .edui-icon:before { content: "\e670"; }
.edui-for-videonone .edui-icon:before { content: "\e671"; }
.edui-for-videoright .edui-icon:before { content: "\e672"; }
.edui-for-template .edui-icon:before { content: "\e64e"; }
.edui-for-addfile .edui-icon:before { content: "\e673"; }
.edui-for-selected .edui-icon:before { content: "\e674"; }
.edui-for-pickarea .edui-icon:before { content: "\e675"; }
.edui-for-overlay .edui-icon:before { content: "\e676"; }
.edui-for-preitem .edui-icon:before { content: "\e677"; }
.edui-for-preitem1 .edui-icon:before { content: "\e678"; }
.edui-for-preitem2 .edui-icon:before { content: "\e679"; }
.edui-for-preitem3 .edui-icon:before { content: "\e67a"; }
.edui-for-preitem4 .edui-icon:before { content: "\e67b"; }
>>>>>>> a581f565d7001443e0e948aa4657b9a91c3e12fb
... ...