@@ -0,0 +1,57 @@
|
||||
// 工单统计
|
||||
function ticketStatistic(params) {
|
||||
return Axios.get(`/ticket/statistic`, { params });
|
||||
}
|
||||
// 工单列表
|
||||
function ticketList(params) {
|
||||
return Axios.get(`/ticket`, { params });
|
||||
}
|
||||
|
||||
// 工单类型
|
||||
function ticketType(params) {
|
||||
return Axios.get(`/ticket/type`, { params });
|
||||
}
|
||||
// 获取产品列表
|
||||
function hostAll(params) {
|
||||
return Axios.get(`/host`, { params });
|
||||
}
|
||||
|
||||
// 创建工单
|
||||
function createTicket(params) {
|
||||
return Axios.post(`/ticket`, params);
|
||||
}
|
||||
|
||||
// 关闭工单
|
||||
function closeTicket(params) {
|
||||
return Axios.put(`/ticket/${params.id}/close`, params);
|
||||
}
|
||||
// 催单
|
||||
function urgeTicket(params) {
|
||||
return Axios.put(`/ticket/${params.id}/urge`, params);
|
||||
}
|
||||
// 查看工单
|
||||
function ticketDetail(params) {
|
||||
return Axios.get(`/ticket/${params.id}`, { params });
|
||||
}
|
||||
|
||||
// 回复工单
|
||||
function replyTicket(params) {
|
||||
return Axios.post(`/ticket/${params.id}/reply`, params);
|
||||
}
|
||||
// 文件下载
|
||||
function downloadFile(params) {
|
||||
return Axios.post(`ticket/download`, params);
|
||||
}
|
||||
|
||||
// 工单状态
|
||||
function ticketStatus(params) {
|
||||
return Axios.get(`/ticket/status`, { params });
|
||||
}
|
||||
// 工单部门
|
||||
function department(params) {
|
||||
return Axios.get(`/ticket/department`, { params });
|
||||
}
|
||||
// 工单通知设置
|
||||
function getOrderConfig() {
|
||||
return Axios.get(`/ticket/config`);
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
.ticket-box {
|
||||
background: #F3F3F3;
|
||||
padding: 10px;
|
||||
}
|
||||
.ticket-box .ticket-item {
|
||||
padding: 0.32rem 0.4267rem;
|
||||
margin-bottom: 0.2667rem;
|
||||
border-radius: 3px;
|
||||
background: #FFF;
|
||||
/* vant/Shadow-2 */
|
||||
box-shadow: 0px 2px 12px 0px rgba(100, 101, 102, 0.12);
|
||||
font-size: 0.3733rem;
|
||||
}
|
||||
.ticket-box .ticket-item .ticket-title {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
font-size: 0.4267rem;
|
||||
line-height: 0.64rem;
|
||||
column-gap: 0.2667rem;
|
||||
margin-bottom: 0.2667rem;
|
||||
}
|
||||
.ticket-box .ticket-item .ticket-title .title-box {
|
||||
display: flex;
|
||||
column-gap: 5px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.ticket-box .ticket-item .op-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 0.2667rem;
|
||||
font-size: 0.3733rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.ticket-box .ticket-item .op-box .op-text {
|
||||
cursor: pointer;
|
||||
color: var(--base-color-primary);
|
||||
}
|
||||
.ticket-box .ticket-item .op-box .op-text.danger {
|
||||
color: var(--base-color-danger);
|
||||
}
|
||||
.ticket-box .ticket-item .status-text {
|
||||
font-size: 0.3733rem;
|
||||
line-height: 0.5867rem;
|
||||
padding: 0.08rem 0.2667rem;
|
||||
border-radius: 0.08rem;
|
||||
}
|
||||
.ticket-box .ticket-item .ticket-des {
|
||||
font-size: 0.3733rem;
|
||||
line-height: 0.5867rem;
|
||||
}
|
||||
.ticket-box .ticket-item .ticket-lebal {
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
.all-btn-box {
|
||||
padding: 0.5333rem 0.4267rem;
|
||||
background-color: #fff;
|
||||
}
|
||||
.all-btn-box .van-button {
|
||||
border-radius: 0.16rem;
|
||||
}
|
||||
.form-select {
|
||||
padding: 0;
|
||||
margin-bottom: 0.5333rem;
|
||||
}
|
||||
.form-select .van-field__body {
|
||||
border: 1px solid #CED4DA;
|
||||
border-radius: 3px;
|
||||
padding: 0.2667rem 0.4rem;
|
||||
}
|
||||
.form-select::after {
|
||||
display: none;
|
||||
}
|
||||
.dis-item {
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
.renew {
|
||||
margin-left: 0.08rem;
|
||||
color: var(--base-color-primary);
|
||||
}
|
||||
.wai-filed {
|
||||
padding: 0;
|
||||
}
|
||||
.wai-filed .code-select {
|
||||
padding: 0.6933rem;
|
||||
background-color: #F3F3F3;
|
||||
font-size: 28px;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
.wai-filed::after {
|
||||
display: none;
|
||||
}
|
||||
.file-box {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 0.2667rem;
|
||||
column-gap: 0.2667rem;
|
||||
row-gap: 0.1333rem;
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
.ticket-box {
|
||||
background: #F3F3F3;
|
||||
padding: 10px;
|
||||
|
||||
.ticket-item {
|
||||
padding: .32rem .4267rem;
|
||||
margin-bottom: .2667rem;
|
||||
border-radius: 3px;
|
||||
background: #FFF;
|
||||
/* vant/Shadow-2 */
|
||||
box-shadow: 0px 2px 12px 0px rgba(100, 101, 102, 0.12);
|
||||
font-size: .3733rem;
|
||||
|
||||
.ticket-title {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
font-size: .4267rem;
|
||||
line-height: .64rem;
|
||||
column-gap: .2667rem;
|
||||
margin-bottom: .2667rem;
|
||||
|
||||
.title-box {
|
||||
display: flex;
|
||||
column-gap: 5px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
|
||||
.op-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: .2667rem;
|
||||
font-size: .3733rem;
|
||||
flex-shrink: 0;
|
||||
|
||||
.op-text {
|
||||
cursor: pointer;
|
||||
color: var(--base-color-primary);
|
||||
|
||||
&.danger {
|
||||
color: var(--base-color-danger);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
.status-text {
|
||||
font-size: .3733rem;
|
||||
line-height: .5867rem;
|
||||
padding: .08rem .2667rem;
|
||||
border-radius: .08rem;
|
||||
}
|
||||
|
||||
.ticket-des {
|
||||
font-size: .3733rem;
|
||||
line-height: .5867rem;
|
||||
}
|
||||
|
||||
.ticket-lebal {
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.all-btn-box {
|
||||
padding: .5333rem .4267rem;
|
||||
background-color: #fff;
|
||||
|
||||
.van-button {
|
||||
border-radius: .16rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.form-select {
|
||||
padding: 0;
|
||||
margin-bottom: .5333rem;
|
||||
|
||||
.van-field__body {
|
||||
border: 1px solid #CED4DA;
|
||||
border-radius: 3px;
|
||||
padding: 0.2667rem 0.4rem;
|
||||
}
|
||||
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.dis-item {
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
|
||||
}
|
||||
|
||||
.renew {
|
||||
margin-left: .08rem;
|
||||
color: var(--base-color-primary);
|
||||
}
|
||||
|
||||
|
||||
.wai-filed {
|
||||
padding: 0;
|
||||
|
||||
|
||||
.code-select {
|
||||
padding: .6933rem;
|
||||
background-color: #F3F3F3;
|
||||
font-size: 28px;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.file-box {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-top: .2667rem;
|
||||
column-gap: .2667rem;
|
||||
row-gap: .1333rem;
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
.tick-detail-page {
|
||||
background: #F6F8FB;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.top-nav {
|
||||
position: relative;
|
||||
border-bottom: 0.5px solid #E7E7E7;
|
||||
}
|
||||
.top-nav .nav-title {
|
||||
font-size: 0.48rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 0.1067rem;
|
||||
}
|
||||
.top-nav .nav-title .van-icon {
|
||||
font-size: 0.3733rem;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
.top-nav .detail-box {
|
||||
z-index: 2;
|
||||
padding: 0.5333rem 0.4267rem;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
background-color: #fff;
|
||||
/* vant/Shadow-1 */
|
||||
box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.1);
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
font-size: 0.3733rem;
|
||||
}
|
||||
.top-nav .detail-box .info-item {
|
||||
margin-bottom: 0.2133rem;
|
||||
display: flex;
|
||||
column-gap: 0.5333rem;
|
||||
}
|
||||
.top-nav .detail-box .info-item .info-item-label {
|
||||
color: #878A99;
|
||||
min-width: 2rem;
|
||||
}
|
||||
.top-nav .detail-box .info-item .info-item-text {
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
color: #212529;
|
||||
}
|
||||
.top-nav .detail-box .info-item .status-tag {
|
||||
padding: 0.0533rem 0.1067rem;
|
||||
border-radius: 0.0267rem;
|
||||
}
|
||||
.ticket-content {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
padding: 10px 16px;
|
||||
}
|
||||
.ticket-content .reply-item {
|
||||
margin-bottom: 0.7467rem;
|
||||
}
|
||||
.ticket-content .reply-item .reply-head {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 0.1067rem;
|
||||
}
|
||||
.ticket-content .reply-item .reply-head .reply-name {
|
||||
font-size: 0.4267rem;
|
||||
}
|
||||
.ticket-content .reply-item .reply-head .reply-time {
|
||||
font-size: 0.32rem;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg {
|
||||
margin-top: 0.2133rem;
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-item-content {
|
||||
max-width: 80%;
|
||||
font-size: 0.3733rem;
|
||||
display: inline-block;
|
||||
padding: 10px 12px;
|
||||
border-radius: 3px;
|
||||
background: #EEF4FF;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
font-size: 14px;
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-item-content a {
|
||||
color: var(--base-color-primary);
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-item-content img {
|
||||
max-width: 150px;
|
||||
max-height: 150px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-item-attachment {
|
||||
margin-top: 0.2rem;
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-item-attachment .reply-item-attachment-item {
|
||||
font-size: 0.32rem;
|
||||
color: var(--base-color-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-item-attachment .reply-item-attachment-item:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.ticket-content .reply-item .reply-msg .reply-time {
|
||||
font-size: 0.32rem;
|
||||
color: #878A99;
|
||||
margin-top: 0.1rem;
|
||||
}
|
||||
.ticket-content .reply-item.is-user {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
.ticket-content .reply-item.is-user .reply-msg {
|
||||
text-align: right;
|
||||
}
|
||||
.ticket-content .reply-item.is-user .reply-item-content {
|
||||
background: #E3FBFA;
|
||||
text-align: left;
|
||||
}
|
||||
.ticket-content .reply-item.is-user .reply-head {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
.ticket-bottom {
|
||||
background-color: #fff;
|
||||
padding: 12px;
|
||||
}
|
||||
.ticket-bottom .bottom-top {
|
||||
display: flex;
|
||||
column-gap: 0.32rem;
|
||||
justify-content: space-between;
|
||||
font-size: 0.3733rem;
|
||||
}
|
||||
.ticket-bottom .bottom-top .van-field {
|
||||
width: calc(100% - 0.8rem - 0.9867rem - 1rem);
|
||||
padding: 0;
|
||||
}
|
||||
.ticket-bottom .bottom-top .van-field .van-field__body {
|
||||
padding: 0.2133rem 0.32rem;
|
||||
border-radius: 99px;
|
||||
background: #F3F3F3;
|
||||
border: 1px solid #DCDCDC;
|
||||
}
|
||||
.ticket-bottom .bottom-top .van-field::after {
|
||||
display: none;
|
||||
}
|
||||
.ticket-bottom .bottom-top .send-btn {
|
||||
border-radius: 100px;
|
||||
}
|
||||
.ticket-bottom .file-box {
|
||||
margin-top: 0.2rem;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
column-gap: 0.2667rem;
|
||||
}
|
||||
.close-btn {
|
||||
padding: 0.2667rem 0.4267rem;
|
||||
font-size: 0.4267rem;
|
||||
line-height: 0.64rem;
|
||||
color: var(--base-color-danger);
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
.tick-detail-page {
|
||||
background: #F6F8FB;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.top-nav {
|
||||
position: relative;
|
||||
border-bottom: 0.5px solid #E7E7E7;
|
||||
|
||||
.nav-title {
|
||||
font-size: .48rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: .1067rem;
|
||||
|
||||
.van-icon {
|
||||
font-size: .3733rem;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
}
|
||||
|
||||
.detail-box {
|
||||
z-index: 2;
|
||||
padding: .5333rem .4267rem;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
background-color: #fff;
|
||||
/* vant/Shadow-1 */
|
||||
box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.10);
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
font-size: .3733rem;
|
||||
|
||||
.info-item {
|
||||
margin-bottom: .2133rem;
|
||||
display: flex;
|
||||
column-gap: .5333rem;
|
||||
|
||||
.info-item-label {
|
||||
color: #878A99;
|
||||
min-width: 2rem;
|
||||
}
|
||||
|
||||
.info-item-text {
|
||||
// 换行
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
|
||||
color: #212529;
|
||||
}
|
||||
|
||||
.status-tag {
|
||||
padding: .0533rem .1067rem;
|
||||
border-radius: .0267rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.ticket-content {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
padding: 10px 16px;
|
||||
|
||||
.reply-item {
|
||||
margin-bottom: .7467rem;
|
||||
|
||||
|
||||
|
||||
.reply-head {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: .1067rem;
|
||||
|
||||
.reply-name {
|
||||
font-size: .4267rem;
|
||||
|
||||
}
|
||||
|
||||
.reply-time {
|
||||
font-size: .32rem;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
}
|
||||
|
||||
.reply-msg {
|
||||
margin-top: .2133rem;
|
||||
|
||||
.reply-item-content {
|
||||
max-width: 80%;
|
||||
font-size: .3733rem;
|
||||
display: inline-block;
|
||||
padding: 10px 12px;
|
||||
border-radius: 3px;
|
||||
background: #EEF4FF;
|
||||
// 换行
|
||||
word-break: break-all;
|
||||
// 英文数字换行
|
||||
word-wrap: break-word;
|
||||
font-size: 14px;
|
||||
|
||||
a {
|
||||
color: var(--base-color-primary);
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 150px;
|
||||
max-height: 150px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.reply-item-attachment {
|
||||
margin-top: .2rem;
|
||||
|
||||
.reply-item-attachment-item {
|
||||
font-size: .32rem;
|
||||
color: var(--base-color-primary);
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.reply-time {
|
||||
font-size: .32rem;
|
||||
color: #878A99;
|
||||
margin-top: 0.1rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&.is-user {
|
||||
flex-direction: row-reverse;
|
||||
|
||||
.reply-msg {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.reply-item-content {
|
||||
background: #E3FBFA;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.reply-head {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.ticket-bottom {
|
||||
background-color: #fff;
|
||||
padding: 12px;
|
||||
|
||||
.bottom-top {
|
||||
display: flex;
|
||||
column-gap: .32rem;
|
||||
justify-content: space-between;
|
||||
font-size: .3733rem;
|
||||
|
||||
.van-field {
|
||||
width: calc(100% - .8rem - .9867rem - 1rem);
|
||||
padding: 0;
|
||||
|
||||
.van-field__body {
|
||||
padding: .2133rem .32rem;
|
||||
border-radius: 99px;
|
||||
background: #F3F3F3;
|
||||
border: 1px solid #DCDCDC;
|
||||
}
|
||||
|
||||
&::after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.send-btn {
|
||||
border-radius: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
.file-box {
|
||||
margin-top: .2rem;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
column-gap: .2667rem;
|
||||
}
|
||||
}
|
||||
|
||||
.close-btn {
|
||||
padding: .2667rem .4267rem;
|
||||
font-size: .4267rem;
|
||||
line-height: .64rem;
|
||||
color: var(--base-color-danger);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
After Width: | Height: | Size: 480 B |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
@@ -0,0 +1,442 @@
|
||||
(function (window, undefined) {
|
||||
var old_onload = window.onload;
|
||||
window.onload = function () {
|
||||
typeof old_onload == "function" && old_onload();
|
||||
window.lang = Object.assign(window.lang, window.plugin_lang);
|
||||
const { showToast } = vant;
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
topMenu,
|
||||
curSelect,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
lang: window.lang,
|
||||
// 分页
|
||||
params: {
|
||||
page: 1,
|
||||
limit: 20,
|
||||
pageSizes: [20, 50, 100],
|
||||
total: 200,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
keywords: "",
|
||||
status: [3],
|
||||
ticket_type_id: "",
|
||||
},
|
||||
ticketData: {
|
||||
title: "",
|
||||
ticket_type_id: "",
|
||||
host_ids: "",
|
||||
content: "",
|
||||
attachment: [],
|
||||
// 工单部门id
|
||||
admin_role_id: "",
|
||||
},
|
||||
hasApp: false,
|
||||
rules: {
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
message: lang.ticket_tips9,
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
ticket_type_id: [
|
||||
{
|
||||
required: true,
|
||||
message: lang.ticket_tips2,
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
content: [
|
||||
{
|
||||
required: true,
|
||||
message: lang.ticket_tips6,
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
// 通用数据
|
||||
commonData: {},
|
||||
// 表格数据
|
||||
dataList: [],
|
||||
// 表格加载
|
||||
tableLoading: false,
|
||||
tableFinished: false,
|
||||
// 创建工单弹窗是否显示
|
||||
isShowDialog: false,
|
||||
// 创建工单弹窗 数据
|
||||
formData: {
|
||||
title: "",
|
||||
ticket_type_id: "",
|
||||
host_ids: [],
|
||||
content: "",
|
||||
attachment: [],
|
||||
},
|
||||
// 表单错误信息显示
|
||||
errText: "",
|
||||
// 工单类别
|
||||
ticketType: [],
|
||||
ticketStatus: [],
|
||||
// 关联产品列表
|
||||
hostList: [],
|
||||
createBtnLoading: false,
|
||||
loading: false,
|
||||
fileList: [],
|
||||
configObj: {
|
||||
ticket_notice_open: 0,
|
||||
ticket_notice_description: "",
|
||||
},
|
||||
statusIsChange: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
calcTicketType() {
|
||||
return [
|
||||
{
|
||||
value: "",
|
||||
text: lang.all,
|
||||
},
|
||||
].concat(this.ticketType);
|
||||
},
|
||||
calcStatus() {
|
||||
const arrName = [];
|
||||
this.ticketStatus.forEach((item) => {
|
||||
if (this.params.status.includes(item.id)) {
|
||||
arrName.push(item.name);
|
||||
}
|
||||
});
|
||||
return arrName.length > 1
|
||||
? arrName[0] + " +" + (arrName.length - 1).toString()
|
||||
: arrName.join("、");
|
||||
},
|
||||
calcHostName() {
|
||||
const item = this.hostList.find((item) => {
|
||||
return item.id == this.ticketData.host_ids;
|
||||
});
|
||||
if (item) {
|
||||
return item.product_name + "(" + item.name + ")";
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
created() {
|
||||
// 获取通用信息
|
||||
this.getCommonData();
|
||||
this.getOrderConfig();
|
||||
// 获取工单类型
|
||||
this.getTicketType();
|
||||
// 获取工单状态
|
||||
this.getTicketStatus();
|
||||
// 获取关联产品列表
|
||||
this.getHostList();
|
||||
},
|
||||
mounted() {
|
||||
this.hasApp = havePlugin("IdcsmartAppMarket");
|
||||
},
|
||||
methods: {
|
||||
handleRenew(item) {
|
||||
const hostId = item.parent_host_id || item.id;
|
||||
window.open(`/productdetail.htm?id=${hostId}`);
|
||||
},
|
||||
goBack() {
|
||||
window.history.back();
|
||||
},
|
||||
async getOrderConfig() {
|
||||
try {
|
||||
const res = await getOrderConfig();
|
||||
this.configObj = res.data.data;
|
||||
} catch (error) {}
|
||||
},
|
||||
|
||||
// 获取通用配置
|
||||
getCommonData() {
|
||||
this.commonData = JSON.parse(
|
||||
localStorage.getItem("common_set_before")
|
||||
);
|
||||
document.title =
|
||||
this.commonData.website_name + "-" + lang.ticket_label15;
|
||||
},
|
||||
handeSelecFile() {
|
||||
this.$refs.uploadRef.chooseFile();
|
||||
},
|
||||
afterRead(file) {
|
||||
const arr = [];
|
||||
if (file instanceof Array) {
|
||||
arr.push(...file);
|
||||
} else {
|
||||
arr.push(file);
|
||||
}
|
||||
this.uploadFiles(arr);
|
||||
},
|
||||
handeDelFile(file, index) {
|
||||
this.ticketData.attachment = this.ticketData.attachment.filter(
|
||||
(item) => {
|
||||
return item != file.save_name;
|
||||
}
|
||||
);
|
||||
this.fileList.splice(index, 1);
|
||||
},
|
||||
delAllFile() {
|
||||
this.ticketData.attachment = [];
|
||||
this.fileList = [];
|
||||
},
|
||||
uploadFiles(arr) {
|
||||
arr.forEach((item) => {
|
||||
const formData = new FormData();
|
||||
formData.set("file", item.file); // 这里要用set,如果用append,还是会出现一起上传的情况
|
||||
uploadFile(formData)
|
||||
.then((res) => {
|
||||
console.log(res);
|
||||
if (res.data.status === 200) {
|
||||
this.fileList.push({
|
||||
file: item.file,
|
||||
save_name: res.data.data.save_name,
|
||||
});
|
||||
this.ticketData.attachment.push(res.data.data.save_name);
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
showToast(err.data.msg);
|
||||
});
|
||||
});
|
||||
},
|
||||
initPage() {
|
||||
this.params.page = 1;
|
||||
this.dataList = [];
|
||||
// 获取列表
|
||||
this.getTicketList();
|
||||
},
|
||||
// 获取工单列表
|
||||
getTicketList() {
|
||||
this.tableLoading = true;
|
||||
ticketList(this.params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.dataList = this.dataList.concat(res.data.data.list);
|
||||
this.tableLoading = false;
|
||||
this.params.page++;
|
||||
this.params.total = res.data.data.count;
|
||||
this.tableFinished =
|
||||
this.dataList.length >= res.data.data.count;
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
this.tableLoading = false;
|
||||
showToast(err.data.msg);
|
||||
});
|
||||
},
|
||||
// 展示创建弹窗 并初始化弹窗数据
|
||||
showCreateDialog() {
|
||||
location.href = `addTicket.htm`;
|
||||
},
|
||||
handelMore() {},
|
||||
calcProductName(item) {
|
||||
const curTime = parseInt(new Date().getTime() / 1000);
|
||||
if (item.due_time > 0) {
|
||||
if (item.due_time <= curTime) {
|
||||
// 已到期
|
||||
return `(${lang.ticket_label21})`;
|
||||
} else if (item.due_time - curTime <= item.renewal_first_day_time) {
|
||||
// 即将到期
|
||||
return `(${item.name.slice(0, 8)}......${item.name.slice(-5)})${
|
||||
lang.ticket_label22
|
||||
}`;
|
||||
} else {
|
||||
return `(${item.name})`;
|
||||
}
|
||||
} else {
|
||||
return `(${item.name})`;
|
||||
}
|
||||
},
|
||||
calcShowRenew(item) {
|
||||
const curTime = parseInt(new Date().getTime() / 1000);
|
||||
if (
|
||||
item.due_time > 0 &&
|
||||
(item.due_time <= curTime ||
|
||||
item.due_time - curTime <= item.renewal_first_day_time)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.ticketForm.validate().then(() => {
|
||||
this.loading = true;
|
||||
const params = { ...this.ticketData };
|
||||
params.host_ids = params.host_ids ? [params.host_ids] : [];
|
||||
createTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status == 200) {
|
||||
const id = res.data.data.id;
|
||||
location.href = `ticketDetails.htm?id=${id}`;
|
||||
}
|
||||
this.loading = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.loading = false;
|
||||
showToast(error.data.msg);
|
||||
});
|
||||
});
|
||||
},
|
||||
statusClose() {
|
||||
if (this.statusIsChange) {
|
||||
this.initPage();
|
||||
this.statusIsChange = false;
|
||||
}
|
||||
},
|
||||
|
||||
clickStatus(item) {
|
||||
if (this.params.status.includes(item)) {
|
||||
this.params.status.splice(this.params.status.indexOf(item), 1);
|
||||
} else {
|
||||
this.params.status.push(item);
|
||||
}
|
||||
this.statusIsChange = true;
|
||||
},
|
||||
openAddTicket() {
|
||||
this.ticketData = {
|
||||
title: "",
|
||||
ticket_type_id: "",
|
||||
host_ids: "",
|
||||
content: "",
|
||||
attachment: [],
|
||||
// 工单部门id
|
||||
admin_role_id: "",
|
||||
};
|
||||
this.$refs.ticketForm && this.$refs.ticketForm.resetValidation();
|
||||
this.isShowDialog = true;
|
||||
},
|
||||
closeDialog() {
|
||||
this.delAllFile();
|
||||
this.isShowDialog = false;
|
||||
},
|
||||
hexToRgb(hex) {
|
||||
const color = hex.split("#")[1];
|
||||
const r = parseInt(color.substring(0, 2), 16);
|
||||
const g = parseInt(color.substring(2, 4), 16);
|
||||
const b = parseInt(color.substring(4, 6), 16);
|
||||
return `rgba(${r},${g},${b},0.12)`;
|
||||
},
|
||||
// 获取工单类型
|
||||
getTicketType() {
|
||||
ticketType().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketType = res.data.data.list.map((item) => {
|
||||
item.value = item.id;
|
||||
item.text = item.name;
|
||||
return item;
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取工单状态列表
|
||||
getTicketStatus() {
|
||||
ticketStatus().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.params.status = [3];
|
||||
this.ticketStatus = res.data.data.list.map((item) => {
|
||||
item.value = item.id;
|
||||
item.text = item.name;
|
||||
return item;
|
||||
});
|
||||
res.data.data.list.forEach((item) => {
|
||||
if (item.status === 0) {
|
||||
this.params.status.push(item.id);
|
||||
}
|
||||
});
|
||||
// 获取工单列表
|
||||
this.initPage();
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取产品列表
|
||||
getHostList() {
|
||||
const params = {
|
||||
keywords: "",
|
||||
status: "",
|
||||
page: 1,
|
||||
limit: 1000,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
scene: "ticket",
|
||||
};
|
||||
hostAll(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.hostList = res.data.data.list
|
||||
.filter((item) => item.status !== "Deleted")
|
||||
.map((item) => {
|
||||
const curTime = parseInt(new Date().getTime() / 1000);
|
||||
item.isDue = item.due_time > 0 && item.due_time <= curTime;
|
||||
return item;
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
chooseItem(e) {
|
||||
const val = e[0].id;
|
||||
const cur = this.hostList.filter((el) => el.id === val);
|
||||
if (this.hasApp && cur.length > 0 && cur[0].isDue) {
|
||||
this.ticketData.host_ids = "";
|
||||
}
|
||||
},
|
||||
|
||||
// 跳转工单详情
|
||||
itemReply(record) {
|
||||
const id = record.id;
|
||||
location.href = `ticketDetails.htm?id=${id}`;
|
||||
},
|
||||
// 关闭工单
|
||||
itemClose(record) {
|
||||
const id = record.id;
|
||||
const params = {
|
||||
id,
|
||||
};
|
||||
// 调用关闭工单接口 给出结果
|
||||
closeTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
showToast(res.data.msg);
|
||||
this.initPage();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
showToast(err.data.msg);
|
||||
});
|
||||
},
|
||||
// 催单
|
||||
itemUrge(record) {
|
||||
const nowDate = new Date().getTime();
|
||||
const last_reply_time = record.last_urge_time * 1000;
|
||||
if (nowDate - last_reply_time < 1000 * 60 * 15) {
|
||||
showToast(lang.ticket_label16);
|
||||
return;
|
||||
}
|
||||
const id = record.id;
|
||||
const params = { id };
|
||||
// 调用催单接口 给出结果
|
||||
urgeTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
showToast(res.data.msg);
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
showToast(err.data.msg);
|
||||
});
|
||||
},
|
||||
|
||||
titleClick(record) {
|
||||
const id = record.id;
|
||||
location.href = `ticketDetails.htm?id=${id}`;
|
||||
},
|
||||
},
|
||||
});
|
||||
window.directiveInfo.forEach((item) => {
|
||||
app.directive(item.name, item.fn);
|
||||
});
|
||||
app.use(vant).mount("#template");
|
||||
};
|
||||
})(window);
|
||||
@@ -0,0 +1,400 @@
|
||||
(function (window, undefined) {
|
||||
var old_onload = window.onload;
|
||||
window.onload = function () {
|
||||
window.lang = Object.assign(window.lang, window.plugin_lang);
|
||||
typeof old_onload == "function" && old_onload();
|
||||
const {showToast, showImagePreview} = vant;
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
topMenu,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
lang: window.lang,
|
||||
commonData: {},
|
||||
id: null,
|
||||
isShowMore: false,
|
||||
ticketData: {},
|
||||
// 工单类别
|
||||
ticketTypeList: [],
|
||||
// 关联产品列表
|
||||
hostList: [],
|
||||
sdasaasd: {maxHeight: ".9867rem", minHeight: 0},
|
||||
// 基本信息
|
||||
baseMsg: {
|
||||
title: "",
|
||||
type: "",
|
||||
hosts: "",
|
||||
status: "",
|
||||
create_time: "",
|
||||
color: "#0AB39C",
|
||||
},
|
||||
replyData: {
|
||||
id: null,
|
||||
content: "",
|
||||
attachment: [],
|
||||
},
|
||||
sendBtnLoading: false,
|
||||
fileList: [],
|
||||
visible: false,
|
||||
delLoading: false,
|
||||
isClose: false,
|
||||
viewer: null,
|
||||
preImg: "",
|
||||
};
|
||||
},
|
||||
mounted() {},
|
||||
updated() {},
|
||||
destroyed() {},
|
||||
created() {
|
||||
// 获取通用信息
|
||||
this.getCommonData();
|
||||
|
||||
// 获取工单详情
|
||||
this.getDetails();
|
||||
this.autoRefresh();
|
||||
},
|
||||
watch: {},
|
||||
filters: {},
|
||||
methods: {
|
||||
autoRefresh() {
|
||||
setInterval(() => {
|
||||
this.getDetails();
|
||||
}, 1000 * 60);
|
||||
},
|
||||
goBack() {
|
||||
location.href = "ticket.htm";
|
||||
},
|
||||
handeSelecFile() {
|
||||
this.$refs.uploadRef.chooseFile();
|
||||
},
|
||||
afterRead(file) {
|
||||
const arr = [];
|
||||
if (file instanceof Array) {
|
||||
arr.push(...file);
|
||||
} else {
|
||||
arr.push(file);
|
||||
}
|
||||
this.uploadFiles(arr);
|
||||
},
|
||||
uploadFiles(arr) {
|
||||
arr.forEach((item) => {
|
||||
const formData = new FormData();
|
||||
formData.set("file", item.file); // 这里要用set,如果用append,还是会出现一起上传的情况
|
||||
uploadFile(formData)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.fileList.push({
|
||||
file: item.file,
|
||||
save_name: res.data.data.save_name,
|
||||
});
|
||||
this.replyData.attachment.push(res.data.data.save_name);
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
showToast(err.data.msg);
|
||||
});
|
||||
});
|
||||
},
|
||||
handeDelFile(file, index) {
|
||||
this.replyData.attachment = this.replyData.attachment.filter(
|
||||
(item) => {
|
||||
return item != file.save_name;
|
||||
}
|
||||
);
|
||||
this.fileList.splice(index, 1);
|
||||
},
|
||||
// 使 right-main 的滚动条平滑的滚动到底部
|
||||
scrollToBottom() {
|
||||
let rightMain = document.getElementsByClassName("ticket-content")[0];
|
||||
rightMain.scrollTop = rightMain.scrollHeight;
|
||||
},
|
||||
// 获取通用配置
|
||||
getCommonData() {
|
||||
this.commonData = JSON.parse(
|
||||
localStorage.getItem("common_set_before")
|
||||
);
|
||||
document.title =
|
||||
this.commonData.website_name + "-" + lang.ticket_label17;
|
||||
},
|
||||
// 返回工单列表页面
|
||||
backTicket() {
|
||||
location.href = "ticket.htm";
|
||||
},
|
||||
hexToRgb(hex) {
|
||||
const color = hex.split("#")[1];
|
||||
const r = parseInt(color.substring(0, 2), 16);
|
||||
const g = parseInt(color.substring(2, 4), 16);
|
||||
const b = parseInt(color.substring(4, 6), 16);
|
||||
return `rgba(${r},${g},${b},0.12)`;
|
||||
},
|
||||
// 获取url中的id参数然后获取工单详情信息
|
||||
getDetails() {
|
||||
let url = window.location.href;
|
||||
let getqyinfo = url.split("?")[1];
|
||||
let getqys = new URLSearchParams("?" + getqyinfo);
|
||||
let id = getqys.get("id");
|
||||
this.id = id;
|
||||
const params = {
|
||||
id,
|
||||
};
|
||||
// 调用查看工单接口
|
||||
ticketDetail(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketData = res.data.data.ticket;
|
||||
const replies = res.data.data.ticket.replies;
|
||||
const arrEntities = {
|
||||
lt: "<",
|
||||
gt: ">",
|
||||
nbsp: " ",
|
||||
amp: "&",
|
||||
quot: '"',
|
||||
};
|
||||
this.ticketData.replies = replies.reverse().map((item) => {
|
||||
item.content = filterXSS(item.content).replace(
|
||||
/&(lt|gt|nbsp|amp|quot);/gi,
|
||||
function (all, t) {
|
||||
return arrEntities[t];
|
||||
}
|
||||
);
|
||||
return item;
|
||||
});
|
||||
// 工单类型
|
||||
this.getTicketType();
|
||||
// 当前状态
|
||||
this.baseMsg.status = this.ticketData.status;
|
||||
// 标题
|
||||
this.baseMsg.title = this.ticketData.title;
|
||||
this.baseMsg.create_time = this.ticketData.create_time;
|
||||
this.baseMsg.color = this.ticketData.color;
|
||||
// 关联产品
|
||||
this.getHostList();
|
||||
this.$nextTick(() => {
|
||||
this.scrollToBottom();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取工单类型
|
||||
getTicketType() {
|
||||
ticketType().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketTypeList = res.data.data.list;
|
||||
this.ticketTypeList.map((item) => {
|
||||
if (item.id == this.ticketData.ticket_type_id) {
|
||||
this.baseMsg.type = item.name;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取产品列表
|
||||
getHostList() {
|
||||
const params = {
|
||||
keywords: "",
|
||||
status: "",
|
||||
page: 1,
|
||||
limit: 1000,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
};
|
||||
hostAll(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.hostList = res.data.data.list;
|
||||
// let names = ""
|
||||
|
||||
let hosts = [];
|
||||
this.ticketData.host_ids.forEach((element) => {
|
||||
this.hostList.forEach((item) => {
|
||||
if (item.id == element) {
|
||||
let hostitem = {
|
||||
id: item.id,
|
||||
label: item.product_name + " (" + item.name + ")",
|
||||
};
|
||||
|
||||
hosts.push(hostitem);
|
||||
|
||||
// names += item.product_name + " (" + item.name + ")" + ","
|
||||
}
|
||||
});
|
||||
});
|
||||
// names = names.slice(0, -1)
|
||||
this.baseMsg.hosts = hosts;
|
||||
}
|
||||
});
|
||||
},
|
||||
// 回复工单
|
||||
doReplyTicket() {
|
||||
if (this.sendBtnLoading) return;
|
||||
if (!this.replyData.content) {
|
||||
showToast(lang.ticket_label18);
|
||||
return;
|
||||
}
|
||||
|
||||
// 将content中的 /n 替换成 <br>
|
||||
this.replyData.content = this.replyData.content.replace(
|
||||
/\n/g,
|
||||
"<br>"
|
||||
);
|
||||
const params = {
|
||||
...this.replyData,
|
||||
id: this.id,
|
||||
};
|
||||
this.sendBtnLoading = true;
|
||||
replyTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
// 清空输入框
|
||||
this.replyData.content = "";
|
||||
this.replyData.attachment = [];
|
||||
this.fileList = [];
|
||||
// 重新拉取工单详情
|
||||
this.getDetails();
|
||||
}
|
||||
this.sendBtnLoading = false;
|
||||
})
|
||||
.catch((err) => {
|
||||
this.sendBtnLoading = false;
|
||||
console.log(err);
|
||||
showToast(err.data.msg);
|
||||
});
|
||||
},
|
||||
// 上传文件相关
|
||||
handleSuccess(response, file, fileList) {
|
||||
// console.log(response);
|
||||
if (response.status != 200) {
|
||||
showToast(response.msg);
|
||||
// 清空上传框
|
||||
let uploadFiles = this.$refs["fileupload"].uploadFiles;
|
||||
let length = uploadFiles.length;
|
||||
uploadFiles.splice(length - 1, length);
|
||||
} else {
|
||||
this.replyData.attachment.push(response.data.save_name);
|
||||
}
|
||||
},
|
||||
handleProgress(response) {
|
||||
console.log("response", response);
|
||||
},
|
||||
beforeRemove(file, fileList) {
|
||||
// 获取到删除的 save_name
|
||||
let save_name = file.response.data.save_name;
|
||||
this.replyData.attachment = this.replyData.attachment.filter(
|
||||
(item) => {
|
||||
return item != save_name;
|
||||
}
|
||||
);
|
||||
},
|
||||
// 附件下载
|
||||
downloadfile(item) {
|
||||
const url = item.url;
|
||||
const name = item.name;
|
||||
const type = name.substring(name.lastIndexOf(".") + 1);
|
||||
if (
|
||||
[
|
||||
"png",
|
||||
"jpg",
|
||||
"jepg",
|
||||
"jpeg",
|
||||
"JPEG",
|
||||
"bmp",
|
||||
"webp",
|
||||
"PNG",
|
||||
"JPG",
|
||||
"JEPG",
|
||||
"BMP",
|
||||
"WEBP",
|
||||
].includes(type)
|
||||
) {
|
||||
showImagePreview([url]);
|
||||
} else {
|
||||
window.open(url);
|
||||
}
|
||||
},
|
||||
showClose() {
|
||||
this.visible = true;
|
||||
},
|
||||
// 关闭工单
|
||||
doCloseTicket() {
|
||||
const params = {
|
||||
id: this.id,
|
||||
};
|
||||
this.delLoading = true;
|
||||
closeTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status == 200) {
|
||||
showToast(res.data.msg);
|
||||
this.visible = false;
|
||||
// 重新拉取工单详情
|
||||
this.getDetails();
|
||||
}
|
||||
this.delLoading = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
showToast(error.data.msg);
|
||||
this.delLoading = false;
|
||||
});
|
||||
},
|
||||
// 载入富文本
|
||||
initTemplate() {
|
||||
tinymce.init({
|
||||
selector: "#tiny",
|
||||
language_url: "/tinymce/langs/zh_CN.js",
|
||||
language: "zh_CN",
|
||||
min_height: 400,
|
||||
width: "100%",
|
||||
plugins:
|
||||
"link lists image code table colorpicker textcolor wordcount contextmenu fullpage",
|
||||
toolbar:
|
||||
"bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image fullpage code | removeformat",
|
||||
images_upload_url: "/console/v1/upload",
|
||||
convert_urls: false,
|
||||
images_upload_handler: this.handlerAddImg,
|
||||
});
|
||||
},
|
||||
// 富文本图片上传
|
||||
handlerAddImg(blobInfo, success, failure) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const formData = new FormData();
|
||||
formData.append("file", blobInfo.blob());
|
||||
axios
|
||||
.post("/console/v1/upload", formData, {
|
||||
headers: {
|
||||
Authorization: "Bearer" + " " + localStorage.getItem("jwt"),
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
const json = {};
|
||||
if (res.status !== 200) {
|
||||
failure("HTTP Error: " + res.data.msg);
|
||||
return;
|
||||
}
|
||||
json.location = res.data.data?.image_url;
|
||||
if (!json || typeof json.location !== "string") {
|
||||
failure("Error:" + res.data.msg);
|
||||
return;
|
||||
}
|
||||
success(json.location);
|
||||
});
|
||||
});
|
||||
},
|
||||
toHost(id) {
|
||||
location.href = "/productdetail.htm?id=" + id;
|
||||
},
|
||||
hanldeImage(event) {
|
||||
console.log(event);
|
||||
if (
|
||||
event.target.nodeName == "IMG" ||
|
||||
event.target.nodeName == "img"
|
||||
) {
|
||||
const img = event.target.currentSrc;
|
||||
showImagePreview([img]);
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
window.directiveInfo.forEach((item) => {
|
||||
app.directive(item.name, item.fn);
|
||||
});
|
||||
app.use(vant).mount("#template");
|
||||
};
|
||||
})(window);
|
||||
@@ -0,0 +1,196 @@
|
||||
(function () {
|
||||
const plugin_lang = {
|
||||
"zh-cn": {
|
||||
// 工单系统
|
||||
all: "全部",
|
||||
type: "类型",
|
||||
ticket_title: "工单系统",
|
||||
ticket_title2: "新建工单",
|
||||
ticket_title3: "工单详情",
|
||||
ticket_title4: "基本信息",
|
||||
ticket_title5: "沟通记录",
|
||||
ticket_title6: "关闭工单",
|
||||
ticket_text1: "待接单",
|
||||
ticket_text2: "处理中",
|
||||
ticket_text3: "待回复",
|
||||
ticket_text4: "已回复",
|
||||
ticket_text5: "已关闭",
|
||||
ticket_btn1: "新建工单",
|
||||
ticket_btn2: "查询",
|
||||
ticket_btn3: "回复",
|
||||
ticket_btn4: "催单",
|
||||
ticket_btn5: "关闭",
|
||||
ticket_btn6: "确认",
|
||||
ticket_btn7: "关闭工单",
|
||||
ticket_btn8: "发送",
|
||||
ticket_btn9: "取消",
|
||||
ticket_tips1: "请输入工单编号或标题",
|
||||
ticket_tips2: "请选择工单部门",
|
||||
ticket_tips3: "请选择工单状态",
|
||||
ticket_tips4: "请输入工单标题",
|
||||
ticket_tips5: "请选择关联产品",
|
||||
ticket_tips6: "请输入问题描述",
|
||||
ticket_tips7:
|
||||
"已收到您的催单通知,我们将尽快处理您的工单,感谢您的支持和配合",
|
||||
ticket_tips8: "请选择工单部门",
|
||||
ticket_tips9: "请输入工单标题",
|
||||
ticket_tips10: "请选择商品",
|
||||
ticket_tips11: "您将关闭工单",
|
||||
ticket_tips12: "是否继续",
|
||||
ticket_label1: "工单标题",
|
||||
ticket_label2: "工单部门",
|
||||
ticket_label3: "最近回复时间",
|
||||
ticket_label4: "状态",
|
||||
ticket_label5: "操作",
|
||||
ticket_label6: "工单标题",
|
||||
ticket_label7: "关联产品",
|
||||
ticket_label8: "详细描述",
|
||||
ticket_label9: "标题",
|
||||
ticket_label10: "提交时间",
|
||||
ticket_label11: "当前状态",
|
||||
ticket_label12: "请输入内容",
|
||||
ticket_label13: "上传文件",
|
||||
ticket_label14: "工单详情",
|
||||
ticket_label15: "工单系统",
|
||||
ticket_label16:
|
||||
"已收到您的催单通知,我们将尽快处理您的工单,感谢您的支持和配合",
|
||||
ticket_label17: "工单详情",
|
||||
ticket_label18: "请输入要回复的内容",
|
||||
ticket_label19: "短信验证",
|
||||
ticket_label20: "续费",
|
||||
ticket_label21: "已到期",
|
||||
ticket_label22: "即将到期",
|
||||
ticket_label23: "即将跳转产品详情页进行续费",
|
||||
ticket_label24: "续费完成后,请重新进入新建工单页面",
|
||||
},
|
||||
"en-us": {
|
||||
all: "all",
|
||||
type: "type",
|
||||
// Work order system
|
||||
ticket_title: "Ticket Order System",
|
||||
ticket_title2: "New ticket",
|
||||
ticket_title3: "Ticket details",
|
||||
ticket_title4: "Basic information",
|
||||
ticket_title5: "Communication Record",
|
||||
ticket_title6: "Close ticket",
|
||||
ticket_text1: "Awaiting orders",
|
||||
ticket_text2: "Processing",
|
||||
ticket_text3: "To be replied",
|
||||
ticket_text4: "Replyed",
|
||||
ticket_text5: "Close",
|
||||
ticket_btn1: "New ticket",
|
||||
ticket_btn2: "query",
|
||||
ticket_btn3: "reply",
|
||||
ticket_btn4: "Reminder",
|
||||
ticket_btn5: "Close",
|
||||
ticket_btn6: "Confirm",
|
||||
ticket_btn7: "Close ticket",
|
||||
ticket_btn8: "Send",
|
||||
ticket_btn9: "Cancel",
|
||||
ticket_tips1: "Please enter the ticket number or title",
|
||||
ticket_tips2: "Please select the ticket department",
|
||||
ticket_tips3: "Please select the ticket status",
|
||||
ticket_tips4: "Please enter the ticket title",
|
||||
ticket_tips5: "Please select related products",
|
||||
ticket_tips6: "Please enter a description of the problem",
|
||||
ticket_tips7:
|
||||
"We have received your reminder notice and we will process your work order as soon as possible. Thank you for your support and cooperation",
|
||||
ticket_tips8: "Please select the ticket department",
|
||||
ticket_tips9: "Please enter the ticket title",
|
||||
ticket_tips10: "Please select a product",
|
||||
ticket_tips11: "You will close the ticket",
|
||||
ticket_tips12: "Do you want to continue?",
|
||||
ticket_label1: "Title of ticket",
|
||||
ticket_label2: "Ticket Department",
|
||||
ticket_label3: "Last reply time",
|
||||
ticket_label4: "Status",
|
||||
ticket_label5: "Operation",
|
||||
ticket_label6: "Title of ticket",
|
||||
ticket_label7: "Associated products",
|
||||
ticket_label8: "Detailed description",
|
||||
ticket_label9: "Title",
|
||||
ticket_label10: "Submission time",
|
||||
ticket_label11: "Current status",
|
||||
ticket_label12: "Please enter content",
|
||||
ticket_label13: "Upload file",
|
||||
ticket_label14: "Ticket details",
|
||||
ticket_label15: "Ticket Order System",
|
||||
ticket_label16:
|
||||
"We have received your reminder notice and we will process your work order as soon as possible. Thank you for your support and cooperation",
|
||||
ticket_label17: "Ticket details",
|
||||
ticket_label18: "Please enter the content to be replied",
|
||||
ticket_label19: "SMS Verification",
|
||||
ticket_label20: "Renewal",
|
||||
ticket_label21: "Expired",
|
||||
ticket_label22: "Due",
|
||||
ticket_label23:
|
||||
"You will be redirected to the product details page for renewal",
|
||||
ticket_label24:
|
||||
"After renewal is completed, please re-enter the new work order page",
|
||||
},
|
||||
"zh-hk": {
|
||||
all: "全部",
|
||||
type: "類型",
|
||||
ticket_title: "工單系統",
|
||||
ticket_title2: "新建工單",
|
||||
ticket_title3: "工單詳情",
|
||||
ticket_title4: "基本資訊",
|
||||
ticket_title5: "溝通記錄",
|
||||
ticket_title6: "關閉工單",
|
||||
ticket_text1: "待接單",
|
||||
ticket_text2: "處理中",
|
||||
ticket_text3: "待回覆",
|
||||
ticket_text4: "已回覆",
|
||||
ticket_text5: "已關閉",
|
||||
ticket_btn1: "新建工單",
|
||||
ticket_btn2: "查詢",
|
||||
ticket_btn3: "回覆",
|
||||
ticket_btn4: "催單",
|
||||
ticket_btn5: "關閉",
|
||||
ticket_btn6: "確認",
|
||||
ticket_btn7: "關閉工單",
|
||||
ticket_btn8: "發送",
|
||||
ticket_btn9: "取消",
|
||||
ticket_tips1: "請輸入工單編號或標題",
|
||||
ticket_tips2: "請選擇工單部門",
|
||||
ticket_tips3: "請選擇工單狀態",
|
||||
ticket_tips4: "請輸入工單標題",
|
||||
ticket_tips5: "請選擇關聯產品",
|
||||
ticket_tips6: "請輸入問題描述",
|
||||
ticket_tips7:
|
||||
"已收到您的催單通知,我們將盡快處理您的工單,感謝您的支持與配合",
|
||||
ticket_tips8: "請選擇工單部門",
|
||||
ticket_tips9: "請輸入工單標題",
|
||||
ticket_tips10: "請選擇商品",
|
||||
ticket_tips11: "您將關閉工單",
|
||||
ticket_tips12: "是否繼續",
|
||||
ticket_label1: "工單標題",
|
||||
ticket_label2: "工單部門",
|
||||
ticket_label3: "最近回覆時間",
|
||||
ticket_label4: "狀態",
|
||||
ticket_label5: "操作",
|
||||
ticket_label6: "工單標題",
|
||||
ticket_label7: "關聯產品",
|
||||
ticket_label8: "詳細描述",
|
||||
ticket_label9: "標題",
|
||||
ticket_label10: "提交時間",
|
||||
ticket_label11: "當前狀態",
|
||||
ticket_label12: "請輸入內容",
|
||||
ticket_label13: "上傳檔案",
|
||||
ticket_label14: "工單明細",
|
||||
ticket_label15: "工單系統",
|
||||
ticket_label16:
|
||||
"已收到您的催單通知,我們將盡快處理您的工單,感謝您的支持與配合",
|
||||
ticket_label17: "工單明細",
|
||||
ticket_label18: "請輸入要回覆的內容",
|
||||
ticket_label19: "簡訊驗證",
|
||||
ticket_label20: "續費",
|
||||
ticket_label21: "已到期",
|
||||
ticket_label22: "即將到期",
|
||||
ticket_label23: "即將跳轉產品詳情頁進行續費",
|
||||
ticket_label24: "續費完成後,請重新進入新建工單頁面",
|
||||
},
|
||||
};
|
||||
const DEFAULT_LANG = localStorage.getItem("lang") || "zh-cn";
|
||||
window.plugin_lang = plugin_lang[DEFAULT_LANG];
|
||||
})();
|
||||
@@ -0,0 +1,144 @@
|
||||
<!-- 页面引入样式位置 -->
|
||||
<link rel="stylesheet" href="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/css/ticket.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="template" v-cloak>
|
||||
<top-menu neednav>
|
||||
<template #left>
|
||||
<van-icon @click="goBack" class="left-icon" name="arrow-left"></van-icon>
|
||||
</template>
|
||||
<template #center>
|
||||
<div class="nav-title">{{lang.ticket_title}}</div>
|
||||
</template>
|
||||
<template #right>
|
||||
</template>
|
||||
</top-menu>
|
||||
<form action="/">
|
||||
<van-search class="search-input" v-model="params.keywords" :placeholder="lang.ticket_tips1" @search="initPage">
|
||||
<template #left>
|
||||
<van-dropdown-menu>
|
||||
<van-dropdown-item :title="params.ticket_type_id ? '': lang.type" @change="initPage"
|
||||
v-model="params.ticket_type_id" :options="calcTicketType">
|
||||
</van-dropdown-item>
|
||||
<van-dropdown-item @close="statusClose"
|
||||
:title="params.status.length !== 0 ? calcStatus : lang.ticket_label4" ref="statusDropdown">
|
||||
<van-cell v-for="(item, index) in ticketStatus" @click="clickStatus(item.id)">
|
||||
<template #title>
|
||||
<span
|
||||
:style="{'color': params.status.includes(item.id) ? 'var(--base-color-primary)' : ''}">{{item.name}}</span>
|
||||
</template>
|
||||
<template #right-icon v-if="params.status.includes(item.id)">
|
||||
<van-icon name="success" style="color: var(--base-color-primary);">
|
||||
</template>
|
||||
</van-cell>
|
||||
</van-dropdown-item>
|
||||
</van-dropdown-menu>
|
||||
</template>
|
||||
</van-search>
|
||||
<div class="ticket-box">
|
||||
<template v-if="dataList.length !== 0">
|
||||
<van-list v-model:loading="tableLoading" :finished="tableFinished" @load="getTicketList"
|
||||
:immediate-check="false">
|
||||
<div v-for="(item,index) in dataList" class="ticket-item" @click="itemReply(item)">
|
||||
<div class="ticket-title">
|
||||
<div class="title-box">
|
||||
<span>{{'#' + item.ticket_num + "-" + item.title }}</span>
|
||||
<span class="status-text"
|
||||
:style="{background:hexToRgb(item.color),color:item.color}">{{item.status}}</span>
|
||||
</div>
|
||||
<div class="op-box">
|
||||
<span class="op-text" @click.stop="itemUrge(item)"
|
||||
v-if="item.status_id !== 4">{{lang.ticket_btn4}}</span>
|
||||
<span class="op-text danger" @click.stop="itemClose(item)"
|
||||
v-if="item.status_id !== 4">{{lang.ticket_btn5}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ticket-des">
|
||||
<span class="ticket-lebal">{{lang.ticket_label2}}:</span>
|
||||
<span class="ticket-value">{{item.name || '--'}}</span>
|
||||
</div>
|
||||
<div class="ticket-des">
|
||||
<span class="ticket-lebal">{{lang.ticket_label3}}:</span>
|
||||
<span class="ticket-value" v-time="item.last_reply_time">{{item.last_reply_time || '--'}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</van-list>
|
||||
</template>
|
||||
<van-empty v-else></van-empty>
|
||||
</div>
|
||||
<van-sticky position="bottom">
|
||||
<div class="all-btn-box">
|
||||
<van-button @click="openAddTicket" type="primary" block>{{lang.ticket_btn1}}</van-button>
|
||||
</div>
|
||||
</van-sticky>
|
||||
</form>
|
||||
<!-- 新建工单 -->
|
||||
<van-popup v-model:show="isShowDialog" round closeable style="width: 90%;" @close="closeDialog">
|
||||
<div class="common-pop-box">
|
||||
<div class="common-pop-title">{{lang.ticket_btn1}}</div>
|
||||
<div class="common-pop-body">
|
||||
<van-form ref="ticketForm">
|
||||
<cur-select label-align="top" :label="lang.ticket_label2" cur-class="form-select"
|
||||
v-model:firpick="ticketData.ticket_type_id" :columns="ticketType" :rules="rules.ticket_type_id"
|
||||
:placeholder="lang.ticket_tips2" :columns-names=" { text: 'name', value: 'id' }" right-icon="arrow">
|
||||
</cur-select>
|
||||
<van-field label-align="top" class="form-select" v-model="ticketData.title" :rules="rules.title"
|
||||
:label="lang.ticket_label6" :placeholder="lang.ticket_tips9 ">
|
||||
</van-field>
|
||||
<cur-select label-align="top" :text="calcHostName" :label="lang.ticket_label7" cur-class="form-select"
|
||||
@change="chooseItem" v-model:firpick="ticketData.host_ids" :columns="hostList" :rules="rules.host_ids"
|
||||
:placeholder="lang.ticket_tips10" :columns-names=" { text: 'name', value: 'id' }" right-icon="arrow">
|
||||
<template #option="option">
|
||||
<div style="text-align: center;">
|
||||
<span v-if="!hasApp">
|
||||
{{option.product_name}}
|
||||
<template v-if="option.dedicate_ip || option.name">
|
||||
({{ option.dedicate_ip ? option.dedicate_ip : option.name ? option.name : "--"}})
|
||||
</template>
|
||||
</span>
|
||||
<span v-else
|
||||
:class="{'dis-item': option.isDue}">{{option.product_name + calcProductName(option)}}</span>
|
||||
<span v-if="calcShowRenew(option) && hasApp" class="renew"
|
||||
@click="handleRenew(option)">{{lang.ticket_label20}}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
</cur-select>
|
||||
<van-field label-align="top" type="textarea" class="form-select" v-model="ticketData.content"
|
||||
:rules="rules.content" :label="lang.ticket_label8" :placeholder="lang.ticket_label12" maxlength="3000">
|
||||
</van-field>
|
||||
<van-field class="wai-filed" :label="lang.ticket_label13" label-align="top" readonly>
|
||||
<template #input>
|
||||
<div class="code-select" @click="handeSelecFile">
|
||||
<van-icon name="plus"></van-icon>
|
||||
</div>
|
||||
<van-uploader :after-read="afterRead" ref="uploadRef" multiple accept="*" v-show="false">
|
||||
</van-uploader>
|
||||
</template>
|
||||
</van-field>
|
||||
<div class="file-box">
|
||||
<van-tag v-for="(item,index) in fileList" class="file-item" :show="true" closeable size="medium"
|
||||
type="primary" @close="handeDelFile(item,index)">
|
||||
{{item.file.name}}
|
||||
</van-tag>
|
||||
</div>
|
||||
</van-form>
|
||||
</div>
|
||||
<div class="common-pop-fotter">
|
||||
<van-button class="can-btn" block @click="closeDialog">{{lang.ticket_btn9}}</van-button>
|
||||
<van-button class="sub-btn" block type="primary" @click="onSubmit" :loading="loading">
|
||||
{{lang.ticket_btn6}}
|
||||
</van-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</van-popup>
|
||||
</div>
|
||||
|
||||
<!-- =======页面独有======= -->
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/api/ticket.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/lang/index.js"></script>
|
||||
<script src="/{$template_catalog}/template/{$themes}/components/vanSelect/curSelect.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/js/ticket.js"></script>
|
||||
@@ -0,0 +1,134 @@
|
||||
<!-- 页面引入样式位置 -->
|
||||
<link rel="stylesheet" href="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/css/ticketDetails.css">
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<div id="template" v-cloak class="tick-detail-page">
|
||||
<top-menu neednav class="top-nav">
|
||||
<template #left>
|
||||
<van-icon @click="goBack" class="left-icon" name="arrow-left"></van-icon>
|
||||
</template>
|
||||
<template #center>
|
||||
<div class="nav-title" @click="isShowMore = !isShowMore">
|
||||
{{lang.ticket_label17}}
|
||||
<p class="more-text">
|
||||
{{lang.ticket_text13}}
|
||||
<van-icon :name="isShowMore ? 'arrow-up' : 'arrow-down'"></van-icon>
|
||||
</p>
|
||||
</div>
|
||||
<div class="detail-box" v-show="isShowMore">
|
||||
<div class="info-item">
|
||||
<div class="info-item-label">{{lang.ticket_label9}}:</div>
|
||||
<div class="info-item-text">{{baseMsg.title}}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-label">{{lang.ticket_label2}}:</div>
|
||||
<div class="info-item-text">{{baseMsg.type}}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-label">{{lang.ticket_label10}}:</div>
|
||||
<div class="info-item-text" v-time="baseMsg.create_time">{{baseMsg.create_time}}</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-label">{{lang.ticket_label11}}:</div>
|
||||
<div class="info-item-text status-tag" :style="{background:hexToRgb(baseMsg.color),color:baseMsg.color}">
|
||||
{{baseMsg.status}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<div class="info-item-label">{{lang.ticket_label7}}:</div>
|
||||
<div class="info-item-text">
|
||||
<template v-if="baseMsg.hosts[0]">
|
||||
<a class="host-item a-text" v-for="(item,index) in baseMsg.hosts" :key="item.id"
|
||||
:href="`/productdetail.htm?id=${item.id}`">
|
||||
{{item.label}}
|
||||
<span v-if="index !== baseMsg.hosts.length - 1">、</span>
|
||||
</a>
|
||||
</template>
|
||||
<div v-else>--</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #right>
|
||||
<van-popover placement="bottom-end">
|
||||
<template #reference>
|
||||
<van-icon name="ellipsis"
|
||||
v-if="baseMsg.status != lang.ticket_text5 && ticketData.can_operate !== 0"></van-icon>
|
||||
</template>
|
||||
<div class="close-btn" @click="showClose">{{lang.ticket_btn7}}</div>
|
||||
</van-popover>
|
||||
</template>
|
||||
|
||||
</top-menu>
|
||||
<div class="ticket-content">
|
||||
<div class="reply-item" v-for="item in ticketData.replies" :key="item.create_time"
|
||||
:class="item.type === 'Client' ? 'is-user' : ''">
|
||||
<div class="reply-head">
|
||||
<div class="reply-name">
|
||||
{{item.type == 'Client'? item.client_name : item.admin_name}}
|
||||
</div>
|
||||
<div class="reply-time" v-time="item.create_time"></div>
|
||||
</div>
|
||||
<div class="reply-msg">
|
||||
<div class="reply-item-content">
|
||||
<div v-html="item.content" @click="hanldeImage($event)"></div>
|
||||
</div>
|
||||
<div class="reply-item-attachment" v-if="item.attachment.length > 0">
|
||||
<div class="reply-item-attachment-item van-ellipsis" v-for="(f,i) in item.attachment" :key="i"
|
||||
@click="downloadfile(f)">
|
||||
<span :title="f.name">
|
||||
<van-icon name="orders-o"></van-icon><span>{{f.name}}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ticket-bottom">
|
||||
<div class="bottom-top">
|
||||
<van-uploader :after-read="afterRead" ref="uploadRef" multiple accept="*" v-show="false"></van-uploader>
|
||||
<van-field type="textarea" rows="1" :autosize="sdasaasd" maxlength="3000" :placeholder="lang.ticket_label12"
|
||||
v-model="replyData.content">
|
||||
</van-field>
|
||||
<van-button icon="plus" plain type="primary" @click="handeSelecFile"></van-button>
|
||||
<van-button class="send-btn" @click="doReplyTicket" type="primary"
|
||||
:loading="sendBtnLoading">{{lang.ticket_btn8}}
|
||||
</van-button>
|
||||
</div>
|
||||
<div class="file-box" v-if="fileList.length !==0">
|
||||
<van-tag v-for="(item,index) in fileList" class="file-item" :show="true" closeable size="medium" type="primary"
|
||||
@close="handeDelFile(item,index)">
|
||||
{{item.file.name}}
|
||||
</van-tag>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 关闭工单弹窗 -->
|
||||
<van-popup v-model:show="visible" round closeable :style="{ width: '90%' }">
|
||||
<div class="common-pop-box">
|
||||
<div class="common-pop-title" style="color: var(--base-color-danger);">
|
||||
<van-icon name="warning-o"></van-icon>
|
||||
{{lang.ticket_title6}}
|
||||
</div>
|
||||
<div class="common-pop-body">
|
||||
{{lang.ticket_tips11}} {{baseMsg.title}},{{lang.ticket_tips12}}
|
||||
</div>
|
||||
<div class="common-pop-fotter">
|
||||
<van-button class="can-btn" @click="visible = false">{{lang.ticket_btn9}}</van-button>
|
||||
<van-button class="sub-btn" type="danger" @click="doCloseTicket"
|
||||
:loading="delLoading">{{ lang.ticket_btn6}}</van-button>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- =======页面引入js和相关组件位置======= -->
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/api/ticket.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/lang/index.js"></script>
|
||||
<script src="/{$template_catalog}/template/{$themes}/components/vanSelect/curSelect.js"></script>
|
||||
<script src="/{$template_catalog}/template/{$themes}/lib/xss.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/mobile/mfm201/js/ticketDetails.js"></script>
|
||||
@@ -0,0 +1,118 @@
|
||||
<!-- 页面独有样式 -->
|
||||
<link rel="stylesheet" href="/plugins/addon/idcsmart_ticket/template/clientarea/pc/default/css/addTicket.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- mounted之前显示 -->
|
||||
<div id="mainLoading">
|
||||
<div class="ddr ddr1"></div>
|
||||
<div class="ddr ddr2"></div>
|
||||
<div class="ddr ddr3"></div>
|
||||
<div class="ddr ddr4"></div>
|
||||
<div class="ddr ddr5"></div>
|
||||
</div>
|
||||
<div class="template add-ticket">
|
||||
<el-container>
|
||||
<aside-menu></aside-menu>
|
||||
<el-container>
|
||||
<top-menu></top-menu>
|
||||
<el-main>
|
||||
<!-- 自己的东西 -->
|
||||
<div class="main-card">
|
||||
<div class="top">
|
||||
<div class="top-l">
|
||||
<svg t="1749023272025" viewBox="0 0 1024 1024" version="1.1" @click="backTicket" class="top-img"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="20485" width="0.26rem" height="0.26rem">
|
||||
<path
|
||||
d="M672.426667 209.92H455.68v-136.533333l-295.253333 170.666666 295.253333 170.666667v-136.533333h215.04C819.2 278.186667 938.666667 397.653333 938.666667 546.133333s-119.466667 267.946667-267.946667 267.946667H52.906667c-18.773333 0-34.133333 15.36-34.133334 34.133333s15.36 34.133333 34.133334 34.133334h619.52c186.026667 0 336.213333-150.186667 336.213333-336.213334s-151.893333-336.213333-336.213333-336.213333z"
|
||||
p-id="20486" fill="var(--color-primary)"></path>
|
||||
</svg>
|
||||
{{lang.ticket_title2}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="top-line"></div>
|
||||
|
||||
<div class="main-form">
|
||||
<el-form ref="form" :model="ticketData" label-width="80px" :rules="rules">
|
||||
<el-form-item :label="lang.ticket_label2" prop="ticket_type_id">
|
||||
<!-- <el-select class="select-type" v-model="ticketData.admin_role_id" :placeholder="lang.ticket_tips8" @change="departmentChange">
|
||||
<el-option v-for="item in departmentList" :key="item.admin_role_id" :value="item.admin_role_id" :label="item.name"></el-option>
|
||||
</el-select> -->
|
||||
<el-select class="select-type" v-model="ticketData.ticket_type_id" :placeholder="lang.ticket_tips2">
|
||||
<el-option v-for="item in ticketType" :key="item.id" :value="item.id"
|
||||
:label="item.name"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<div class="title-host">
|
||||
<el-form-item :label="lang.ticket_label6" prop="title">
|
||||
<el-input class="select-title" v-model="ticketData.title" :placeholder="lang.ticket_tips9"
|
||||
maxlength="20">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item :label="lang.ticket_label7" prop="host_ids">
|
||||
<el-select filterable class="select-host" v-model="ticketData.host_ids" popper-class="host-dialog"
|
||||
:placeholder="lang.ticket_tips10" collapse-tags clearable @change="chooseItem">
|
||||
<el-option v-for="item in hostList" :key="item.id" :value="item.id"
|
||||
:label="item.product_name + '(' + (item.dedicate_ip || item.name) + ')'">
|
||||
<span v-if="!hasApp">
|
||||
{{item.product_name}}
|
||||
<template v-if="item.dedicate_ip || item.name">
|
||||
({{ item.dedicate_ip ? item.dedicate_ip : item.name ? item.name : "--"}})
|
||||
</template>
|
||||
</span>
|
||||
<span v-else
|
||||
:class="{'dis-item': item.isDue}">{{item.product_name + calcProductName(item)}}</span>
|
||||
<span v-if="calcShowRenew(item) && hasApp" class="renew"
|
||||
@click="handleRenew(item)">{{lang.ticket_label20}}
|
||||
</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<el-form-item :label="lang.ticket_label8" prop="content">
|
||||
<!-- <div>
|
||||
<textarea id="tiny" name="content" >{{ticketData.content}}</textarea>
|
||||
</div> -->
|
||||
<el-input class="msg-input" type="textarea" :autosize="{ minRows: 5, maxRows: 5}" resize=none
|
||||
maxlength="3000" :placeholder="lang.ticket_label12" v-model="ticketData.content">
|
||||
</el-input>
|
||||
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<el-upload ref="fileupload" class="upload-btn" action="/console/v1/upload"
|
||||
:headers="{Authorization: jwt}" :before-remove="beforeRemove" multiple :file-list="fileList"
|
||||
:on-success="handleSuccess">
|
||||
<el-button icon="el-icon-upload2">{{lang.ticket_label13}}</el-button>
|
||||
</el-upload>
|
||||
<div class="sub-btn" @click="onSubmit" v-loading="loading">{{lang.ticket_btn8}}</div>
|
||||
</div>
|
||||
<!-- <el-button type="primary" @click="onSubmit" v-loading="loading">确认</el-button> -->
|
||||
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<!-- 确认弹窗 -->
|
||||
<div class="renew-dialog">
|
||||
<el-dialog width="6.2rem" :visible.sync="sureDialog" :show-close=false @close="sureDialog = false">
|
||||
<div class="dialog-main">
|
||||
<p>{{lang.ticket_label23}}</p>
|
||||
<p>{{lang.ticket_label24}}</p>
|
||||
</div>
|
||||
<div class="dialog-footer">
|
||||
<div class="btn-ok" @click="subJump">{{lang.ticket_btn6}}</div>
|
||||
<div class="btn-no" @click="sureDialog = false">{{lang.ticket_btn9}}</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</el-container>
|
||||
</div>
|
||||
<!-- =======页面独有======= -->
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/pc/default/api/ticket.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/pc/default/lang/index.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/pc/default/js/addTicket.js"></script>
|
||||
<script src="/plugins/addon/idcsmart_ticket/template/clientarea/pc/default/js/tinymce/tinymce.min.js"></script>
|
||||
@@ -0,0 +1,57 @@
|
||||
// 工单统计
|
||||
function ticketStatistic(params) {
|
||||
return Axios.get(`/ticket/statistic`, { params });
|
||||
}
|
||||
// 工单列表
|
||||
function ticketList(params) {
|
||||
return Axios.get(`/ticket`, { params });
|
||||
}
|
||||
|
||||
// 工单类型
|
||||
function ticketType(params) {
|
||||
return Axios.get(`/ticket/type`, { params });
|
||||
}
|
||||
// 获取产品列表
|
||||
function hostAll(params) {
|
||||
return Axios.get(`/host`, { params });
|
||||
}
|
||||
|
||||
// 创建工单
|
||||
function createTicket(params) {
|
||||
return Axios.post(`/ticket`, params);
|
||||
}
|
||||
|
||||
// 关闭工单
|
||||
function closeTicket(params) {
|
||||
return Axios.put(`/ticket/${params.id}/close`, params);
|
||||
}
|
||||
// 催单
|
||||
function urgeTicket(params) {
|
||||
return Axios.put(`/ticket/${params.id}/urge`, params);
|
||||
}
|
||||
// 查看工单
|
||||
function ticketDetail(params) {
|
||||
return Axios.get(`/ticket/${params.id}`, { params });
|
||||
}
|
||||
|
||||
// 回复工单
|
||||
function replyTicket(params) {
|
||||
return Axios.post(`/ticket/${params.id}/reply`, params);
|
||||
}
|
||||
// 文件下载
|
||||
function downloadFile(params) {
|
||||
return Axios.post(`ticket/download`, params);
|
||||
}
|
||||
|
||||
// 工单状态
|
||||
function ticketStatus(params) {
|
||||
return Axios.get(`/ticket/status`, { params });
|
||||
}
|
||||
// 工单部门
|
||||
function department(params) {
|
||||
return Axios.get(`/ticket/department`, { params });
|
||||
}
|
||||
// 工单通知设置
|
||||
function getOrderConfig() {
|
||||
return Axios.get(`/ticket/config`);
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
.add-ticket .main-card .top {
|
||||
padding: 0;
|
||||
font-size: 0.3rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 0.2rem;
|
||||
}
|
||||
.add-ticket .main-card .top .top-l .top-img {
|
||||
cursor: pointer;
|
||||
margin-right: 0.25rem;
|
||||
}
|
||||
.add-ticket .main-card .top-line {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background: #E6E7EB;
|
||||
opacity: 1;
|
||||
}
|
||||
.add-ticket .main-card .main-form {
|
||||
margin-top: 0.47rem;
|
||||
}
|
||||
.add-ticket .main-card .main-form .el-input__inner {
|
||||
height: 0.46rem;
|
||||
}
|
||||
.add-ticket .main-card .main-form .title-host {
|
||||
display: flex;
|
||||
}
|
||||
.add-ticket .main-card .main-form .select-type {
|
||||
width: 5.2rem;
|
||||
margin-right: 0.1rem;
|
||||
}
|
||||
.add-ticket .main-card .main-form .select-title {
|
||||
width: 5.2rem;
|
||||
}
|
||||
.add-ticket .main-card .main-form .select-host {
|
||||
width: 5.2rem;
|
||||
}
|
||||
.add-ticket .main-card .main-form .sub-btn {
|
||||
width: 88px;
|
||||
height: 32px;
|
||||
background: var(--color-primary);
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
cursor: pointer;
|
||||
}
|
||||
.dis-item {
|
||||
color: #C0C4CC;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.el-main {
|
||||
overflow: unset;
|
||||
}
|
||||
.host-dialog .renew {
|
||||
color: var(--color-primary);
|
||||
margin-left: 0.05rem;
|
||||
}
|
||||
@media screen and (max-width: 750px) {
|
||||
.add-ticket .main-card .main-form .title-host {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
/* renew-dialog */
|
||||
.renew-dialog .el-dialog__body {
|
||||
padding-left: 0.8rem;
|
||||
padding-right: 0.8rem;
|
||||
}
|
||||
.renew-dialog .dialog-main {
|
||||
font-size: 0.15rem;
|
||||
}
|
||||
.renew-dialog .btn-ok,
|
||||
.renew-dialog .btn-no {
|
||||
cursor: pointer;
|
||||
}
|
||||
.renew-dialog .btn-no {
|
||||
margin-left: 0.2rem;
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
.add-ticket {
|
||||
.main-card {
|
||||
.top {
|
||||
padding: 0;
|
||||
font-size: 0.3rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: .2rem;
|
||||
|
||||
.top-l {
|
||||
.top-img {
|
||||
cursor: pointer;
|
||||
margin-right: .25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.top-line {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background: #E6E7EB;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.main-form {
|
||||
margin-top: .47rem;
|
||||
|
||||
.el-input__inner {
|
||||
height: .46rem;
|
||||
}
|
||||
|
||||
.title-host {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.select-type {
|
||||
width: 5.2rem;
|
||||
margin-right: .1rem;
|
||||
}
|
||||
|
||||
.select-title {
|
||||
width: 5.2rem;
|
||||
}
|
||||
|
||||
.select-host {
|
||||
width: 5.2rem;
|
||||
}
|
||||
|
||||
.sub-btn {
|
||||
width: 88px;
|
||||
height: 32px;
|
||||
background: var(--color-primary);
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
cursor: pointer;
|
||||
// float: right;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dis-item {
|
||||
color: #C0C4CC;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.el-main {
|
||||
overflow: unset;
|
||||
}
|
||||
|
||||
.host-dialog {
|
||||
.renew {
|
||||
color: var(--color-primary);
|
||||
margin-left: .05rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 750px) {
|
||||
.add-ticket .main-card .main-form .title-host {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
|
||||
/* renew-dialog */
|
||||
.renew-dialog {
|
||||
.el-dialog__body {
|
||||
padding-left: .8rem;
|
||||
padding-right: .8rem;
|
||||
}
|
||||
|
||||
.dialog-main {
|
||||
font-size: .15rem;
|
||||
}
|
||||
|
||||
.btn-ok,
|
||||
.btn-no {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.btn-no {
|
||||
margin-left: .2rem;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,564 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* 提示弹窗 */
|
||||
.el-message-box {
|
||||
width: 5.2rem;
|
||||
}
|
||||
|
||||
/* 取消number类型输入框的加减按钮 */
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none !important;
|
||||
}
|
||||
|
||||
.el-tooltip__popper {
|
||||
max-width: 50%
|
||||
}
|
||||
|
||||
/* 加载中 开始 */
|
||||
/* #account{
|
||||
display: none;
|
||||
} */
|
||||
#mainLoading {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: #FFFFFF;
|
||||
/* position: absolute;
|
||||
z-index: 9999; */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#mainLoading .ddr {
|
||||
width: 8px;
|
||||
height: 100px;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
background-color: #4890FF;
|
||||
animation: loading 1s infinite ease-in-out;
|
||||
/*animation:动画名称 持续时间 动画速度曲线 延迟 执行多少次 是否正反方向轮流播放*/
|
||||
}
|
||||
|
||||
#mainLoading .ddr2 {
|
||||
animation-delay: -0.9s;
|
||||
/*定义开始执行的地方,负号表示直接从第900ms开始执行*/
|
||||
}
|
||||
|
||||
#mainLoading .ddr3 {
|
||||
animation-delay: -0.8s;
|
||||
}
|
||||
|
||||
#mainLoading .ddr4 {
|
||||
animation-delay: -0.7s;
|
||||
}
|
||||
|
||||
#mainLoading .ddr5 {
|
||||
animation-delay: -0.6s;
|
||||
}
|
||||
|
||||
@keyframes loading {
|
||||
|
||||
0%,
|
||||
40%,
|
||||
100% {
|
||||
/*定义每帧的动作*/
|
||||
-webkit-transform: scaleY(0.5);
|
||||
}
|
||||
|
||||
20% {
|
||||
-webkit-transform: scaleY(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* 加载中结束 */
|
||||
|
||||
/* 表格 表头和每一行 的统一高度 */
|
||||
thead tr {
|
||||
height: .56rem;
|
||||
color: #757575;
|
||||
}
|
||||
|
||||
tbody .el-table__row {
|
||||
height: .6rem;
|
||||
}
|
||||
|
||||
.el-table .el-table__cell {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* #template {
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
} */
|
||||
|
||||
.el-container:nth-child(2) {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* header部分开始 */
|
||||
.el-header {
|
||||
/* position: sticky;
|
||||
position: -webkit-sticky; */
|
||||
position: fixed;
|
||||
width: calc(100% - 160px);
|
||||
top: 0;
|
||||
height: 40px !important;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 1px 4px rgba(21, 34, 50, 0.0800);
|
||||
opacity: 1;
|
||||
border-radius: 0px;
|
||||
font-size: 14px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.search-value {
|
||||
font-size: .14rem;
|
||||
color: rgba(4, 14, 52, 1);
|
||||
|
||||
}
|
||||
|
||||
.search-name {
|
||||
font-size: .12rem;
|
||||
color: rgba(150, 150, 163, 1);
|
||||
margin-bottom: .1rem;
|
||||
}
|
||||
|
||||
.header-left {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
/* margin-left: .46rem; */
|
||||
}
|
||||
|
||||
.header-left .el-input input {
|
||||
width: 4rem;
|
||||
}
|
||||
|
||||
.menu-img {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
.header-left .el-input input {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.header-right {
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
align-items: center;
|
||||
margin-right: .4rem;
|
||||
}
|
||||
|
||||
.right-item {
|
||||
margin-left: 24px;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
|
||||
.item-bell {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.item-cur {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
opacity: 0.81;
|
||||
|
||||
}
|
||||
|
||||
.el-dropdown {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.item-cur img {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.bell-num {
|
||||
position: absolute;
|
||||
right: -20%;
|
||||
top: -10%;
|
||||
z-index: 10;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: #F0142F;
|
||||
border-radius: 12px;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* header部分结束 */
|
||||
|
||||
/* 主体部分开始 */
|
||||
.el-main {
|
||||
padding-top: .83rem;
|
||||
padding-left: 2.1rem;
|
||||
padding-right: 1.02rem;
|
||||
|
||||
}
|
||||
|
||||
/* 图形验证码弹窗 开始*/
|
||||
.captcha-dialog .el-dialog__body {
|
||||
padding-left: .8rem;
|
||||
padding-right: .8rem;
|
||||
}
|
||||
|
||||
.dialog-title {
|
||||
font-size: 24px;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 24px;
|
||||
color: #171725;
|
||||
}
|
||||
|
||||
.dialog-form {
|
||||
margin-top: 0.3rem;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.dialog-form .el-input__inner {
|
||||
height: .46rem;
|
||||
}
|
||||
|
||||
.dialog-form img {
|
||||
height: .46rem;
|
||||
width: 1.11rem;
|
||||
margin-left: .1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.err-alert {
|
||||
margin-top: .2rem;
|
||||
padding-right: 1.21rem;
|
||||
}
|
||||
|
||||
.dialog-footer {
|
||||
margin-top: .4rem;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.dialog-footer .btn-ok {
|
||||
height: .46rem;
|
||||
width: 1.12rem;
|
||||
background: #0058FF;
|
||||
border-radius: 3px;
|
||||
color: #FFFFFF;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.dialog-footer .btn-no {
|
||||
height: .46rem;
|
||||
width: 1.12rem;
|
||||
background: #E7E7E7;
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* 图形验证码弹窗 结束*/
|
||||
|
||||
/* 换页相关开始 */
|
||||
.main-card {
|
||||
height: 100%;
|
||||
font-size: .14rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 1.5715;
|
||||
color: #171725;
|
||||
}
|
||||
|
||||
.myPage .el-pagination {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.el-pagination .page-total {
|
||||
margin: 0 auto 0 22px;
|
||||
font-size: 12px !important;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #757575;
|
||||
}
|
||||
|
||||
.el-pager .number {
|
||||
display: inline-block;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border: 1px solid #E6E7EB;
|
||||
margin-right: 8px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.el-pager .number:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
/* .el-input__inner {
|
||||
height: 32px !important;
|
||||
} */
|
||||
|
||||
.el-pager .active {
|
||||
background: #F4F7FC;
|
||||
border: 1px solid #0058FF;
|
||||
}
|
||||
|
||||
.el-pager li.active+li {
|
||||
border-left: 1px solid #E6E7EB;
|
||||
}
|
||||
|
||||
/* 换页相关结束 */
|
||||
|
||||
/* 主体部分结束 */
|
||||
|
||||
/* 左侧菜单开始 */
|
||||
.el-aside {
|
||||
position: sticky;
|
||||
position: -webkit-sticky;
|
||||
top: 0;
|
||||
background: #1E41C9;
|
||||
height: 100vh;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.menu-list-top,
|
||||
.menu-list-bottom {
|
||||
margin-top: .86rem;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.menu-list-top>.menu-active,
|
||||
.menu-list-bottom>.menu-active {
|
||||
border-left: 3px solid #FFFF;
|
||||
opacity: 1;
|
||||
margin-left: 0.04rem;
|
||||
}
|
||||
|
||||
.ali-logo {
|
||||
/* height: .25rem; */
|
||||
width: 1.15rem;
|
||||
/* margin-top: .12rem; */
|
||||
margin: .12rem auto 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.line {
|
||||
width: 1.23rem;
|
||||
height: 0px;
|
||||
border: 1px solid #FFFFFF;
|
||||
opacity: 0.1;
|
||||
margin: .9rem auto;
|
||||
}
|
||||
|
||||
.menu-item {
|
||||
padding-left: .18rem;
|
||||
margin-left: 0.07rem;
|
||||
margin-bottom: .24rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
color: #FFFFFF;
|
||||
opacity: 0.6;
|
||||
|
||||
}
|
||||
|
||||
.item-img {
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.item-text {
|
||||
line-height: 20px;
|
||||
margin-left: .2rem;
|
||||
}
|
||||
|
||||
/* 左侧菜单结束 */
|
||||
|
||||
/* message */
|
||||
.el-message {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.el-button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* el弹窗自带底部按钮 */
|
||||
.el-message-box__btns>.el-button {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.el-message-box__btns {
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
/* 表格 */
|
||||
tr>td {
|
||||
padding-left: 20px !important;
|
||||
}
|
||||
|
||||
th {
|
||||
padding-left: 20px !important;
|
||||
}
|
||||
|
||||
.com-search .el-input__suffix {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
||||
@media screen and (max-width: 750px) {
|
||||
.el-main {
|
||||
padding-top: 1.66rem;
|
||||
padding-left: .3rem;
|
||||
padding-right: .3rem;
|
||||
}
|
||||
|
||||
.el-header {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* 左侧菜单 */
|
||||
.el-aside {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* 顶部展示 */
|
||||
.el-header {
|
||||
height: 1rem !important;
|
||||
}
|
||||
|
||||
.menu-img {
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
height: .56rem;
|
||||
}
|
||||
|
||||
.header-right {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.right-item img {
|
||||
width: .56rem;
|
||||
height: .56rem;
|
||||
}
|
||||
|
||||
/* 左侧弹窗菜单 */
|
||||
.drawer-menu {
|
||||
background: #1E41C9;
|
||||
font-size: .32rem;
|
||||
}
|
||||
|
||||
.drawer-menu-top {
|
||||
width: 3.8rem;
|
||||
height: 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.drawer-menu-logo {
|
||||
width: 2rem;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.drawer-menu-list-top {
|
||||
margin-top: .86rem;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.drawer-menu-list-top>.drawer-menu-active {
|
||||
border-left: 3px solid #FFFF;
|
||||
opacity: 1;
|
||||
margin-left: 0.04rem;
|
||||
}
|
||||
|
||||
.drawer-menu-item {
|
||||
padding-left: .41rem;
|
||||
margin-left: 0.07rem;
|
||||
margin-bottom: .5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
color: #FFFFFF;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.drawer-item-img {
|
||||
height: .38rem;
|
||||
}
|
||||
|
||||
.drawer-item-text {
|
||||
line-height: 20px;
|
||||
margin-left: .41rem;
|
||||
}
|
||||
|
||||
.el-input__inner {
|
||||
height: .8rem;
|
||||
font-size: .3rem;
|
||||
}
|
||||
|
||||
.dialog-title {
|
||||
font-size: .32rem;
|
||||
}
|
||||
|
||||
.el-tabs__item {
|
||||
font-size: .34rem;
|
||||
margin-bottom: .15rem;
|
||||
margin-top: .51rem;
|
||||
}
|
||||
|
||||
.el-icon-search {
|
||||
font-size: .4rem;
|
||||
}
|
||||
|
||||
.el-button {
|
||||
font-size: .34rem;
|
||||
}
|
||||
|
||||
.right-item {
|
||||
margin-left: .3rem;
|
||||
}
|
||||
|
||||
.el-divider__text {
|
||||
font-size: .28rem;
|
||||
}
|
||||
|
||||
/* .el-input .el-input__clear {
|
||||
font-size: .4rem;
|
||||
} */
|
||||
.select-input .el-input--suffix {
|
||||
width: 1.86rem;
|
||||
}
|
||||
|
||||
.el-message-box__message {
|
||||
font-size: .32rem;
|
||||
}
|
||||
|
||||
}
|
||||
386
plugins/addon/example/template/clientarea/pc/default/css/common/viewer.min.css
vendored
Normal file
@@ -0,0 +1,386 @@
|
||||
/*!
|
||||
* Viewer.js v0.3.1
|
||||
* https://github.com/fengyuanchen/viewerjs
|
||||
*
|
||||
* Copyright (c) 2015-2016 Fengyuan Chen
|
||||
* Released under the MIT license
|
||||
*
|
||||
* Date: 2016-02-02T11:35:36.273Z
|
||||
*/
|
||||
.viewer-container,
|
||||
.viewer-navbar {
|
||||
background-color: #000;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.viewer-canvas,
|
||||
.viewer-container,
|
||||
.viewer-footer,
|
||||
.viewer-player {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0
|
||||
}
|
||||
|
||||
.viewer-button,
|
||||
.viewer-canvas,
|
||||
.viewer-container,
|
||||
.viewer-footer,
|
||||
.viewer-list,
|
||||
.viewer-navbar,
|
||||
.viewer-open,
|
||||
.viewer-title,
|
||||
.viewer-toolbar,
|
||||
.viewer-toolbar>li {
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.viewer-close:before,
|
||||
.viewer-flip-horizontal:before,
|
||||
.viewer-flip-vertical:before,
|
||||
.viewer-fullscreen-exit:before,
|
||||
.viewer-fullscreen:before,
|
||||
.viewer-next:before,
|
||||
.viewer-one-to-one:before,
|
||||
.viewer-play:before,
|
||||
.viewer-prev:before,
|
||||
.viewer-reset:before,
|
||||
.viewer-rotate-left:before,
|
||||
.viewer-rotate-right:before,
|
||||
.viewer-zoom-in:before,
|
||||
.viewer-zoom-out:before {
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
display: block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
color: transparent;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAAAUCAYAAABWOyJDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAQPSURBVHic7Zs/iFxVFMa/0U2UaJGksUgnIVhYxVhpjDbZCBmLdAYECxsRFBTUamcXUiSNncgKQbSxsxH8gzAP3FU2jY0kKKJNiiiIghFlccnP4p3nPCdv3p9778vsLOcHB2bfveeb7955c3jvvNkBIMdxnD64a94GHMfZu3iBcRynN7zAOI7TG15gHCeeNUkr8zaxG2lbYDYsdgMbktBsP03jdQwljSXdtBhLOmtjowC9Mg9L+knSlcD8TNKpSA9lBpK2JF2VdDSR5n5J64m0qli399hNFMUlpshQii5jbXTbHGviB0nLNeNDSd9VO4A2UdB2fp+x0eCnaXxWXGA2X0au/3HgN9P4LFCjIANOJdrLr0zzZ+BEpNYDwKbpnQMeAw4m8HjQtM6Z9qa917zPQwFr3M5KgA6J5rTJCdFZJj9/lyvGhsDvwFNVuV2MhhjrK6b9bFiE+j1r87eBl4HDwCF7/U/k+ofAX5b/EXBv5JoLMuILzf3Ap6Z3EzgdqHMCuF7hcQf4HDgeoHnccncqdK/TvSDWffFXI/exICY/xZyqc6XLWF1UFZna4gJ7q8BsRvgd2/xXpo6P+D9dfT7PpECtA3cnWPM0GXGFZh/wgWltA+cDNC7X+AP4GzjZQe+k5dRxuYPeiuXU7e1qwLpDz7dFjXKRaSwuMLvAlG8zZlG+YmiK1HoFqT7wP2z+4Q45TfEGcMt01xLoNZEBTwRqD4BLpnMLeC1A41UmVxsXgXeBayV/Wx20rpTyrpnWRft7p6O/FdqzGrDukPNtkaMoMo3FBdBSQMOnYBCReyf05s126fU9ytfX98+mY54Kxnp7S9K3kj6U9KYdG0h6UdLbkh7poFXMfUnSOyVvL0h6VtIXHbS6nOP+s/Zm9mvyXW1uuC9ohZ72E9uDmXWLJOB1GxsH+DxPftsB8B6wlGDN02TAkxG6+4D3TWsbeC5CS8CDFce+AW500LhhOW2020TRjK3b21HEmgti9m0RonxbdMZeVzV+/4tF3cBpP7E9mKHNL5q8h5g0eYsCMQz0epq8gQrwMXAgcs0FGXGFRcB9wCemF9PkbYqM/Bas7fxLwNeJPdTdpo4itQti8lPMqTpXuozVRVXPpbHI3KkNTB1NfkL81j2mvhDp91HgV9MKuRIqrykj3WPq4rHyL+axj8/qGPmTqi6F9YDlHOvJU6oYcTsh/TYSzWmTE6JT19CtLTJt32D6CmHe0eQn1O8z5AXgT4sx4Vcu0/EQecMydB8z0hUWkTd2t4CrwNEePqMBcAR4mrBbwyXLPWJa8zrXmmLEhNBmfpkuY2102xxrih+pb+ieAb6vGhuA97UcJ5KR8gZ77K+99xxeYBzH6Q3/Z0fHcXrDC4zjOL3hBcZxnN74F+zlvXFWXF9PAAAAAElFTkSuQmCC);
|
||||
background-repeat: no-repeat
|
||||
}
|
||||
|
||||
.viewer-zoom-in:before {
|
||||
content: 'Zoom In';
|
||||
background-position: 0 0
|
||||
}
|
||||
|
||||
.viewer-zoom-out:before {
|
||||
content: 'Zoom Out';
|
||||
background-position: -20px 0
|
||||
}
|
||||
|
||||
.viewer-one-to-one:before {
|
||||
content: 'One to One';
|
||||
background-position: -40px 0
|
||||
}
|
||||
|
||||
.viewer-reset:before {
|
||||
content: 'Reset';
|
||||
background-position: -60px 0
|
||||
}
|
||||
|
||||
.viewer-prev:before {
|
||||
content: 'Previous';
|
||||
background-position: -80px 0
|
||||
}
|
||||
|
||||
.viewer-play:before {
|
||||
content: 'Play';
|
||||
background-position: -100px 0
|
||||
}
|
||||
|
||||
.viewer-next:before {
|
||||
content: 'Next';
|
||||
background-position: -120px 0
|
||||
}
|
||||
|
||||
.viewer-rotate-left:before {
|
||||
content: 'Rotate Left';
|
||||
background-position: -140px 0
|
||||
}
|
||||
|
||||
.viewer-rotate-right:before {
|
||||
content: 'Rotate Right';
|
||||
background-position: -160px 0
|
||||
}
|
||||
|
||||
.viewer-flip-horizontal:before {
|
||||
content: 'Flip Horizontal';
|
||||
background-position: -180px 0
|
||||
}
|
||||
|
||||
.viewer-flip-vertical:before {
|
||||
content: 'Flip Vertical';
|
||||
background-position: -200px 0
|
||||
}
|
||||
|
||||
.viewer-fullscreen:before {
|
||||
content: 'Enter Full Screen';
|
||||
background-position: -220px 0
|
||||
}
|
||||
|
||||
.viewer-fullscreen-exit:before {
|
||||
content: 'Exit Full Screen';
|
||||
background-position: -240px 0
|
||||
}
|
||||
|
||||
.viewer-close:before {
|
||||
content: 'Close';
|
||||
background-position: -260px 0
|
||||
}
|
||||
|
||||
.viewer-container {
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
background-color: rgba(0, 0, 0, .5);
|
||||
direction: ltr !important;
|
||||
-ms-touch-action: none;
|
||||
touch-action: none;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
-webkit-touch-callout: none
|
||||
}
|
||||
|
||||
.viewer-container ::-moz-selection,
|
||||
.viewer-container::-moz-selection {
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.viewer-container ::selection,
|
||||
.viewer-container::selection {
|
||||
background-color: transparent
|
||||
}
|
||||
|
||||
.viewer-container img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-width: 0 !important;
|
||||
max-width: none !important;
|
||||
height: auto;
|
||||
min-height: 0 !important;
|
||||
max-height: none !important
|
||||
}
|
||||
|
||||
.viewer-player,
|
||||
.viewer-tooltip {
|
||||
display: none;
|
||||
position: absolute
|
||||
}
|
||||
|
||||
.viewer-canvas {
|
||||
position: absolute;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.viewer-canvas>img {
|
||||
width: auto;
|
||||
max-width: 90% !important;
|
||||
height: auto;
|
||||
margin: 15px auto
|
||||
}
|
||||
|
||||
.viewer-footer {
|
||||
position: absolute;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.viewer-navbar {
|
||||
background-color: rgba(0, 0, 0, .5)
|
||||
}
|
||||
|
||||
.viewer-list {
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
height: 50px;
|
||||
margin: 0;
|
||||
padding: 1px 0
|
||||
}
|
||||
|
||||
.viewer-list>li {
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
width: 30px;
|
||||
height: 50px;
|
||||
cursor: pointer;
|
||||
opacity: .5;
|
||||
color: transparent;
|
||||
filter: alpha(opacity=50)
|
||||
}
|
||||
|
||||
.viewer-list>li+li {
|
||||
margin-left: 1px
|
||||
}
|
||||
|
||||
.viewer-list>.viewer-active {
|
||||
opacity: 1;
|
||||
filter: alpha(opacity=100)
|
||||
}
|
||||
|
||||
.viewer-player {
|
||||
top: 0;
|
||||
cursor: none;
|
||||
background-color: #000
|
||||
}
|
||||
|
||||
.viewer-player>img {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0
|
||||
}
|
||||
|
||||
.viewer-toolbar {
|
||||
width: 280px;
|
||||
margin: 0 auto 5px;
|
||||
padding: 3px 0
|
||||
}
|
||||
|
||||
.viewer-toolbar>li {
|
||||
float: left;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
cursor: pointer;
|
||||
border-radius: 50%;
|
||||
background-color: #000;
|
||||
background-color: rgba(0, 0, 0, .5)
|
||||
}
|
||||
|
||||
.viewer-toolbar>li:hover {
|
||||
background-color: #000;
|
||||
background-color: rgba(0, 0, 0, .8)
|
||||
}
|
||||
|
||||
.viewer-toolbar>li:before {
|
||||
margin: 2px
|
||||
}
|
||||
|
||||
.viewer-toolbar>li+li {
|
||||
margin-left: 1px
|
||||
}
|
||||
|
||||
.viewer-toolbar>.viewer-play {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin-top: -3px;
|
||||
margin-bottom: -3px
|
||||
}
|
||||
|
||||
.viewer-toolbar>.viewer-play:before {
|
||||
margin: 5px
|
||||
}
|
||||
|
||||
.viewer-tooltip {
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 50px;
|
||||
height: 20px;
|
||||
margin-top: -10px;
|
||||
margin-left: -25px;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
border-radius: 10px;
|
||||
background-color: #000;
|
||||
background-color: rgba(0, 0, 0, .8)
|
||||
}
|
||||
|
||||
.viewer-title {
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
display: inline-block;
|
||||
max-width: 90%;
|
||||
margin: 0 5% 5px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
opacity: .8;
|
||||
color: #ccc;
|
||||
filter: alpha(opacity=80)
|
||||
}
|
||||
|
||||
.viewer-title:hover {
|
||||
opacity: 1;
|
||||
filter: alpha(opacity=100)
|
||||
}
|
||||
|
||||
.viewer-button {
|
||||
position: absolute;
|
||||
top: -40px;
|
||||
right: -40px;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
cursor: pointer;
|
||||
border-radius: 50%;
|
||||
background-color: #000;
|
||||
background-color: rgba(0, 0, 0, .5)
|
||||
}
|
||||
|
||||
.viewer-button:before {
|
||||
position: absolute;
|
||||
bottom: 15px;
|
||||
left: 15px
|
||||
}
|
||||
|
||||
.viewer-fixed {
|
||||
position: fixed
|
||||
}
|
||||
|
||||
.viewer-show {
|
||||
display: block
|
||||
}
|
||||
|
||||
.viewer-hide {
|
||||
display: none
|
||||
}
|
||||
|
||||
.viewer-invisible {
|
||||
visibility: hidden
|
||||
}
|
||||
|
||||
.viewer-move {
|
||||
cursor: move;
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: grab
|
||||
}
|
||||
|
||||
.viewer-fade {
|
||||
opacity: 0;
|
||||
filter: alpha(opacity=0)
|
||||
}
|
||||
|
||||
.viewer-in {
|
||||
opacity: 1;
|
||||
filter: alpha(opacity=100)
|
||||
}
|
||||
|
||||
.viewer-transition {
|
||||
-webkit-transition: all .3s ease-out;
|
||||
-o-transition: all .3s ease-out;
|
||||
transition: all .3s ease-out
|
||||
}
|
||||
|
||||
@media (max-width:767px) {
|
||||
.viewer-hide-xs-down {
|
||||
display: none
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width:991px) {
|
||||
.viewer-hide-sm-down {
|
||||
display: none
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width:1199px) {
|
||||
.viewer-hide-md-down {
|
||||
display: none
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
.main-card .no-enter {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: auto;
|
||||
width: 100%;
|
||||
height: 0.6rem;
|
||||
}
|
||||
.main-card .main-card-title {
|
||||
font-size: 0.28rem;
|
||||
line-height: 0.28rem;
|
||||
}
|
||||
.main-card .main-card-top {
|
||||
margin-top: 0.4rem;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.main-card .main-card-top .top-item {
|
||||
width: 3.32rem;
|
||||
height: 1.63rem;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.main-card .main-card-top .top-item .top-item-text {
|
||||
font-size: 0.16rem;
|
||||
line-height: 0.16rem;
|
||||
color: #8692B0;
|
||||
margin-top: 0.2rem;
|
||||
margin-left: 0.2rem;
|
||||
}
|
||||
.main-card .main-card-top .top-item .top-item-num {
|
||||
font-size: 0.28rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: bold;
|
||||
line-height: 0.28rem;
|
||||
color: #1E2736;
|
||||
margin-top: 0.2rem;
|
||||
margin-left: 0.2rem;
|
||||
}
|
||||
.main-card .order-des {
|
||||
margin-top: 0.3rem;
|
||||
min-height: 1rem;
|
||||
padding: 0.1rem;
|
||||
border-radius: 0.03rem;
|
||||
border: 1px solid #e6e7eb;
|
||||
box-sizing: border-box;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.main-card .order-des * {
|
||||
all: revert;
|
||||
}
|
||||
.main-card .content_searchbar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: 0.3rem;
|
||||
}
|
||||
.main-card .content_searchbar .new-ticket-btn {
|
||||
width: 1.12rem;
|
||||
height: 0.46rem;
|
||||
background: var(--color-primary);
|
||||
border-radius: 3px;
|
||||
font-size: 0.16rem;
|
||||
font-weight: 400;
|
||||
line-height: 0.46rem;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .el-input__inner {
|
||||
height: 0.46rem;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .el-input__suffix {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .select-input {
|
||||
width: 3.2rem;
|
||||
margin-right: 0.1rem;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .el-button {
|
||||
background: var(--color-primary);
|
||||
color: #FFF;
|
||||
}
|
||||
.main-card .tabledata {
|
||||
margin-top: 0.2rem;
|
||||
padding-bottom: 0.23rem;
|
||||
}
|
||||
.main-card .tabledata tbody tr:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
.main-card .tabledata .status-text {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
border-radius: 3px;
|
||||
height: 26px;
|
||||
line-height: 26px;
|
||||
padding: 0 8px;
|
||||
font-size: 0.13rem;
|
||||
}
|
||||
.main-card .tabledata .more-operation {
|
||||
width: 0.26rem;
|
||||
height: 0.3rem;
|
||||
color: var(--color-primary);
|
||||
font-size: 0.3rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.main-card .create-ticket .el-dialog {
|
||||
margin-top: 5vh !important;
|
||||
}
|
||||
.main-card .create-ticket .el-dialog__body {
|
||||
padding-left: 0.8rem;
|
||||
padding-right: 0.8rem;
|
||||
}
|
||||
.main-card .create-ticket .el-dialog__body .el-form-item__label {
|
||||
font-size: 0.16rem;
|
||||
}
|
||||
.main-card .create-ticket .el-dialog__body .dialog-title {
|
||||
margin-bottom: 0.3rem;
|
||||
}
|
||||
.main-card .create-ticket .el-dialog__body .upload-btn .el-icon-upload2 {
|
||||
font-size: 0.12rem;
|
||||
margin-right: 0.02rem;
|
||||
}
|
||||
.el-popover {
|
||||
min-width: 0.5rem !important;
|
||||
}
|
||||
.el-popover .operation {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.el-popover .operation .operation-item {
|
||||
margin-top: 0.05rem;
|
||||
margin-bottom: 0.05rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
@media screen and (max-width: 750px) {
|
||||
.select-input .el-input--suffix {
|
||||
width: auto;
|
||||
}
|
||||
.main-card .tabledata .more-operation {
|
||||
font-size: 0.6rem;
|
||||
height: auto;
|
||||
}
|
||||
.main-card .content_searchbar {
|
||||
display: block;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .el-input__inner {
|
||||
height: auto;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .select-input {
|
||||
width: auto;
|
||||
}
|
||||
.main-card .content_searchbar .searchbar .el-button {
|
||||
height: 20px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.main-card .content_searchbar .new-ticket-btn {
|
||||
width: 2.12rem;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
.main-card {
|
||||
.no-enter {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: auto;
|
||||
width: 100%;
|
||||
height: .6rem;
|
||||
}
|
||||
|
||||
.main-card-title {
|
||||
font-size: .28rem;
|
||||
line-height: .28rem;
|
||||
}
|
||||
|
||||
.main-card-top {
|
||||
margin-top: .4rem;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
|
||||
.top-item {
|
||||
width: 3.32rem;
|
||||
height: 1.63rem;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
|
||||
.top-item-text {
|
||||
font-size: .16rem;
|
||||
line-height: .16rem;
|
||||
color: #8692B0;
|
||||
margin-top: .2rem;
|
||||
margin-left: .2rem;
|
||||
}
|
||||
|
||||
.top-item-num {
|
||||
font-size: .28rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: bold;
|
||||
line-height: .28rem;
|
||||
color: #1E2736;
|
||||
margin-top: .2rem;
|
||||
margin-left: .2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.order-des {
|
||||
margin-top: .3rem;
|
||||
min-height: 1rem;
|
||||
padding: .1rem;
|
||||
border-radius: .03rem;
|
||||
border: 1px solid #e6e7eb;
|
||||
box-sizing: border-box;
|
||||
// white-space: pre-wrap;
|
||||
// max-height: 1.3rem;
|
||||
overflow-y: auto;
|
||||
// line-height: 2;
|
||||
|
||||
// 恢复li 和 p 标签的默认样式
|
||||
* {
|
||||
all: revert;
|
||||
}
|
||||
|
||||
// ul,
|
||||
// li,
|
||||
// ol {
|
||||
// all: revert;
|
||||
// }
|
||||
|
||||
// p {
|
||||
// all: revert;
|
||||
// }
|
||||
}
|
||||
|
||||
.content_searchbar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: .3rem;
|
||||
|
||||
.new-ticket-btn {
|
||||
width: 1.12rem;
|
||||
height: .46rem;
|
||||
background: var(--color-primary);
|
||||
border-radius: 3px;
|
||||
font-size: .16rem;
|
||||
font-weight: 400;
|
||||
line-height: .46rem;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.searchbar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.el-input__inner {
|
||||
height: .46rem;
|
||||
}
|
||||
|
||||
.el-input__suffix {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.select-input {
|
||||
width: 3.2rem;
|
||||
margin-right: .1rem;
|
||||
}
|
||||
|
||||
.el-button {
|
||||
background: var(--color-primary);
|
||||
color: #FFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tabledata {
|
||||
margin-top: .2rem;
|
||||
padding-bottom: 0.23rem;
|
||||
|
||||
tbody tr:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.status-text {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
border-radius: 3px;
|
||||
height: 26px;
|
||||
line-height: 26px;
|
||||
padding: 0 8px;
|
||||
font-size: .13rem;
|
||||
}
|
||||
|
||||
|
||||
.more-operation {
|
||||
width: .26rem;
|
||||
height: .3rem;
|
||||
color: var(--color-primary);
|
||||
font-size: .3rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.create-ticket {
|
||||
.el-dialog {
|
||||
margin-top: 5vh !important;
|
||||
}
|
||||
|
||||
.el-dialog__body {
|
||||
padding-left: .8rem;
|
||||
padding-right: .8rem;
|
||||
|
||||
.el-form-item__label {
|
||||
font-size: .16rem;
|
||||
}
|
||||
|
||||
.dialog-title {
|
||||
margin-bottom: .3rem;
|
||||
}
|
||||
|
||||
.upload-btn {
|
||||
.el-icon-upload2 {
|
||||
font-size: .12rem;
|
||||
margin-right: .02rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更多操作 弹出 样式
|
||||
.el-popover {
|
||||
min-width: .5rem !important;
|
||||
|
||||
.operation {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.operation-item {
|
||||
margin-top: .05rem;
|
||||
margin-bottom: .05rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 750px) {
|
||||
.select-input .el-input--suffix {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.main-card .tabledata .more-operation {
|
||||
font-size: 0.6rem;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.main-card {
|
||||
.content_searchbar {
|
||||
display: block;
|
||||
|
||||
.searchbar {
|
||||
flex-wrap: wrap;
|
||||
|
||||
.el-input__inner {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.select-input {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.el-button {
|
||||
height: 20px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.new-ticket-btn {
|
||||
width: 2.12rem;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,263 @@
|
||||
.ticket-details .main-card .top {
|
||||
padding: 0;
|
||||
font-size: 0.3rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .top .top-l .top-img {
|
||||
cursor: pointer;
|
||||
margin-right: 0.25rem;
|
||||
}
|
||||
.ticket-details .main-card .top-line {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background: #E6E7EB;
|
||||
opacity: 1;
|
||||
}
|
||||
.ticket-details .main-card .card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-bottom: 0.65rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-title {
|
||||
font-size: 0.2rem;
|
||||
line-height: 0.25rem;
|
||||
color: #171725;
|
||||
margin-top: 0.42rem;
|
||||
margin-bottom: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-main {
|
||||
height: 100%;
|
||||
background: #FFFFFF;
|
||||
border: 1px solid #E6E7EB;
|
||||
opacity: 1;
|
||||
border-radius: 3px;
|
||||
padding-left: 0.2rem;
|
||||
padding-bottom: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-main .close-btn {
|
||||
width: 88px;
|
||||
height: 32px;
|
||||
border: 1px solid var(--color-danger);
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: var(--color-danger);
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
margin-top: 0.2rem;
|
||||
margin-right: 0.3rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-main .card-main-item {
|
||||
margin-top: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-main .card-main-item .main-item-label {
|
||||
font-size: 0.12rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 0.17rem;
|
||||
color: #8692B0;
|
||||
margin-bottom: 0.04rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-main .card-main-item .main-item-text {
|
||||
font-size: 0.14rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: 0.2rem;
|
||||
color: #171725;
|
||||
}
|
||||
.ticket-details .main-card .card .card-main .card-main-item .host-item-text {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
.ticket-details .main-card .card .card-main .card-main-item .host-item-text .host-item {
|
||||
cursor: pointer;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main {
|
||||
padding: 0;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .tox-statusbar__branding {
|
||||
display: none;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg {
|
||||
box-sizing: border-box;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding-bottom: 0.17rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg img {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .reply-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client {
|
||||
align-items: flex-end;
|
||||
padding-right: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-top {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 0.25rem;
|
||||
align-items: baseline;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-top .reply-time {
|
||||
font-size: 0.12rem;
|
||||
line-height: 0.13rem;
|
||||
color: #8692B0;
|
||||
margin-right: 0.04rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-top .reply-name {
|
||||
font-size: 0.15rem;
|
||||
line-height: 0.16rem;
|
||||
color: #1E2736;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-top .reply-img {
|
||||
width: 0.32rem;
|
||||
height: 0.32rem;
|
||||
margin-left: 0.05rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-top .reply-img img {
|
||||
width: 0.32rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-content {
|
||||
max-width: 90%;
|
||||
padding: 0.16rem;
|
||||
background: #E3FBFA;
|
||||
font-size: 14px;
|
||||
color: #4E5259;
|
||||
margin-top: 0.16rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-attachment {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 0.15rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Client .reply-item-attachment .reply-item-attachment-item {
|
||||
margin-left: 0.2rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin {
|
||||
align-items: flex-start;
|
||||
padding-left: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-top {
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
margin-top: 0.25rem;
|
||||
align-items: baseline;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-top .reply-time {
|
||||
font-size: 0.12rem;
|
||||
color: #8692B0;
|
||||
margin-left: 0.04rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-top .reply-name {
|
||||
font-size: 0.15rem;
|
||||
color: #1E2736;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-top .reply-img {
|
||||
width: 0.32rem;
|
||||
height: 0.32rem;
|
||||
margin-right: 0.05rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-top .reply-img img {
|
||||
width: 0.32rem;
|
||||
height: 0.32rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-content {
|
||||
max-width: 90%;
|
||||
padding: 0.16rem;
|
||||
background: #EEF4FF;
|
||||
font-size: 14px;
|
||||
color: #4E5259;
|
||||
margin-top: 0.16rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-attachment {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 0.15rem;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-old-msg .Admin .reply-item-attachment .reply-item-attachment-item {
|
||||
margin-right: 0.2rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-now-msg .tox-tinymce {
|
||||
height: 300px !important;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-now-msg .msg-input {
|
||||
width: 100%;
|
||||
}
|
||||
.ticket-details .main-card .card .talk-main .main-now-msg .msg-input .el-textarea__inner {
|
||||
border-radius: 0%;
|
||||
border-left: none;
|
||||
border-bottom: none;
|
||||
border-right: none;
|
||||
}
|
||||
.ticket-details .main-card .card .card-footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: 0.2rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-footer .upload-btn .el-icon-upload2 {
|
||||
font-size: 0.12rem;
|
||||
margin-right: 0.02rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-footer .upload-btn .btn-text {
|
||||
height: 0.32rem;
|
||||
line-height: 0.32rem;
|
||||
}
|
||||
.ticket-details .main-card .card .card-footer .send-btn {
|
||||
width: 0.88rem;
|
||||
height: 0.32rem;
|
||||
font-size: 0.14rem;
|
||||
line-height: 0.14rem;
|
||||
background: var(--color-primary);
|
||||
opacity: 1;
|
||||
border-radius: 3px;
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.del-dialog .el-dialog__body {
|
||||
padding-left: 0.8rem;
|
||||
padding-right: 0.8rem;
|
||||
}
|
||||
.del-dialog .dialog-main {
|
||||
margin-top: 0.4rem;
|
||||
}
|
||||
.del-dialog .dialog-main .el-input__inner {
|
||||
height: 0.52rem;
|
||||
}
|
||||
.del-dialog .dialog-main .label {
|
||||
font-size: 0.16rem;
|
||||
color: #1E2736;
|
||||
margin-bottom: 0.1rem;
|
||||
}
|
||||
.del-dialog .dialog-main .label:not(:first-child) {
|
||||
margin-top: 0.2rem;
|
||||
}
|
||||
.del-dialog .dialog-footer .btn-no {
|
||||
margin-left: 0.12rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.del-dialog .dialog-footer .btn-ok {
|
||||
cursor: pointer;
|
||||
}
|
||||
.el-main {
|
||||
overflow: unset;
|
||||
}
|
||||
#viewer {
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
@media screen and (max-width: 750px) {
|
||||
.ticket-details .main-card .card .card-footer .send-btn {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,341 @@
|
||||
.ticket-details {
|
||||
.main-card {
|
||||
.top {
|
||||
padding: 0;
|
||||
font-size: 0.3rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: .2rem;
|
||||
|
||||
.top-l {
|
||||
.top-img {
|
||||
cursor: pointer;
|
||||
margin-right: .25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.top-line {
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background: #E6E7EB;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-bottom: .65rem;
|
||||
|
||||
.card-title {
|
||||
font-size: .2rem;
|
||||
line-height: .25rem;
|
||||
color: #171725;
|
||||
margin-top: .42rem;
|
||||
margin-bottom: .2rem;
|
||||
}
|
||||
|
||||
.card-main {
|
||||
height: 100%;
|
||||
background: #FFFFFF;
|
||||
border: 1px solid #E6E7EB;
|
||||
opacity: 1;
|
||||
border-radius: 3px;
|
||||
padding-left: .2rem;
|
||||
padding-bottom: .2rem;
|
||||
|
||||
.close-btn {
|
||||
width: 88px;
|
||||
height: 32px;
|
||||
border: 1px solid var(--color-danger);
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: var(--color-danger);
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
margin-top: .2rem;
|
||||
margin-right: .3rem;
|
||||
}
|
||||
|
||||
.card-main-item {
|
||||
margin-top: .2rem;
|
||||
|
||||
.main-item-label {
|
||||
font-size: .12rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: .17rem;
|
||||
color: #8692B0;
|
||||
margin-bottom: .04rem;
|
||||
}
|
||||
|
||||
.main-item-text {
|
||||
font-size: .14rem;
|
||||
font-family: PingFang SC;
|
||||
font-weight: 400;
|
||||
line-height: .2rem;
|
||||
color: #171725;
|
||||
}
|
||||
|
||||
.host-item-text {
|
||||
color: var(--color-primary);
|
||||
|
||||
.host-item {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.talk-main {
|
||||
padding: 0;
|
||||
|
||||
.tox-statusbar__branding {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.main-old-msg {
|
||||
// height: 5.38rem;
|
||||
box-sizing: border-box;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
padding-bottom: .17rem;
|
||||
|
||||
img {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.reply-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
}
|
||||
|
||||
// 用户回复
|
||||
.Client {
|
||||
align-items: flex-end;
|
||||
padding-right: .2rem;
|
||||
|
||||
.reply-item-top {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: .25rem;
|
||||
align-items: baseline;
|
||||
|
||||
.reply-time {
|
||||
font-size: .12rem;
|
||||
line-height: .13rem;
|
||||
color: #8692B0;
|
||||
margin-right: .04rem;
|
||||
}
|
||||
|
||||
.reply-name {
|
||||
font-size: .15rem;
|
||||
line-height: .16rem;
|
||||
color: #1E2736;
|
||||
}
|
||||
|
||||
.reply-img {
|
||||
width: .32rem;
|
||||
height: .32rem;
|
||||
margin-left: .05rem;
|
||||
|
||||
img {
|
||||
width: .32rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.reply-item-content {
|
||||
max-width: 90%;
|
||||
padding: .16rem;
|
||||
background: #E3FBFA;
|
||||
font-size: 14px;
|
||||
color: #4E5259;
|
||||
margin-top: .16rem;
|
||||
// white-space: pre-line;
|
||||
}
|
||||
|
||||
.reply-item-attachment {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: .15rem;
|
||||
|
||||
.reply-item-attachment-item {
|
||||
margin-left: .2rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 管理员回复
|
||||
.Admin {
|
||||
align-items: flex-start;
|
||||
padding-left: .2rem;
|
||||
|
||||
.reply-item-top {
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
margin-top: .25rem;
|
||||
align-items: baseline;
|
||||
|
||||
.reply-time {
|
||||
font-size: .12rem;
|
||||
color: #8692B0;
|
||||
margin-left: .04rem;
|
||||
}
|
||||
|
||||
.reply-name {
|
||||
font-size: .15rem;
|
||||
color: #1E2736;
|
||||
}
|
||||
|
||||
.reply-img {
|
||||
width: .32rem;
|
||||
height: .32rem;
|
||||
margin-right: .05rem;
|
||||
|
||||
img {
|
||||
width: .32rem;
|
||||
height: .32rem;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.reply-item-content {
|
||||
// width: 6.95rem;
|
||||
max-width: 90%;
|
||||
padding: .16rem;
|
||||
background: #EEF4FF;
|
||||
font-size: 14px;
|
||||
color: #4E5259;
|
||||
margin-top: .16rem;
|
||||
}
|
||||
|
||||
.reply-item-attachment {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: .15rem;
|
||||
|
||||
.reply-item-attachment-item {
|
||||
margin-right: .2rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main-now-msg {
|
||||
.tox-tinymce {
|
||||
height: 300px !important;
|
||||
}
|
||||
|
||||
.msg-input {
|
||||
width: 100%;
|
||||
|
||||
.el-textarea__inner {
|
||||
border-radius: 0%;
|
||||
border-left: none;
|
||||
border-bottom: none;
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: .2rem;
|
||||
|
||||
.upload-btn {
|
||||
|
||||
.el-icon-upload2 {
|
||||
font-size: .12rem;
|
||||
margin-right: .02rem;
|
||||
}
|
||||
|
||||
.btn-text {
|
||||
height: .32rem;
|
||||
line-height: .32rem;
|
||||
}
|
||||
}
|
||||
|
||||
.send-btn {
|
||||
width: .88rem;
|
||||
height: .32rem;
|
||||
font-size: .14rem;
|
||||
line-height: .14rem;
|
||||
background: var(--color-primary);
|
||||
opacity: 1;
|
||||
border-radius: 3px;
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.del-dialog {
|
||||
|
||||
// 弹窗相关
|
||||
.el-dialog__body {
|
||||
padding-left: .8rem;
|
||||
padding-right: .8rem;
|
||||
}
|
||||
|
||||
.dialog-main {
|
||||
margin-top: .4rem;
|
||||
|
||||
.el-input__inner {
|
||||
height: .52rem;
|
||||
|
||||
}
|
||||
|
||||
.label {
|
||||
font-size: .16rem;
|
||||
color: #1E2736;
|
||||
margin-bottom: .1rem;
|
||||
|
||||
&:not(:first-child) {
|
||||
margin-top: .2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dialog-footer {
|
||||
.btn-no {
|
||||
margin-left: .12rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.btn-ok {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.el-main {
|
||||
overflow: unset;
|
||||
}
|
||||
|
||||
#viewer {
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 750px) {
|
||||
.ticket-details .main-card .card .card-footer .send-btn {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 763 B |
|
After Width: | Height: | Size: 756 B |
|
After Width: | Height: | Size: 666 B |
|
After Width: | Height: | Size: 708 B |
|
After Width: | Height: | Size: 570 B |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 426 B |
|
After Width: | Height: | Size: 255 B |
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 349 B |
|
After Width: | Height: | Size: 379 B |
|
After Width: | Height: | Size: 342 B |
|
After Width: | Height: | Size: 247 B |
|
After Width: | Height: | Size: 392 B |
|
After Width: | Height: | Size: 322 B |
|
After Width: | Height: | Size: 419 B |
|
After Width: | Height: | Size: 189 B |
|
After Width: | Height: | Size: 611 B |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 480 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,306 @@
|
||||
(function (window, undefined) {
|
||||
var old_onload = window.onload;
|
||||
window.onload = function () {
|
||||
const template = document.getElementsByClassName("template")[0];
|
||||
Vue.prototype.lang = Object.assign(window.lang, window.plugin_lang);
|
||||
new Vue({
|
||||
components: {
|
||||
asideMenu,
|
||||
topMenu,
|
||||
},
|
||||
created() {
|
||||
// 获取通用信息
|
||||
this.getCommonData();
|
||||
this.getHostList();
|
||||
this.getTicketType();
|
||||
// this.getDepartment()
|
||||
},
|
||||
mounted() {
|
||||
// this.initTemplate()
|
||||
this.addons_js_arr = JSON.parse(
|
||||
document.querySelector("#addons_js").getAttribute("addons_js")
|
||||
); // 插件列表
|
||||
const arr = this.addons_js_arr.map((item) => {
|
||||
return item.name;
|
||||
});
|
||||
if (arr.includes("IdcsmartAppMarket")) {
|
||||
this.hasApp = true;
|
||||
}
|
||||
},
|
||||
updated() {
|
||||
// // 关闭loading
|
||||
document.getElementById("mainLoading").style.display = "none";
|
||||
document.getElementsByClassName("template")[0].style.display = "block";
|
||||
},
|
||||
destroyed() {},
|
||||
data() {
|
||||
return {
|
||||
commonData: {},
|
||||
ticketData: {
|
||||
title: "",
|
||||
ticket_type_id: "",
|
||||
host_ids: "",
|
||||
content: "",
|
||||
attachment: [],
|
||||
// 工单部门id
|
||||
admin_role_id: "",
|
||||
},
|
||||
ticketType: [],
|
||||
hostList: [],
|
||||
departmentList: [],
|
||||
rules: {
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
message: lang.ticket_tips9,
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
ticket_type_id: [
|
||||
{
|
||||
required: true,
|
||||
message: lang.ticket_tips2,
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
content: [
|
||||
{
|
||||
required: true,
|
||||
message: lang.ticket_tips6,
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
jwt: `Bearer ${localStorage.jwt}`,
|
||||
loading: false,
|
||||
fileList: [],
|
||||
hostId: "",
|
||||
sureDialog: false,
|
||||
hasApp: false,
|
||||
};
|
||||
},
|
||||
filters: {
|
||||
formateTime(time) {
|
||||
if (time && time !== 0) {
|
||||
return formateDate(time * 1000);
|
||||
} else {
|
||||
return "--";
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
calcShowRenew() {
|
||||
return (item) => {
|
||||
const curTime = parseInt(new Date().getTime() / 1000);
|
||||
if (
|
||||
item.due_time > 0 &&
|
||||
(item.due_time <= curTime ||
|
||||
item.due_time - curTime <= item.renewal_first_day_time)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
},
|
||||
calcProductName() {
|
||||
return (item) => {
|
||||
const curTime = parseInt(new Date().getTime() / 1000);
|
||||
if (item.due_time > 0) {
|
||||
if (item.due_time <= curTime) {
|
||||
// 已到期
|
||||
return `(${lang.ticket_label21})`;
|
||||
} else if (
|
||||
item.due_time - curTime <=
|
||||
item.renewal_first_day_time
|
||||
) {
|
||||
// 即将到期
|
||||
return `(${item.name.slice(0, 8)}......${item.name.slice(-5)})${
|
||||
lang.ticket_label22
|
||||
}`;
|
||||
} else {
|
||||
return `(${item.name})`;
|
||||
}
|
||||
} else {
|
||||
return `(${item.name})`;
|
||||
}
|
||||
};
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
handleRenew(item) {
|
||||
this.hostId = item.parent_host_id || item.id;
|
||||
this.sureDialog = true;
|
||||
},
|
||||
subJump() {
|
||||
this.sureDialog = false;
|
||||
window.open(`/productdetail.htm?id=${this.hostId}`);
|
||||
},
|
||||
chooseItem(val) {
|
||||
const cur = this.hostList.filter((el) => el.id === val);
|
||||
if (this.hasApp && cur.length > 0 && cur[0].isDue) {
|
||||
this.ticketData.host_ids = "";
|
||||
}
|
||||
},
|
||||
// 获取通用配置
|
||||
getCommonData() {
|
||||
this.commonData = JSON.parse(
|
||||
localStorage.getItem("common_set_before")
|
||||
);
|
||||
document.title =
|
||||
this.commonData.website_name + "-" + lang.ticket_label14;
|
||||
},
|
||||
// 返回工单列表页面
|
||||
backTicket() {
|
||||
location.href = "ticket.htm";
|
||||
},
|
||||
// 载入富文本
|
||||
initTemplate() {
|
||||
tinymce.init({
|
||||
selector: "#tiny",
|
||||
language_url: "/tinymce/langs/zh_CN.js",
|
||||
language: "zh_CN",
|
||||
min_height: 400,
|
||||
width: "100%",
|
||||
plugins:
|
||||
"link lists image code table colorpicker textcolor wordcount contextmenu fullpage",
|
||||
toolbar:
|
||||
"bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image fullpage code | removeformat",
|
||||
images_upload_url: "/console/v1/upload",
|
||||
convert_urls: false,
|
||||
images_upload_handler: this.handlerAddImg,
|
||||
});
|
||||
},
|
||||
// 富文本图片上传
|
||||
handlerAddImg(blobInfo, success, failure) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const formData = new FormData();
|
||||
formData.append("file", blobInfo.blob());
|
||||
axios
|
||||
.post("/console/v1/upload", formData, {
|
||||
headers: {
|
||||
Authorization: "Bearer" + " " + localStorage.getItem("jwt"),
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
const json = {};
|
||||
if (res.status !== 200) {
|
||||
failure("HTTP Error: " + res.data.msg);
|
||||
return;
|
||||
}
|
||||
json.location = res.data.data?.image_url;
|
||||
if (!json || typeof json.location !== "string") {
|
||||
failure("Error:" + res.data.msg);
|
||||
return;
|
||||
}
|
||||
success(json.location);
|
||||
});
|
||||
});
|
||||
},
|
||||
// 新建工单确认点击
|
||||
onSubmit() {
|
||||
// this.ticketData.content = tinyMCE.activeEditor.getContent()
|
||||
// console.log(this.ticketData);
|
||||
this.$refs["form"].validate((valid) => {
|
||||
if (valid && !this.loading) {
|
||||
this.loading = true;
|
||||
const params = { ...this.ticketData };
|
||||
params.host_ids = params.host_ids ? [params.host_ids] : [];
|
||||
createTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status == 200) {
|
||||
const id = res.data.data.id;
|
||||
location.href = `ticketDetails.htm?id=${id}`;
|
||||
}
|
||||
this.loading = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.loading = false;
|
||||
this.$message.error(error.data.msg);
|
||||
});
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取工单类型
|
||||
getTicketType() {
|
||||
ticketType().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketType = res.data.data.list;
|
||||
// this.ticketData.ticket_type_id = this.ticketType[0]?.id
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取产品列表
|
||||
getHostList() {
|
||||
const params = {
|
||||
keywords: "",
|
||||
status: "",
|
||||
page: 1,
|
||||
limit: 1000,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
scene: "ticket",
|
||||
};
|
||||
hostAll(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
[].filter;
|
||||
this.hostList = res.data.data.list
|
||||
.filter((item) => item.status !== "Deleted")
|
||||
.map((item) => {
|
||||
const curTime = parseInt(new Date().getTime() / 1000);
|
||||
if (item.due_time > 0 && item.due_time <= curTime) {
|
||||
item.isDue = true;
|
||||
} else {
|
||||
item.isDue = false;
|
||||
}
|
||||
return item;
|
||||
});
|
||||
// .filter((item) => {
|
||||
// return item.status === "Active";
|
||||
// });
|
||||
}
|
||||
});
|
||||
},
|
||||
getDepartment() {
|
||||
department().then((res) => {
|
||||
if (res.data.status == 200) {
|
||||
this.departmentList = res.data.data.list;
|
||||
this.ticketData.admin_role_id =
|
||||
this.departmentList[0].admin_role_id;
|
||||
this.getTicketType(this.ticketData.admin_role_id);
|
||||
}
|
||||
});
|
||||
},
|
||||
departmentChange(e) {
|
||||
this.ticketData.ticket_type_id = "";
|
||||
if (e) {
|
||||
this.getTicketType(e);
|
||||
}
|
||||
},
|
||||
beforeRemove(file, fileList) {
|
||||
// 获取到删除的 save_name
|
||||
let save_name = file.response.data.save_name;
|
||||
this.ticketData.attachment = this.ticketData.attachment.filter(
|
||||
(item) => {
|
||||
return item != save_name;
|
||||
}
|
||||
);
|
||||
},
|
||||
// 上传文件相关
|
||||
handleSuccess(response, file, fileList) {
|
||||
// console.log(response);
|
||||
if (response.status != 200) {
|
||||
this.$message.error(response.msg);
|
||||
// 清空上传框
|
||||
let uploadFiles = this.$refs["fileupload"].uploadFiles;
|
||||
let length = uploadFiles.length;
|
||||
uploadFiles.splice(length - 1, length);
|
||||
} else {
|
||||
this.ticketData.attachment.push(response.data.save_name);
|
||||
}
|
||||
},
|
||||
},
|
||||
}).$mount(template);
|
||||
typeof old_onload == "function" && old_onload();
|
||||
};
|
||||
})(window);
|
||||
@@ -0,0 +1,305 @@
|
||||
(function (window, undefined) {
|
||||
var old_onload = window.onload;
|
||||
window.onload = function () {
|
||||
const template = document.getElementsByClassName("template")[0];
|
||||
Vue.prototype.lang = Object.assign(window.lang, window.plugin_lang);
|
||||
new Vue({
|
||||
components: {
|
||||
asideMenu,
|
||||
topMenu,
|
||||
pagination,
|
||||
},
|
||||
created() {
|
||||
// 获取通用信息
|
||||
this.getCommonData();
|
||||
this.getOrderConfig();
|
||||
// 获取工单类型
|
||||
this.getTicketType();
|
||||
// 获取工单状态
|
||||
this.getTicketStatus();
|
||||
// 获取关联产品列表
|
||||
this.getHostList();
|
||||
},
|
||||
mounted() {},
|
||||
updated() {
|
||||
// // 关闭loading
|
||||
document.getElementById("mainLoading").style.display = "none";
|
||||
document.getElementsByClassName("template")[0].style.display = "block";
|
||||
},
|
||||
destroyed() {},
|
||||
data() {
|
||||
return {
|
||||
// 分页
|
||||
params: {
|
||||
page: 1,
|
||||
limit: 20,
|
||||
pageSizes: [20, 50, 100],
|
||||
total: 200,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
keywords: "",
|
||||
status: [3],
|
||||
ticket_type_id: "",
|
||||
},
|
||||
// 通用数据
|
||||
commonData: {},
|
||||
// 表格数据
|
||||
dataList: [],
|
||||
// 表格加载
|
||||
tableLoading: false,
|
||||
// 创建工单弹窗是否显示
|
||||
isShowDialog: false,
|
||||
// 创建工单弹窗 数据
|
||||
formData: {
|
||||
title: "",
|
||||
ticket_type_id: "",
|
||||
host_ids: [],
|
||||
content: "",
|
||||
attachment: [],
|
||||
},
|
||||
// 表单错误信息显示
|
||||
errText: "",
|
||||
// 工单类别
|
||||
ticketType: [],
|
||||
ticketStatus: [],
|
||||
// 关联产品列表
|
||||
hostList: [],
|
||||
createBtnLoading: false,
|
||||
fileList: [],
|
||||
configObj: {
|
||||
ticket_notice_open: 0,
|
||||
ticket_notice_description: "",
|
||||
},
|
||||
};
|
||||
},
|
||||
filters: {
|
||||
formateTime(time) {
|
||||
if (time && time !== 0) {
|
||||
return formateDate(time * 1000);
|
||||
} else {
|
||||
return "--";
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async getOrderConfig() {
|
||||
try {
|
||||
const res = await getOrderConfig();
|
||||
this.configObj = res.data.data;
|
||||
} catch (error) {}
|
||||
},
|
||||
// 每页展示数改变
|
||||
sizeChange(e) {
|
||||
this.params.limit = e;
|
||||
this.params.page = 1;
|
||||
// 获取列表
|
||||
this.getTicketList();
|
||||
},
|
||||
// 当前页改变
|
||||
currentChange(e) {
|
||||
this.params.page = e;
|
||||
this.getTicketList();
|
||||
},
|
||||
clearKey() {
|
||||
this.params.keywords = "";
|
||||
this.inputChange();
|
||||
},
|
||||
inputChange() {
|
||||
this.params.page = 1;
|
||||
this.getTicketList();
|
||||
},
|
||||
// 获取通用配置
|
||||
getCommonData() {
|
||||
this.commonData = JSON.parse(
|
||||
localStorage.getItem("common_set_before")
|
||||
);
|
||||
document.title =
|
||||
this.commonData.website_name + "-" + lang.ticket_label15;
|
||||
},
|
||||
// 获取工单列表
|
||||
getTicketList() {
|
||||
this.tableLoading = true;
|
||||
ticketList(this.params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.dataList = res.data.data.list;
|
||||
this.params.total = res.data.data.count;
|
||||
}
|
||||
this.tableLoading = false;
|
||||
});
|
||||
},
|
||||
// 展示创建弹窗 并初始化弹窗数据
|
||||
showCreateDialog() {
|
||||
location.href = `addTicket.htm`;
|
||||
},
|
||||
handelMore() {},
|
||||
// 验证表单调用接口执行 创建工单
|
||||
doCreateTicket() {
|
||||
let isPass = true;
|
||||
this.errText = "";
|
||||
const formData = this.formData;
|
||||
if (!formData.title) {
|
||||
isPass = false;
|
||||
this.errText = lang.ticket_tips4;
|
||||
}
|
||||
|
||||
if (!formData.ticket_type_id) {
|
||||
isPass = false;
|
||||
this.errText = lang.ticket_tips2;
|
||||
}
|
||||
if (!formData.host_ids) {
|
||||
isPass = false;
|
||||
this.errText = lang.ticket_tips5;
|
||||
}
|
||||
if (!formData.content) {
|
||||
isPass = false;
|
||||
this.errText = lang.ticket_tips6;
|
||||
}
|
||||
|
||||
if (isPass) {
|
||||
// 调用创建工单接口
|
||||
const params = formData;
|
||||
this.createBtnLoading = true;
|
||||
createTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
// 关闭弹窗
|
||||
this.isShowDialog = false;
|
||||
// 刷新工单列表
|
||||
this.getTicketList();
|
||||
}
|
||||
this.delFile();
|
||||
this.createBtnLoading = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.errText = error.data.msg;
|
||||
this.createBtnLoading = false;
|
||||
});
|
||||
}
|
||||
},
|
||||
closeDialog() {
|
||||
this.delFile();
|
||||
this.isShowDialog = false;
|
||||
},
|
||||
hexToRgb(hex) {
|
||||
const color = hex.split("#")[1];
|
||||
const r = parseInt(color.substring(0, 2), 16);
|
||||
const g = parseInt(color.substring(2, 4), 16);
|
||||
const b = parseInt(color.substring(4, 6), 16);
|
||||
return `rgba(${r},${g},${b},0.12)`;
|
||||
},
|
||||
// 获取工单类型
|
||||
getTicketType() {
|
||||
ticketType().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketType = res.data.data.list;
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取工单状态列表
|
||||
getTicketStatus() {
|
||||
ticketStatus().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.params.status = [3];
|
||||
this.ticketStatus = res.data.data.list;
|
||||
res.data.data.list.forEach((item) => {
|
||||
if (item.status === 0) {
|
||||
this.params.status.push(item.id);
|
||||
}
|
||||
});
|
||||
// 获取工单列表
|
||||
this.getTicketList();
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取产品列表
|
||||
getHostList() {
|
||||
const params = {
|
||||
keywords: "",
|
||||
status: "",
|
||||
page: 1,
|
||||
limit: 1000,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
};
|
||||
hostAll(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.hostList = res.data.data.list;
|
||||
}
|
||||
});
|
||||
},
|
||||
// 跳转工单详情
|
||||
itemReply(record) {
|
||||
const id = record.id;
|
||||
location.href = `ticketDetails.htm?id=${id}`;
|
||||
},
|
||||
// 关闭工单
|
||||
itemClose(record) {
|
||||
const id = record.id;
|
||||
const params = {
|
||||
id,
|
||||
};
|
||||
// 调用关闭工单接口 给出结果
|
||||
closeTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.$message({
|
||||
message: res.data.msg,
|
||||
type: "success",
|
||||
});
|
||||
this.getTicketList();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
this.$message.error(err.data.msg);
|
||||
});
|
||||
},
|
||||
// 催单
|
||||
itemUrge(record) {
|
||||
const nowDate = new Date().getTime();
|
||||
const last_reply_time = record.last_urge_time * 1000;
|
||||
if (nowDate - last_reply_time < 1000 * 60 * 15) {
|
||||
this.$message.success(lang.ticket_label16);
|
||||
return;
|
||||
}
|
||||
const id = record.id;
|
||||
const params = { id };
|
||||
// 调用催单接口 给出结果
|
||||
urgeTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.$message.success(res.data.msg);
|
||||
this.getTicketList();
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
this.$message.error(err.data.msg);
|
||||
});
|
||||
},
|
||||
// 上传文件相关
|
||||
handleSuccess(response, file, fileList) {
|
||||
if (response.status === 200) {
|
||||
this.formData.attachment.push(response.data.save_name);
|
||||
}
|
||||
},
|
||||
beforeRemove(file, fileList) {
|
||||
// 获取到删除的 save_name
|
||||
let save_name = file.response.data.save_name;
|
||||
this.formData.attachment = this.formData.attachment.filter((item) => {
|
||||
return item != save_name;
|
||||
});
|
||||
},
|
||||
// 删除上传文件的文件
|
||||
delFile() {
|
||||
let uploadFiles = this.$refs["fileupload"].uploadFiles;
|
||||
let length = uploadFiles.length;
|
||||
uploadFiles.splice(0, length);
|
||||
},
|
||||
titleClick(record) {
|
||||
const id = record.id;
|
||||
location.href = `ticketDetails.htm?id=${id}`;
|
||||
},
|
||||
},
|
||||
}).$mount(template);
|
||||
typeof old_onload == "function" && old_onload();
|
||||
};
|
||||
})(window);
|
||||
@@ -0,0 +1,414 @@
|
||||
(function (window, undefined) {
|
||||
var old_onload = window.onload;
|
||||
window.onload = function () {
|
||||
const template = document.getElementsByClassName("template")[0];
|
||||
Vue.prototype.lang = Object.assign(window.lang, window.plugin_lang);
|
||||
new Vue({
|
||||
components: {
|
||||
asideMenu,
|
||||
topMenu,
|
||||
},
|
||||
created() {
|
||||
// 获取通用信息
|
||||
this.getCommonData();
|
||||
|
||||
// 获取工单详情
|
||||
this.getDetails();
|
||||
this.autoRefresh();
|
||||
},
|
||||
mounted() {
|
||||
// this.initTemplate()
|
||||
this.initViewer();
|
||||
},
|
||||
updated() {
|
||||
// // 关闭loading
|
||||
document.getElementById("mainLoading").style.display = "none";
|
||||
document.getElementsByClassName("template")[0].style.display = "block";
|
||||
},
|
||||
destroyed() {},
|
||||
data() {
|
||||
return {
|
||||
commonData: {},
|
||||
id: null,
|
||||
ticketData: {},
|
||||
// 工单类别
|
||||
ticketTypeList: [],
|
||||
// 关联产品列表
|
||||
hostList: [],
|
||||
jwt: `Bearer ${localStorage.jwt}`,
|
||||
// 基本信息
|
||||
baseMsg: {
|
||||
title: "",
|
||||
type: "",
|
||||
hosts: "",
|
||||
status: "",
|
||||
},
|
||||
replyData: {
|
||||
id: null,
|
||||
content: "",
|
||||
attachment: [],
|
||||
},
|
||||
sendBtnLoading: false,
|
||||
fileList: [],
|
||||
visible: false,
|
||||
delLoading: false,
|
||||
isClose: false,
|
||||
viewer: null,
|
||||
preImg: "",
|
||||
};
|
||||
},
|
||||
filters: {
|
||||
formateTime(time) {
|
||||
if (time && time !== 0) {
|
||||
return formateDate(time * 1000);
|
||||
} else {
|
||||
return "--";
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
autoRefresh() {
|
||||
setInterval(() => {
|
||||
this.getDetails();
|
||||
}, 1000 * 60);
|
||||
},
|
||||
// 获取通用配置
|
||||
getCommonData() {
|
||||
this.commonData = JSON.parse(
|
||||
localStorage.getItem("common_set_before")
|
||||
);
|
||||
document.title =
|
||||
this.commonData.website_name + "-" + lang.ticket_label17;
|
||||
},
|
||||
// 返回工单列表页面
|
||||
backTicket() {
|
||||
location.href = "ticket.htm";
|
||||
},
|
||||
// 获取url中的id参数然后获取工单详情信息
|
||||
getDetails() {
|
||||
let url = window.location.href;
|
||||
let getqyinfo = url.split("?")[1];
|
||||
let getqys = new URLSearchParams("?" + getqyinfo);
|
||||
let id = getqys.get("id");
|
||||
this.id = id;
|
||||
const params = {
|
||||
id,
|
||||
};
|
||||
// 调用查看工单接口
|
||||
ticketDetail(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketData = res.data.data.ticket;
|
||||
const replies = res.data.data.ticket.replies;
|
||||
const arrEntities = {
|
||||
lt: "<",
|
||||
gt: ">",
|
||||
nbsp: " ",
|
||||
amp: "&",
|
||||
quot: '"',
|
||||
};
|
||||
this.ticketData.replies = replies.reverse().map((item) => {
|
||||
item.content = filterXSS(
|
||||
item.content.replace(
|
||||
/&(lt|gt|nbsp|amp|quot);/gi,
|
||||
function (all, t) {
|
||||
return arrEntities[t];
|
||||
}
|
||||
)
|
||||
).replace(/&(lt|gt|nbsp|amp|quot);/gi, function (all, t) {
|
||||
return arrEntities[t];
|
||||
});
|
||||
item.content = item.content.replaceAll(
|
||||
'http-equiv="refresh"',
|
||||
""
|
||||
);
|
||||
return item;
|
||||
});
|
||||
// this.$nextTick(() => {
|
||||
// this.toBottom()
|
||||
// })
|
||||
// 工单类型
|
||||
this.getTicketType();
|
||||
// 当前状态
|
||||
this.baseMsg.status = this.ticketData.status;
|
||||
// 标题
|
||||
this.baseMsg.title =
|
||||
"#" + this.ticketData.ticket_num + "-" + this.ticketData.title;
|
||||
|
||||
this.baseMsg.create_time = this.ticketData.create_time;
|
||||
// 关联产品
|
||||
this.getHostList();
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取工单类型
|
||||
getTicketType() {
|
||||
ticketType().then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.ticketTypeList = res.data.data.list;
|
||||
this.ticketTypeList.map((item) => {
|
||||
if (item.id == this.ticketData.ticket_type_id) {
|
||||
this.baseMsg.type = item.name;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
// 获取产品列表
|
||||
getHostList() {
|
||||
const params = {
|
||||
keywords: "",
|
||||
status: "",
|
||||
page: 1,
|
||||
limit: 1000,
|
||||
orderby: "id",
|
||||
sort: "desc",
|
||||
};
|
||||
hostAll(params).then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
this.hostList = res.data.data.list;
|
||||
// let names = ""
|
||||
|
||||
let hosts = [];
|
||||
this.ticketData.host_ids.forEach((element) => {
|
||||
this.hostList.forEach((item) => {
|
||||
if (item.id == element) {
|
||||
let hostitem = {
|
||||
id: item.id,
|
||||
label: item.product_name + " (" + item.name + ")",
|
||||
};
|
||||
|
||||
hosts.push(hostitem);
|
||||
|
||||
// names += item.product_name + " (" + item.name + ")" + ","
|
||||
}
|
||||
});
|
||||
});
|
||||
// names = names.slice(0, -1)
|
||||
this.baseMsg.hosts = hosts;
|
||||
}
|
||||
});
|
||||
},
|
||||
// 回复工单
|
||||
doReplyTicket() {
|
||||
if (this.sendBtnLoading) return;
|
||||
if (!this.replyData.content) {
|
||||
this.$message.warning(lang.ticket_label18);
|
||||
return;
|
||||
}
|
||||
// 将content中的 /n 替换成 <br>
|
||||
this.replyData.content = this.replyData.content.replace(
|
||||
/\n/g,
|
||||
"<br>"
|
||||
);
|
||||
const params = {
|
||||
...this.replyData,
|
||||
id: this.id,
|
||||
// content: tinyMCE.activeEditor.getContent()
|
||||
};
|
||||
this.sendBtnLoading = true;
|
||||
replyTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status === 200) {
|
||||
// 清空输入框
|
||||
this.replyData.content = "";
|
||||
this.replyData.attachment = [];
|
||||
// 清空上传框
|
||||
let uploadFiles = this.$refs["fileupload"].uploadFiles;
|
||||
let length = uploadFiles.length;
|
||||
uploadFiles.splice(0, length);
|
||||
|
||||
// tinyMCE.activeEditor.setContent("")
|
||||
|
||||
// 重新拉取工单详情
|
||||
this.getDetails();
|
||||
}
|
||||
this.sendBtnLoading = false;
|
||||
})
|
||||
.catch((err) => {
|
||||
this.sendBtnLoading = false;
|
||||
this.$message.error(err.data.msg);
|
||||
});
|
||||
},
|
||||
// 聊天框滚动到底部
|
||||
toBottom() {
|
||||
var div = document.getElementsByClassName("main-old-msg")[0];
|
||||
div.scrollTop = div.scrollHeight;
|
||||
},
|
||||
// 上传文件相关
|
||||
handleSuccess(response, file, fileList) {
|
||||
// console.log(response);
|
||||
if (response.status != 200) {
|
||||
this.$message.error(response.msg);
|
||||
// 清空上传框
|
||||
let uploadFiles = this.$refs["fileupload"].uploadFiles;
|
||||
let length = uploadFiles.length;
|
||||
uploadFiles.splice(length - 1, length);
|
||||
} else {
|
||||
this.replyData.attachment.push(response.data.save_name);
|
||||
}
|
||||
},
|
||||
handleProgress(response) {
|
||||
console.log("response", response);
|
||||
},
|
||||
beforeRemove(file, fileList) {
|
||||
// 获取到删除的 save_name
|
||||
let save_name = file.response.data.save_name;
|
||||
this.replyData.attachment = this.replyData.attachment.filter(
|
||||
(item) => {
|
||||
return item != save_name;
|
||||
}
|
||||
);
|
||||
},
|
||||
// 下载文件
|
||||
downFile(res, title) {
|
||||
let url = res.lastIndexOf("/");
|
||||
res = res.substring(url + 1, res.length);
|
||||
const params = {
|
||||
name: res,
|
||||
};
|
||||
downloadFile(params)
|
||||
.then(function (response) {
|
||||
const blob = new Blob([response.data]);
|
||||
const fileName = title;
|
||||
const linkNode = document.createElement("a");
|
||||
linkNode.download = fileName; //a标签的download属性规定下载文件的名称
|
||||
linkNode.style.display = "none";
|
||||
linkNode.href = URL.createObjectURL(blob); //生成一个Blob URL
|
||||
document.body.appendChild(linkNode);
|
||||
linkNode.click(); //模拟在按钮上的一次鼠标单击
|
||||
URL.revokeObjectURL(linkNode.href); // 释放URL 对象
|
||||
document.body.removeChild(linkNode);
|
||||
})
|
||||
.catch((error) => {
|
||||
this.$message.error(error.data.msg);
|
||||
});
|
||||
},
|
||||
// 附件下载
|
||||
clickFile(item) {
|
||||
const name = item.name;
|
||||
const url = item.url;
|
||||
const type = name.substring(name.lastIndexOf(".") + 1);
|
||||
if (
|
||||
[
|
||||
"png",
|
||||
"jpg",
|
||||
"jepg",
|
||||
"bmp",
|
||||
"webp",
|
||||
"PNG",
|
||||
"JPG",
|
||||
"JEPG",
|
||||
"BMP",
|
||||
"WEBP",
|
||||
].includes(type)
|
||||
) {
|
||||
this.preImg = url;
|
||||
this.viewer.show();
|
||||
} else {
|
||||
const downloadElement = document.createElement("a");
|
||||
downloadElement.href = url;
|
||||
downloadElement.download = item.name; // 下载后文件名
|
||||
document.body.appendChild(downloadElement);
|
||||
downloadElement.click(); // 点击下载
|
||||
}
|
||||
},
|
||||
showClose() {
|
||||
this.visible = true;
|
||||
},
|
||||
// 关闭工单
|
||||
doCloseTicket() {
|
||||
const params = {
|
||||
id: this.id,
|
||||
};
|
||||
this.delLoading = true;
|
||||
closeTicket(params)
|
||||
.then((res) => {
|
||||
if (res.data.status == 200) {
|
||||
this.$message.success(res.data.msg);
|
||||
this.visible = false;
|
||||
// 重新拉取工单详情
|
||||
this.getDetails();
|
||||
}
|
||||
this.delLoading = false;
|
||||
})
|
||||
.catch((error) => {
|
||||
this.$message.error(error.data.msg);
|
||||
this.delLoading = false;
|
||||
});
|
||||
},
|
||||
// 载入富文本
|
||||
initTemplate() {
|
||||
tinymce.init({
|
||||
selector: "#tiny",
|
||||
language_url: "/tinymce/langs/zh_CN.js",
|
||||
language: "zh_CN",
|
||||
min_height: 400,
|
||||
width: "100%",
|
||||
plugins:
|
||||
"link lists image code table colorpicker textcolor wordcount contextmenu fullpage",
|
||||
toolbar:
|
||||
"bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image fullpage code | removeformat",
|
||||
images_upload_url: "/console/v1/upload",
|
||||
convert_urls: false,
|
||||
images_upload_handler: this.handlerAddImg,
|
||||
});
|
||||
},
|
||||
// 富文本图片上传
|
||||
handlerAddImg(blobInfo, success, failure) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const formData = new FormData();
|
||||
formData.append("file", blobInfo.blob());
|
||||
axios
|
||||
.post("/console/v1/upload", formData, {
|
||||
headers: {
|
||||
Authorization: "Bearer" + " " + localStorage.getItem("jwt"),
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
const json = {};
|
||||
if (res.status !== 200) {
|
||||
failure("HTTP Error: " + res.data.msg);
|
||||
return;
|
||||
}
|
||||
json.location = res.data.data?.image_url;
|
||||
if (!json || typeof json.location !== "string") {
|
||||
failure("Error:" + res.data.msg);
|
||||
return;
|
||||
}
|
||||
success(json.location);
|
||||
});
|
||||
});
|
||||
},
|
||||
toHost(id) {
|
||||
location.href = "/productdetail.htm?id=" + id;
|
||||
},
|
||||
hanldeImage(event) {
|
||||
if (
|
||||
event.target.nodeName == "IMG" ||
|
||||
event.target.nodeName == "img"
|
||||
) {
|
||||
const img = event.target.currentSrc;
|
||||
this.preImg = img;
|
||||
this.viewer.show();
|
||||
}
|
||||
},
|
||||
initViewer() {
|
||||
this.viewer = new Viewer(document.getElementById("viewer"), {
|
||||
button: true,
|
||||
inline: false,
|
||||
zoomable: true,
|
||||
title: true,
|
||||
tooltip: true,
|
||||
minZoomRatio: 0.5,
|
||||
maxZoomRatio: 100,
|
||||
movable: true,
|
||||
interval: 2000,
|
||||
navbar: true,
|
||||
loading: true,
|
||||
});
|
||||
},
|
||||
},
|
||||
}).$mount(template);
|
||||
typeof old_onload == "function" && old_onload();
|
||||
};
|
||||
})(window);
|
||||
1
plugins/addon/example/template/clientarea/pc/default/js/tinymce/icons/default/icons.min.js
vendored
Normal file
91
plugins/addon/example/template/clientarea/pc/default/js/tinymce/jquery.tinymce.min.js
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*/
|
||||
/**
|
||||
* Jquery integration plugin.
|
||||
*
|
||||
* @class tinymce.core.JqueryIntegration
|
||||
* @private
|
||||
*/
|
||||
!function(){function f(){
|
||||
// Reference to tinymce needs to be lazily evaluated since tinymce
|
||||
// might be loaded through the compressor or other means
|
||||
return d.tinymce}var p,c,u,s=[],d="undefined"!=typeof global?global:window,m=d.jQuery;m.fn.tinymce=function(o){var e,t,i,n,l=this,r="";
|
||||
// No match then just ignore the call
|
||||
return l.length?
|
||||
// Get editor instance
|
||||
o?(l.css("visibility","hidden"),
|
||||
// Load TinyMCE on demand, if we need to
|
||||
d.tinymce||c||!(e=o.script_url)?
|
||||
// Delay the init call until tinymce is loaded
|
||||
1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")),
|
||||
// Check if it's a dev/src version they want to load then
|
||||
// make sure that all plugins, themes etc are loaded in source mode as well
|
||||
-1!=e.indexOf(".min")&&(r=".min"),
|
||||
// Setup tinyMCEPreInit object this will later be used by the TinyMCE
|
||||
// core script to locate other resources like CSS files, dialogs etc
|
||||
// You can also predefined a tinyMCEPreInit object and then it will use that instead
|
||||
d.tinymce=d.tinyMCEPreInit||{base:t,suffix:r},
|
||||
// url contains gzip then we assume it's a compressor
|
||||
-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""),
|
||||
// Check if compressor script is already loaded otherwise setup a basic one
|
||||
d.tinyMCE_GZ||(d.tinyMCE_GZ={start:function(){function n(e){f().ScriptLoader.markDone(f().baseURI.toAbsolute(e))}
|
||||
// Add core languages
|
||||
n("langs/"+i+".js"),
|
||||
// Add themes with languages
|
||||
n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"),
|
||||
// Add plugins with languages
|
||||
m.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(f().dom.Event.domLoaded=1,c=2,
|
||||
// Execute callback after mainscript has been loaded and before the initialization occurs
|
||||
o.script_loaded&&o.script_loaded(),a(),m.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l):f()?f().get(l[0].id):null:l;function a(){var a=[],c=0;
|
||||
// Apply patches to the jQuery object, only once
|
||||
u||(v(),u=!0),
|
||||
// Create an editor instance for each matched node
|
||||
l.each(function(e,t){var n,i=t.id,r=o.oninit;
|
||||
// Generate unique id for target element if needed
|
||||
i||(t.id=i=f().DOM.uniqueId()),
|
||||
// Only init the editor once
|
||||
f().get(i)||(
|
||||
// Create editor instance and render it
|
||||
n=f().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""),
|
||||
// Run this if the oninit setting is defined
|
||||
// this logic will fire the oninit callback ones each
|
||||
// matched editor instance is initialized
|
||||
r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:f().resolve(t.replace(/\.\w+$/,"")),t=f().resolve(t)),
|
||||
// Call the oninit function with the object
|
||||
t.apply(e||f(),a))}))}),
|
||||
// Render the editor instances in a separate loop since we
|
||||
// need to have the full editors array used in the onInit calls
|
||||
m.each(a,function(e,t){t.render()})}},
|
||||
// Add :tinymce pseudo selector this will select elements that has been converted into editor instances
|
||||
// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements.
|
||||
m.extend(m.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in d&&(t=f().get(e.id))&&t.editorManager===f())}});
|
||||
// This function patches internal jQuery functions so that if
|
||||
// you for example remove an div element containing an editor it's
|
||||
// automatically destroyed by the TinyMCE API
|
||||
var v=function(){function r(e){
|
||||
// If the function is remove
|
||||
"remove"===e&&this.each(function(e,t){var n=u(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=f().get(t.id.replace(/_parent$/,""));n&&n.remove()})}function o(i){var e,t=this;
|
||||
// Handle set value
|
||||
/*jshint eqnull:true */if(null!=i)r.call(t),
|
||||
// Saves the contents before get/set value of textarea/div
|
||||
t.each(function(e,t){var n;(n=f().get(t.id))&&n.setContent(i)});else if(0<t.length&&(e=f().get(t[0].id)))return e.getContent()}function l(e){return e&&e.length&&d.tinymce&&e.is(":tinymce")}
|
||||
// Removes any child editor instances by looking for editor wrapper elements
|
||||
var u=function(e){var t=null;return e&&e.id&&d.tinymce?f().get(e.id):t},s={};
|
||||
// Loads or saves contents from/to textarea if the value
|
||||
// argument is defined it will set the TinyMCE internal contents
|
||||
// Patch some setter/getter functions these will
|
||||
// now be able to set/get the contents of editor instances for
|
||||
// example $('#editorid').html('Content'); will update the TinyMCE iframe instance
|
||||
m.each(["text","html","val"],function(e,t){var a=s[t]=m.fn[t],c="text"===t;m.fn[t]=function(e){var t=this;if(!l(t))return a.apply(t,arguments);if(e!==p)return o.call(t.filter(":tinymce"),e),a.apply(t.not(":tinymce"),arguments),t;// return original set for chaining
|
||||
var i="",r=arguments;return(c?t:t.eq(0)).each(function(e,t){var n=u(t);i+=n?c?n.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):n.getContent({save:!0}):a.apply(m(t),r)}),i}}),
|
||||
// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe
|
||||
m.each(["append","prepend"],function(e,t){var n=s[t]=m.fn[t],r="prepend"===t;m.fn[t]=function(i){var e=this;return l(e)?i!==p?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=u(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}),
|
||||
// Makes sure that the editor instance gets properly destroyed when the parent element is removed
|
||||
m.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=m.fn[t];m.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=m.fn.attr,
|
||||
// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents
|
||||
m.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!l(n))return s.attr.apply(n,i);if(t!==p)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining
|
||||
var r=n[0],a=u(r);return a?a.getContent({save:!0}):s.attr.apply(m(r),i)}}}();
|
||||
@@ -0,0 +1,3 @@
|
||||
This is where language files should be placed.
|
||||
|
||||
Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/
|
||||
@@ -0,0 +1,417 @@
|
||||
tinymce.addI18n('zh_CN',{
|
||||
"Redo": "恢复",
|
||||
"Undo": "撤销",
|
||||
"Cut": "剪切",
|
||||
"Copy": "复制",
|
||||
"Paste": "粘贴",
|
||||
"Select all": "全选",
|
||||
"New document": "新建文档",
|
||||
"Ok": "确定",
|
||||
"Cancel": "取消",
|
||||
"Visual aids": "网格线",
|
||||
"Bold": "粗体",
|
||||
"Italic": "斜体",
|
||||
"Underline": "下划线",
|
||||
"Strikethrough": "删除线",
|
||||
"Superscript": "上标",
|
||||
"Subscript": "下标",
|
||||
"Clear formatting": "清除格式",
|
||||
"Align left": "左对齐",
|
||||
"Align center": "居中",
|
||||
"Align right": "右对齐",
|
||||
"Justify": "两端对齐",
|
||||
"Bullet list": "符号列表",
|
||||
"Numbered list": "数字列表",
|
||||
"Decrease indent": "减少缩进",
|
||||
"Increase indent": "增加缩进",
|
||||
"Close": "关闭",
|
||||
"Formats": "格式",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "当前浏览器不支持访问剪贴板,请使用快捷键Ctrl+X/C/V复制粘贴",
|
||||
"Headers": "标题",
|
||||
"Header 1": "标题1",
|
||||
"Header 2": "标题2",
|
||||
"Header 3": "标题3",
|
||||
"Header 4": "标题4",
|
||||
"Header 5": "标题5",
|
||||
"Header 6": "标题6",
|
||||
"Headings": "标题",
|
||||
"Heading 1": "标题1",
|
||||
"Heading 2": "标题2",
|
||||
"Heading 3": "标题3",
|
||||
"Heading 4": "标题4",
|
||||
"Heading 5": "标题5",
|
||||
"Heading 6": "标题6",
|
||||
"Preformatted": "预格式化",
|
||||
"Div": "Div区块",
|
||||
"Pre": "预格式文本",
|
||||
"Code": "代码",
|
||||
"Paragraph": "段落",
|
||||
"Blockquote": "引用",
|
||||
"Inline": "文本",
|
||||
"Blocks": "区块",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "当前为纯文本粘贴模式,再次点击可以回到普通粘贴模式。",
|
||||
"Fonts": "字体",
|
||||
"Font Sizes": "字号",
|
||||
"Class": "Class",
|
||||
"Browse for an image": "浏览图像",
|
||||
"OR": "或",
|
||||
"Drop an image here": "拖放一张图片文件至此",
|
||||
"Upload": "上传",
|
||||
"Block": "块",
|
||||
"Align": "对齐",
|
||||
"Default": "默认",
|
||||
"Circle": "空心圆",
|
||||
"Disc": "实心圆",
|
||||
"Square": "方块",
|
||||
"Lower Alpha": "小写英文字母",
|
||||
"Lower Greek": "小写希腊字母",
|
||||
"Lower Roman": "小写罗马字母",
|
||||
"Upper Alpha": "大写英文字母",
|
||||
"Upper Roman": "大写罗马字母",
|
||||
"Anchor...": "锚点...",
|
||||
"Name": "名称",
|
||||
"Id": "id",
|
||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "id应该以字母开头,后跟字母、数字、横线、点、冒号或下划线。",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "你对文档的修改尚未保存,确定离开吗?",
|
||||
"Restore last draft": "恢复上次的草稿",
|
||||
"Special characters...": "特殊字符...",
|
||||
"Source code": "HTML源码",
|
||||
"Insert\/Edit code sample": "插入/编辑代码示例",
|
||||
"Language": "语言",
|
||||
"Code sample...": "代码示例...",
|
||||
"Color Picker": "选取颜色",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"B": "B",
|
||||
"Left to right": "从左到右",
|
||||
"Right to left": "从右到左",
|
||||
"Emoticons...": "表情符号...",
|
||||
"Metadata and Document Properties": "元数据和文档属性",
|
||||
"Title": "标题",
|
||||
"Keywords": "关键词",
|
||||
"Description": "描述",
|
||||
"Robots": "机器人",
|
||||
"Author": "作者",
|
||||
"Encoding": "编码",
|
||||
"Fullscreen": "全屏",
|
||||
"Action": "操作",
|
||||
"Shortcut": "快捷键",
|
||||
"Help": "帮助",
|
||||
"Address": "地址",
|
||||
"Focus to menubar": "移动焦点到菜单栏",
|
||||
"Focus to toolbar": "移动焦点到工具栏",
|
||||
"Focus to element path": "移动焦点到元素路径",
|
||||
"Focus to contextual toolbar": "移动焦点到上下文菜单",
|
||||
"Insert link (if link plugin activated)": "插入链接 (如果链接插件已激活)",
|
||||
"Save (if save plugin activated)": "保存(如果保存插件已激活)",
|
||||
"Find (if searchreplace plugin activated)": "查找(如果查找替换插件已激活)",
|
||||
"Plugins installed ({0}):": "已安装插件 ({0}):",
|
||||
"Premium plugins:": "优秀插件:",
|
||||
"Learn more...": "了解更多...",
|
||||
"You are using {0}": "你正在使用 {0}",
|
||||
"Plugins": "插件",
|
||||
"Handy Shortcuts": "快捷键",
|
||||
"Horizontal line": "水平分割线",
|
||||
"Insert\/edit image": "插入/编辑图片",
|
||||
"Image description": "图片描述",
|
||||
"Source": "地址",
|
||||
"Dimensions": "大小",
|
||||
"Constrain proportions": "保持宽高比",
|
||||
"General": "常规",
|
||||
"Advanced": "高级",
|
||||
"Style": "样式",
|
||||
"Vertical space": "垂直边距",
|
||||
"Horizontal space": "水平边距",
|
||||
"Border": "边框",
|
||||
"Insert image": "插入图片",
|
||||
"Image...": "图片...",
|
||||
"Image list": "图片列表",
|
||||
"Rotate counterclockwise": "逆时针旋转",
|
||||
"Rotate clockwise": "顺时针旋转",
|
||||
"Flip vertically": "垂直翻转",
|
||||
"Flip horizontally": "水平翻转",
|
||||
"Edit image": "编辑图片",
|
||||
"Image options": "图片选项",
|
||||
"Zoom in": "放大",
|
||||
"Zoom out": "缩小",
|
||||
"Crop": "裁剪",
|
||||
"Resize": "调整大小",
|
||||
"Orientation": "方向",
|
||||
"Brightness": "亮度",
|
||||
"Sharpen": "锐化",
|
||||
"Contrast": "对比度",
|
||||
"Color levels": "色阶",
|
||||
"Gamma": "伽马值",
|
||||
"Invert": "反转",
|
||||
"Apply": "应用",
|
||||
"Back": "后退",
|
||||
"Insert date\/time": "插入日期/时间",
|
||||
"Date\/time": "日期/时间",
|
||||
"Insert\/Edit Link": "插入/编辑链接",
|
||||
"Insert\/edit link": "插入/编辑链接",
|
||||
"Text to display": "显示文字",
|
||||
"Url": "地址",
|
||||
"Open link in...": "链接打开方式...",
|
||||
"Current window": "当前窗口打开",
|
||||
"None": "在当前窗口/框架打开",
|
||||
"New window": "在新窗口打开",
|
||||
"Remove link": "删除链接",
|
||||
"Anchors": "锚点",
|
||||
"Link...": "链接...",
|
||||
"Paste or type a link": "粘贴或输入链接",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "你所填写的URL地址为邮件地址,需要加上mailto:前缀吗?",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "你所填写的URL地址属于外部链接,需要加上http://:前缀吗?",
|
||||
"Link list": "链接列表",
|
||||
"Insert video": "插入视频",
|
||||
"Insert\/edit video": "插入/编辑视频",
|
||||
"Insert\/edit media": "插入/编辑媒体",
|
||||
"Alternative source": "替代资源",
|
||||
"Alternative image URL": "资源备用地址",
|
||||
"Media poster (Image URL)": "封面(图片地址)",
|
||||
"Paste your embed code below:": "将内嵌代码粘贴在下面:",
|
||||
"Embed": "内嵌",
|
||||
"Media...": "多媒体...",
|
||||
"Nonbreaking space": "不间断空格",
|
||||
"Page break": "分页符",
|
||||
"Paste as text": "粘贴为文本",
|
||||
"Preview": "预览",
|
||||
"Print...": "打印...",
|
||||
"Save": "保存",
|
||||
"Find": "查找",
|
||||
"Replace with": "替换为",
|
||||
"Replace": "替换",
|
||||
"Replace all": "替换全部",
|
||||
"Previous": "上一个",
|
||||
"Next": "下一个",
|
||||
"Find and replace...": "查找并替换...",
|
||||
"Could not find the specified string.": "未找到搜索内容。",
|
||||
"Match case": "区分大小写",
|
||||
"Find whole words only": "全单词匹配",
|
||||
"Spell check": "拼写检查",
|
||||
"Ignore": "忽略",
|
||||
"Ignore all": "忽略全部",
|
||||
"Finish": "完成",
|
||||
"Add to Dictionary": "添加到字典",
|
||||
"Insert table": "插入表格",
|
||||
"Table properties": "表格属性",
|
||||
"Delete table": "删除表格",
|
||||
"Cell": "单元格",
|
||||
"Row": "行",
|
||||
"Column": "列",
|
||||
"Cell properties": "单元格属性",
|
||||
"Merge cells": "合并单元格",
|
||||
"Split cell": "拆分单元格",
|
||||
"Insert row before": "在上方插入",
|
||||
"Insert row after": "在下方插入",
|
||||
"Delete row": "删除行",
|
||||
"Row properties": "行属性",
|
||||
"Cut row": "剪切行",
|
||||
"Copy row": "复制行",
|
||||
"Paste row before": "粘贴到上方",
|
||||
"Paste row after": "粘贴到下方",
|
||||
"Insert column before": "在左侧插入",
|
||||
"Insert column after": "在右侧插入",
|
||||
"Delete column": "删除列",
|
||||
"Cols": "列",
|
||||
"Rows": "行",
|
||||
"Width": "宽",
|
||||
"Height": "高",
|
||||
"Cell spacing": "单元格外间距",
|
||||
"Cell padding": "单元格内边距",
|
||||
"Show caption": "显示标题",
|
||||
"Left": "左对齐",
|
||||
"Center": "居中",
|
||||
"Right": "右对齐",
|
||||
"Cell type": "单元格类型",
|
||||
"Scope": "范围",
|
||||
"Alignment": "对齐方式",
|
||||
"H Align": "水平对齐",
|
||||
"V Align": "垂直对齐",
|
||||
"Top": "顶部对齐",
|
||||
"Middle": "垂直居中",
|
||||
"Bottom": "底部对齐",
|
||||
"Header cell": "表头单元格",
|
||||
"Row group": "行组",
|
||||
"Column group": "列组",
|
||||
"Row type": "行类型",
|
||||
"Header": "表头",
|
||||
"Body": "表体",
|
||||
"Footer": "表尾",
|
||||
"Border color": "边框颜色",
|
||||
"Insert template...": "插入模板...",
|
||||
"Templates": "模板",
|
||||
"Template": "模板",
|
||||
"Text color": "文字颜色",
|
||||
"Background color": "背景色",
|
||||
"Custom...": "自定义...",
|
||||
"Custom color": "自定义颜色",
|
||||
"No color": "无",
|
||||
"Remove color": "删除颜色",
|
||||
"Table of Contents": "目录",
|
||||
"Show blocks": "显示区块边框",
|
||||
"Show invisible characters": "显示不可见字符",
|
||||
"Word count": "字数统计",
|
||||
"Words: {0}": "字数:{0}",
|
||||
"{0} words": "{0} 个字",
|
||||
"File": "文件",
|
||||
"Edit": "编辑",
|
||||
"Insert": "插入",
|
||||
"View": "查看",
|
||||
"Format": "格式",
|
||||
"Table": "表格",
|
||||
"Tools": "工具",
|
||||
"Powered by {0}": "Powered by {0}",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "在编辑区按ALT+F9打开菜单,按ALT+F10打开工具栏,按ALT+0查看帮助",
|
||||
"Image title": "图片标题",
|
||||
"Border width": "边框宽度",
|
||||
"Border style": "边框样式",
|
||||
"Error": "错误",
|
||||
"Warn": "警告",
|
||||
"Valid": "有效",
|
||||
"To open the popup, press Shift+Enter": "此快捷为软回车(插入<br>)",
|
||||
"Rich Text Area. Press ALT-0 for help.": "编辑区. 按Alt+0键打开帮助",
|
||||
"System Font": "默认字体",
|
||||
"Failed to upload image: {0}": "图片上传失败: {0}",
|
||||
"Failed to load plugin: {0} from url {1}": "插件加载失败: {0} - {1}",
|
||||
"Failed to load plugin url: {0}": "插件加载失败: {0}",
|
||||
"Failed to initialize plugin: {0}": "插件初始化失败: {0}",
|
||||
"example": "示例",
|
||||
"Search": "查找",
|
||||
"All": "全部",
|
||||
"Currency": "货币",
|
||||
"Text": "文本",
|
||||
"Quotations": "引用",
|
||||
"Mathematical": "数学运算符",
|
||||
"Extended Latin": "拉丁语扩充",
|
||||
"Symbols": "符号",
|
||||
"Arrows": "箭头",
|
||||
"User Defined": "自定义",
|
||||
"dollar sign": "美元",
|
||||
"currency sign": "货币",
|
||||
"euro-currency sign": "欧元",
|
||||
"colon sign": "冒号",
|
||||
"cruzeiro sign": "克鲁赛罗币",
|
||||
"french franc sign": "法郎",
|
||||
"lira sign": "里拉",
|
||||
"mill sign": "密尔",
|
||||
"naira sign": "奈拉",
|
||||
"peseta sign": "比塞塔",
|
||||
"rupee sign": "卢比",
|
||||
"won sign": "韩元",
|
||||
"new sheqel sign": "新谢克尔",
|
||||
"dong sign": "越南盾",
|
||||
"kip sign": "老挝基普",
|
||||
"tugrik sign": "图格里克",
|
||||
"drachma sign": "德拉克马",
|
||||
"german penny symbol": "德国便士",
|
||||
"peso sign": "比索",
|
||||
"guarani sign": "瓜拉尼",
|
||||
"austral sign": "澳元",
|
||||
"hryvnia sign": "格里夫尼亚",
|
||||
"cedi sign": "塞地",
|
||||
"livre tournois sign": "里弗弗尔",
|
||||
"spesmilo sign": "一千spesoj的货币符号,该货币未使用",
|
||||
"tenge sign": "坚戈",
|
||||
"indian rupee sign": "印度卢比",
|
||||
"turkish lira sign": "土耳其里拉",
|
||||
"nordic mark sign": "北欧马克",
|
||||
"manat sign": "马纳特",
|
||||
"ruble sign": "卢布",
|
||||
"yen character": "日元",
|
||||
"yuan character": "人民币元",
|
||||
"yuan character, in hong kong and taiwan": "元的繁体字",
|
||||
"yen\/yuan character variant one": "元(大写)",
|
||||
"Loading emoticons...": "正在加载表情文字...",
|
||||
"Could not load emoticons": "不能加载表情文字",
|
||||
"People": "人类",
|
||||
"Animals and Nature": "动物和自然",
|
||||
"Food and Drink": "食物和饮品",
|
||||
"Activity": "活动",
|
||||
"Travel and Places": "旅游和地点",
|
||||
"Objects": "物件",
|
||||
"Flags": "旗帜",
|
||||
"Characters": "字数",
|
||||
"Characters (no spaces)": "字数(不含空格)",
|
||||
"Error: Form submit field collision.": "错误: 表单提交字段冲突.",
|
||||
"Error: No form element found.": "错误: 未找到可用的form.",
|
||||
"Update": "更新",
|
||||
"Color swatch": "颜色样本",
|
||||
"Turquoise": "青绿",
|
||||
"Green": "绿色",
|
||||
"Blue": "蓝色",
|
||||
"Purple": "紫色",
|
||||
"Navy Blue": "海军蓝",
|
||||
"Dark Turquoise": "深蓝绿色",
|
||||
"Dark Green": "暗绿",
|
||||
"Medium Blue": "中蓝",
|
||||
"Medium Purple": "中紫",
|
||||
"Midnight Blue": "深蓝",
|
||||
"Yellow": "黄色",
|
||||
"Orange": "橙色",
|
||||
"Red": "红色",
|
||||
"Light Gray": "浅灰",
|
||||
"Gray": "灰色",
|
||||
"Dark Yellow": "暗黄",
|
||||
"Dark Orange": "暗橙",
|
||||
"Dark Red": "暗红",
|
||||
"Medium Gray": "中灰",
|
||||
"Dark Gray": "深灰",
|
||||
"Black": "黑色",
|
||||
"White": "白色",
|
||||
"Switch to or from fullscreen mode": "切换全屏模式",
|
||||
"Open help dialog": "打开帮助对话框",
|
||||
"history": "历史",
|
||||
"styles": "样式",
|
||||
"formatting": "格式化",
|
||||
"alignment": "对齐",
|
||||
"indentation": "缩进",
|
||||
"permanent pen": "记号笔",
|
||||
"comments": "注释",
|
||||
"Anchor": "锚点",
|
||||
"Special character": "特殊字符",
|
||||
"Code sample": "代码示例",
|
||||
"Color": "颜色",
|
||||
"Emoticons": "表情",
|
||||
"Document properties": "文档属性",
|
||||
"Image": "图片",
|
||||
"Insert link": "插入链接",
|
||||
"Target": "目标",
|
||||
"Link": "链接",
|
||||
"Poster": "封面",
|
||||
"Media": "音视频",
|
||||
"Print": "打印",
|
||||
"Prev": "上一个",
|
||||
"Find and replace": "查找并替换",
|
||||
"Whole words": "全字匹配",
|
||||
"Spellcheck": "拼写检查",
|
||||
"Caption": "标题",
|
||||
"Insert template": "插入模板",
|
||||
//以下为补充汉化内容 by 莫若卿
|
||||
"Code view": "代码区域",
|
||||
"Select...": "选择...",
|
||||
"Format Painter": "格式刷",
|
||||
"No templates defined.": "无内置模板",
|
||||
"Special character...": "特殊字符...",
|
||||
"Open link": "打开链接",
|
||||
"None": "无",
|
||||
"Count": "统计",
|
||||
"Document": "整个文档",
|
||||
"Selection": "选取部分",
|
||||
"Words": "字词数",
|
||||
"{0} characters": "{0} 个字符",
|
||||
"Alternative source URL": "替代资源地址",
|
||||
"Alternative description": "替代说明文字",
|
||||
"Accessibility": "可访问性",
|
||||
"Image is decorative": "仅用于装饰",
|
||||
//5.6新增
|
||||
"Line height": "行高",
|
||||
"Cut column": "剪切列",
|
||||
"Copy column": "复制列",
|
||||
"Paste column before": "粘贴到前方",
|
||||
"Paste column after": "粘贴到后方",
|
||||
"Copy column": "复制列",
|
||||
//帮助窗口内的文字
|
||||
"Version": "版本",
|
||||
"Keyboard Navigation": "键盘导航",
|
||||
"Open popup menu for split buttons": "该组合键的作用是软回车(插入br)",
|
||||
});
|
||||
@@ -0,0 +1,504 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function f(t,e,n){t.execCommand("UL"===e?"InsertUnorderedList":"InsertOrderedList",!1,!1===n?null:{"list-style-type":n})}function i(t){return function(){return t}}function t(t){return t}function e(){return s}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=i(!1),l=i(!0),s={fold:function(t,e){return t()},isSome:u,isNone:l,getOr:t,getOrThunk:r,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:r,map:e,each:function(){},bind:e,exists:u,forall:l,filter:function(){return s},toArray:function(){return[]},toString:i("none()")};function r(t){return t()}function d(t){return t&&/^(TH|TD)$/.test(t.nodeName)}function m(c,a){return function(s){function t(t){var e,n,r,o,i,u,l;s.setActive((e=c,r=a,i=-1!==(o=function(t,e){for(var n=0;n<t.length;n++)if(e(t[n]))return n;return-1}((n=t).parents,d))?n.parents.slice(0,o):n.parents,0<(u=g.grep(i,(l=e,function(t){return t&&/^(OL|UL|DL)$/.test(t.nodeName)&&(e=t,l.$.contains(l.getBody(),e));var e}))).length&&u[0].nodeName===r))}return c.on("NodeChange",t),function(){return c.off("NodeChange",t)}}}function c(t,e,n,r,o,i){var u,l,s,c,a,d;1<i.length?(c=r,a=o,d=i,(s=t).ui.registry.addSplitButton(e,{tooltip:n,icon:"OL"===a?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:function(t){t(g.map(d,function(t){return{type:"choiceitem",value:"default"===t?"":t,icon:"list-"+("OL"===a?"num":"bull")+"-"+("disc"===t||"decimal"===t?"default":t),text:t.replace(/\-/g," ").replace(/\b\w/g,function(t){return t.toUpperCase()})}}))},onAction:function(){return s.execCommand(c)},onItemAction:function(t,e){f(s,a,e)},select:function(e){var t,n=(t=s).dom.getParent(t.selection.getNode(),"ol,ul"),r=t.dom.getStyle(n,"listStyleType");return p(r).map(function(t){return e===t}).getOr(!1)},onSetup:m(s,a)})):(l=r,(u=t).ui.registry.addToggleButton(e,{active:!1,tooltip:n,icon:"OL"===o?"ordered-list":"unordered-list",onSetup:m(u,o),onAction:function(){return u.execCommand(l)}}))}var a=function(n){function t(){return o}function e(t){return t(n)}var r=i(n),o={fold:function(t,e){return e(n)},isSome:l,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:t,orThunk:t,map:function(t){return a(t(n))},each:function(t){t(n)},bind:e,exists:e,forall:e,filter:function(t){return t(n)?o:s},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},p=function(t){return null==t?s:a(t)};n.add("advlist",function(t){var n,e,r,o;t.hasPlugin("lists")?(c(e=t,"numlist","Numbered list","InsertOrderedList","OL",(r=e.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"))?r.split(/[ ,]/):[]),c(e,"bullist","Bullet list","InsertUnorderedList","UL",(o=e.getParam("advlist_bullet_styles","default,circle,square"))?o.split(/[ ,]/):[]),(n=t).addCommand("ApplyUnorderedListStyle",function(t,e){f(n,"UL",e["list-style-type"])}),n.addCommand("ApplyOrderedListStyle",function(t,e){f(n,"OL",e["list-style-type"])})):console.error("Please use the Lists plugin together with the Advanced List plugin.")})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/anchor/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function a(e){return e.getAttribute("id")||e.getAttribute("name")||""}function c(e){return e&&"a"===e.nodeName.toLowerCase()&&!e.getAttribute("href")&&""!==a(e)}function d(e){return e.dom.getParent(e.selection.getStart(),l)}function r(e,t){var o,a,n,r,i,l=d(e);l?(n=e,r=t,(i=l).removeAttribute("name"),i.id=r,n.addVisual(),n.undoManager.add()):(a=t,(o=e).undoManager.transact(function(){var e,n;o.getParam("allow_html_in_named_anchor",!1,"boolean")||o.selection.collapse(!0),o.selection.isCollapsed()?o.insertContent(o.dom.createHTML("a",{id:a})):(n=(e=o).dom,u(n).walk(e.selection.getRng(),function(e){s.each(e,function(e){var t;c(t=e)&&!t.firstChild&&n.remove(e,!1)})}),o.formatter.remove("namedAnchor",null,null,!0),o.formatter.apply("namedAnchor",{value:a}),o.addVisual())})),e.focus()}function i(r){return function(e){for(var t,n=0;n<e.length;n++){var o=e[n],a=void 0;!(a=t=o)||a.attr("href")||!a.attr("id")&&!a.attr("name")||t.firstChild||o.attr("contenteditable",r)}}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),s=tinymce.util.Tools.resolve("tinymce.util.Tools"),l="a:not([href])";e.add("anchor",function(e){var t,n,o;(t=e).on("PreInit",function(){t.parser.addNodeFilter("a",i("false")),t.serializer.addNodeFilter("a",i(null))}),(n=e).addCommand("mceAnchor",function(){var o,e,t;t=(e=d(o=n))?a(e):"",o.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:function(e){var t=o,n=e.getData().id;(/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(n)?(r(t,n),0):(t.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),1))||e.close()}})}),(o=e).ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:function(){return o.execCommand("mceAnchor")},onSetup:function(e){return o.selection.selectorChangedWithUnbind("a:not([href])",e.setActive).unbind}}),o.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:function(){return o.execCommand("mceAnchor")}}),e.on("PreInit",function(){e.formatter.register("namedAnchor",{inline:"a",selector:l,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:c})})})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function o(e,t){var n;return t<0&&(t=0),3!==e.nodeType||(n=e.data.length)<t&&(t=n),t}function p(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setStart(t,o(t,n)):e.setStartBefore(t)}function A(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setEnd(t,o(t,n)):e.setEndAfter(t)}function i(e,t,n){var o,i,r,a,d,s,l=e.getParam("autolink_pattern",v),f=e.getParam("default_link_target",!1);if("A"!==e.selection.getNode().tagName){var c=e.selection.getRng().cloneRange();if(c.startOffset<5){if(!(a=c.endContainer.previousSibling)){if(!c.endContainer.firstChild||!c.endContainer.firstChild.nextSibling)return;a=c.endContainer.firstChild.nextSibling}if(p(c,a,d=a.length),A(c,a,d),c.endOffset<5)return;o=c.endOffset,i=a}else{if(3!==(i=c.endContainer).nodeType&&i.firstChild){for(;3!==i.nodeType&&i.firstChild;)i=i.firstChild;3===i.nodeType&&(p(c,i,0),A(c,i,i.nodeValue.length))}o=1===c.endOffset?2:c.endOffset-1-t}for(var g,u=o;p(c,i,2<=o?o-2:0),A(c,i,1<=o?o-1:0),--o," "!==(s=c.toString())&&""!==s&&160!==s.charCodeAt(0)&&0<=o-2&&s!==n;);(g=c.toString())===n||" "===g||160===g.charCodeAt(0)?(p(c,i,o),A(c,i,u),o+=1):(0===c.startOffset?p(c,i,0):p(c,i,o),A(c,i,u)),h=c.toString(),/[?!,.;:]/.test(h.charAt(h.length-1))&&A(c,i,u-1);var h,C,m,y,k=(h=c.toString().trim()).match(l),w=e.getParam("link_default_protocol","http","string");k&&((m=C=k[0]).length>=(y="www.").length&&m.substr(0,0+y.length)===y?C=w+"://"+C:-1===C.indexOf("@")||/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(C)||(C="mailto:"+C),r=e.selection.getBookmark(),e.selection.setRng(c),e.execCommand("createlink",!1,C),!1!==f&&e.dom.setAttrib(e.selection.getNode(),"target",f),e.selection.moveToBookmark(r),e.nodeChanged())}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env"),v=new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-+~=.,%()\/\w]*[-+~=%()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i");e.add("autolink",function(e){var t,n;(t=e).on("keydown",function(e){13===e.keyCode&&i(t,-1,"")}),r.browser.isIE()?t.on("focus",function(){if(!n){n=!0;try{t.execCommand("AutoUrlDetect",!1,!0)}catch(e){}}}):(t.on("keypress",function(e){41===e.keyCode&&i(t,-1,"(")}),t.on("keyup",function(e){32===e.keyCode&&i(t,0,"")}))})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function y(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")}function p(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))}function v(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o}var l=Object.hasOwnProperty,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),b=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),u=function(e,t,n,i,o){r.setEditorTimeout(e,function(){C(e,t),n--?u(e,t,n,i,o):o&&o()},i)},C=function(e,t,n){var i,o,r,s,a,l,u,g,c,m,f,d=e.dom,h=e.getDoc();h&&(e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()?p(e,!0):(i=h.documentElement,o=e.getParam("autoresize_bottom_margin",50,"number"),r=y(e),s=v(d,i,"margin-top",!0),a=v(d,i,"margin-bottom",!0),(l=(l=i.offsetHeight+s+a+o)<0?0:l)+(u=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight)>y(e)&&(r=l+u),(g=e.getParam("max_height",0,"number"))&&g<r?(r=g,p(e,!0)):p(e,!1),r!==t.get()&&(c=r-t.get(),d.setStyle(e.getContainer(),"height",r+"px"),t.set(r),e.fire("ResizeEditor"),b.browser.isSafari()&&b.mac&&(m=e.getWin()).scrollTo(m.pageXOffset,m.pageYOffset),!e.hasFocus()||"setcontent"!==(null==(f=n)?void 0:f.type.toLowerCase())||!0!==f.selection&&!0!==f.paste||e.selection.scrollIntoView(),b.webkit&&c<0&&C(e,t,n))))};e.add("autoresize",function(e){var t,n,i,o,r,s,a=e.settings;l.call(a,"resize")||(e.settings.resize=!1),e.inline||(s=0,r=t={get:function(){return s},set:function(e){s=e}},(o=e).addCommand("mceAutoResize",function(){C(o,r)}),i=t,(n=e).on("init",function(){var e=n.getParam("autoresize_overflow_padding",1,"number"),t=n.dom;t.setStyles(n.getDoc().documentElement,{height:"auto"}),t.setStyles(n.getBody(),{paddingLeft:e,paddingRight:e,"min-height":0})}),n.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",function(e){C(n,i,e)}),n.getParam("autoresize_on_init",!0,"boolean")&&n.on("init",function(){u(n,i,20,100,function(){u(n,i,5,1e3)})}))})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function o(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)}function n(t){var e=document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)}function i(t,e){if(a(e))return t.dom.isEmpty(t.getBody());var r=d.trim(e);if(""===r)return!0;var n=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(n)}function u(t){var e=parseInt(v.getItem(n(t)+"time"),10)||0;return!((new Date).getTime()-e>o(t.getParam("autosave_retention"),"20m")&&(g(t,!1),1))}function s(t){var e=n(t);!i(t)&&t.isDirty()&&(v.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),v.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))}function f(t){var e=n(t);u(t)&&(t.setContent(v.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))}function c(t){t.undoManager.transact(function(){f(t),g(t)}),t.focus()}function m(r){return function(t){function e(){return t.setDisabled(!u(r))}return t.setDisabled(!u(r)),r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(t){return void 0===t},l=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,e){var r=n(t);v.removeItem(r+"draft"),v.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},y=tinymce.util.Tools.resolve("tinymce.EditorManager");t.add("autosave",function(t){var e,r,n,a;return t.editorManager.on("BeforeUnload",function(t){var e;d.each(y.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),n=e=t,a=o(n.getParam("autosave_interval"),"30s"),l.setEditorInterval(n,function(){s(n)},a),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&f(t)}),r=t,{hasDraft:function(){return u(r)},storeDraft:function(){return s(r)},restoreDraft:function(){return f(r)},removeDraft:function(t){return g(r,t)},isEmpty:function(t){return i(r,t)}}})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/bbcode/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function i(t){function o(o,e){t=t.replace(o,e)}return t=n.trim(t),o(/\n/gi,"<br />"),o(/\[b\]/gi,"<strong>"),o(/\[\/b\]/gi,"</strong>"),o(/\[i\]/gi,"<em>"),o(/\[\/i\]/gi,"</em>"),o(/\[u\]/gi,"<u>"),o(/\[\/u\]/gi,"</u>"),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>'),o(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>'),o(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />'),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>'),o(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span> '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span> '),t}var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){function e(o,e){t=t.replace(o,e)}var t;o.set&&(o.content=i(o.content)),o.get&&(o.content=(t=o.content,t=n.trim(t),e(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/<font>(.*?)<\/font>/gi,"$1"),e(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"),e(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"),e(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"),e(/<u>/gi,"[u]"),e(/<blockquote[^>]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/<br \/>/gi,"\n"),e(/<br\/>/gi,"\n"),e(/<br>/gi,"\n"),e(/<p>/gi,""),e(/<\/p>/gi,"\n"),e(/ |\u00a0/gi," "),e(/"/gi,'"'),e(/</gi,"<"),e(/>/gi,">"),e(/&/gi,"&"),t))})})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/code/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",function(e){var t,o;function n(){return o.execCommand("mceCodeEditor")}return(t=e).addCommand("mceCodeEditor",function(){var n,e;e=(n=t).getContent({source_view:!0}),n.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:e},onSubmit:function(e){var t=n,o=e.getData().code;t.focus(),t.undoManager.transact(function(){t.setContent(o)}),t.selection.setCursorLocation(),t.nodeChanged(),e.close()}})}),(o=e).ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:n}),o.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:n}),{}})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/help/plugin.min.js
vendored
Normal file
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/hr/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("hr",function(n){var o,t;function e(){return t.execCommand("InsertHorizontalRule")}(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"<hr />")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:e}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:e})})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/image/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function t(n){return function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}}function y(t){return t.getParam("importcss_selector_converter")}function u(e){return l(e)?function(t){return-1!==t.indexOf(e)}:e instanceof RegExp?function(t){return e.test(t)}:e}function h(t,e){var r,n=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(e);if(n){var o=n[1],i=n[2].substr(1).split(".").join(" "),c=x.makeMap("a,img");return n[1]?(r={title:e},t.schema.getTextBlockElements()[o]?r.block=o:t.schema.getBlockElements()[o]||c[o.toLowerCase()]?r.selector=o:r.inline=o):n[2]&&(r={inline:"span",title:e.substr(1),classes:i}),!1!==t.getParam("importcss_merge_classes")?r.classes=i:r.attributes={class:i},r}}function d(t,e){return null===e||!1!==t.getParam("importcss_exclusive")}function r(v){v.on("init",function(){function o(t,e){if(f=t,p=g,!(d(v,m=e)?f in p:f in m.selectors)){a=t,l=g,d(v,u=e)?l[a]=!0:u.selectors[a]=!0;var r=(i=(o=v).plugins.importcss,c=t,((s=e)&&s.selector_converter?s.selector_converter:y(o)?y(o):function(){return h(o,c)}).call(i,c,s));if(r){var n=r.name||_.DOM.uniqueId();return v.formatter.register(n,r),{title:r.title,format:n}}}var o,i,c,s,a,u,l,f,m,p;return null}var e,r,n,t,i=(e=[],r=[],n={},{addItemToGroup:function(t,e){n[t]?n[t].push(e):(r.push(t),n[t]=[e])},addItem:function(t){e.push(t)},toFormats:function(){return function(t){for(var e=[],r=0,n=t.length;r<n;++r){if(!f(t[r]))throw new Error("Arr.flatten item "+r+" was not an array, input: "+t);P.apply(e,t[r])}return e}(function(t,e){for(var r=t.length,n=new Array(r),o=0;o<r;o++){var i=t[o];n[o]=e(i,o)}return n}(r,function(t){var e=n[t];return 0===e.length?[]:[{title:t,items:e}]})).concat(e)}}),g={},c=u(v.getParam("importcss_selector_filter")),s=(t=v.getParam("importcss_groups"),x.map(t,function(t){return x.extend({},t,{original:t,selectors:{},filter:u(t.filter)})}));x.each(function(c,t,s){var a=[],r={},u=function(t,e){var r,n,o=n=t.href,i=p.cacheSuffix;if((n=o=l(o)?o.replace("?"+i,"").replace("&"+i,""):o)&&s(n,e)&&!function(t,e){var r,n=!1!==(r=t.getParam("skin"))&&(r||"oxide");if(n){var o=t.getParam("skin_url"),i=o?t.documentBaseURI.toAbsolute(o):m.baseURL+"/skins/ui/"+n,c=m.baseURL+"/skins/content/";return e===i+"/content"+(t.inline?".inline":"")+".min.css"||-1!==e.indexOf(c)}}(c,n)){x.each(t.imports,function(t){u(t,!0)});try{r=t.cssRules||t.rules}catch(t){}x.each(r,function(t){t.styleSheet?u(t.styleSheet,!0):t.selectorText&&x.each(t.selectorText.split(","),function(t){a.push(x.trim(t))})})}};x.each(c.contentCSS,function(t){r[t]=!0}),s=s||function(t,e){return e||r[t]};try{x.each(t.styleSheets,function(t){u(t)})}catch(t){}return a}(v,v.getDoc(),u(v.getParam("importcss_file_filter"))),function(r){var t,e,n;-1===r.indexOf(".mce-")&&(c&&!c(r)||(n=r,0<(t=x.grep(s,function(t){return!t.filter||t.filter(n)})).length?x.each(t,function(t){var e=o(r,t);e&&i.addItemToGroup(t.title,e)}):(e=o(r,null))&&i.addItem(e)))});var a=i.toFormats();v.fire("addStyleModifications",{items:a,replace:!v.getParam("importcss_append")})})}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=t("string"),f=t("array"),_=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),m=tinymce.util.Tools.resolve("tinymce.EditorManager"),p=tinymce.util.Tools.resolve("tinymce.Env"),x=tinymce.util.Tools.resolve("tinymce.util.Tools"),P=Array.prototype.push;e.add("importcss",function(t){return r(t),e=t,{convertSelectorToFormat:function(t){return h(e,t)}};var e})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function l(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))}function s(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])}function r(e,t){if((e=""+e).length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e}function d(e,t,n){return void 0===n&&(n=new Date),(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",r(n.getMonth()+1,2))).replace("%d",r(n.getDate(),2))).replace("%H",""+r(n.getHours(),2))).replace("%M",""+r(n.getMinutes(),2))).replace("%S",""+r(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(u[n.getMonth()]))).replace("%b",""+e.translate(o[n.getMonth()]))).replace("%A",""+e.translate(i[n.getDay()]))).replace("%a",""+e.translate(a[n.getDay()]))).replace("%%","%")}function p(e,t){var n,r,a,i,o,u;e.getParam("insertdatetime_element",!1)?(n=d(e,t),r=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d"),(a=e.dom.getParent(e.selection.getStart(),"time"))?(o=a,u=(i=e).dom.create("time",{datetime:r},n),o.parentNode.insertBefore(u,o),i.dom.remove(o),i.selection.select(u,!0),i.selection.collapse(!1)):e.insertContent('<time datetime="'+r+'">'+n+"</time>")):e.insertContent(d(e,t))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),i="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),o="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),u="January February March April May June July August September October November December".split(" "),g=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("insertdatetime",function(e){var n,r,t,a,i,o,u,c;function m(e){return r.execCommand("mceInsertDate",!1,e)}(n=e).addCommand("mceInsertDate",function(e,t){p(n,null!=t?t:n.getParam("insertdatetime_dateformat",n.translate("%Y-%m-%d")))}),n.addCommand("mceInsertTime",function(e,t){p(n,null!=t?t:l(n))}),u=s(r=e),t=0<(o=s(i=r)).length?o[0]:l(i),a=t,c={get:function(){return a},set:function(e){a=e}},r.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===c.get()},fetch:function(e){e(g.map(u,function(e){return{type:"choiceitem",text:d(r,e),value:e}}))},onAction:function(e){m(c.get())},onItemAction:function(e,t){c.set(t),m(t)}}),r.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:function(){return g.map(u,function(e){return{type:"menuitem",text:d(r,e),onAction:(t=e,function(){c.set(t),m(t)})};var t})}})})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("legacyoutput",function(e){var s,t;(t=s=e).settings.inline_styles=!1,t.getParam("fontsize_formats")||(t.settings.fontsize_formats="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7"),t.getParam("font_formats")||(t.settings.font_formats="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats"),s.on("PreInit",function(){var e=s,t="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table",i=l.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),a=e.schema;e.formatter.register({alignleft:{selector:t,attributes:{align:"left"}},aligncenter:{selector:t,attributes:{align:"center"}},alignright:{selector:t,attributes:{align:"right"}},alignjustify:{selector:t,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all",preserve_attributes:["class","style"]},{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all",preserve_attributes:["class","style"]},{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",toggle:!1,attributes:{face:"%value"}},fontsize:{inline:"font",toggle:!1,attributes:{size:function(e){return String(l.inArray(i,e.value)+1)}}},forecolor:{inline:"font",attributes:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0}}),l.each("b,i,u,strike".split(","),function(e){a.addValidElements(e+"[*]")}),a.getElementRule("font")||a.addValidElements("font[face|size|color|style]"),l.each(t.split(","),function(e){var t=a.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/link/plugin.min.js
vendored
Normal file
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/lists/plugin.min.js
vendored
Normal file
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/media/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function o(n,e){for(var a="",o=0;o<e;o++)a+=n;return a}function s(n,e){var a=n.getParam("nonbreaking_wrap",!0,"boolean")||n.plugins.visualchars?'<span class="'+(n.plugins.visualchars&&n.plugins.visualchars.isEnabled()?"mce-nbsp-wrap mce-nbsp":"mce-nbsp-wrap")+'" contenteditable="false">'+o(" ",e)+"</span>":o(" ",e);n.undoManager.transact(function(){return n.insertContent(a)})}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.VK");n.add("nonbreaking",function(n){var e,a,o,t,i;function r(){return a.execCommand("mceNonBreaking")}(e=n).addCommand("mceNonBreaking",function(){s(e,1)}),(a=n).ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:r}),a.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:r}),0<(i="boolean"==typeof(t=(o=n).getParam("nonbreaking_force_tab",0))?!0===t?3:0:t)&&o.on("keydown",function(n){n.keyCode!==c.TAB||n.isDefaultPrevented()||n.shiftKey||(n.preventDefault(),n.stopImmediatePropagation(),s(o,i))})})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function l(t){return t.getParam("noneditable_noneditable_class","mceNonEditable")}function u(e){return function(t){return-1!==(" "+t.attr("class")+" ").indexOf(e)}}function e(e){var t,r="contenteditable",n=" "+f.trim(e.getParam("noneditable_editable_class","mceEditable"))+" ",a=" "+f.trim(l(e))+" ",i=u(n),o=u(a),c=(t=e.getParam("noneditable_regexp",[]))&&t.constructor===RegExp?[t]:t;e.on("PreInit",function(){0<c.length&&e.on("BeforeSetContent",function(t){!function(t,e,n){var r=e.length,a=n.content;if("raw"!==n.format){for(;r--;)a=a.replace(e[r],function(i,o,c){return function(t){var e=arguments,n=e[e.length-2],r=0<n?o.charAt(n-1):"";if('"'===r)return t;if(">"===r){var a=o.lastIndexOf("<",n);if(-1!==a&&-1!==o.substring(a,n).indexOf('contenteditable="false"'))return t}return'<span class="'+c+'" data-mce-content="'+i.dom.encode(e[0])+'">'+i.dom.encode("string"==typeof e[1]?e[1]:e[0])+"</span>"}}(t,a,l(t)));n.content=a}}(e,c,t)}),e.parser.addAttributeFilter("class",function(t){for(var e,n=t.length;n--;)e=t[n],i(e)?e.attr(r,"true"):o(e)&&e.attr(r,"false")}),e.serializer.addAttributeFilter(r,function(t){for(var e,n=t.length;n--;)e=t[n],(i(e)||o(e))&&(0<c.length&&e.attr("data-mce-content")?(e.name="#text",e.type=3,e.raw=!0,e.value=e.attr("data-mce-content")):e.attr(r,null))})})}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.util.Tools");t.add("noneditable",function(t){e(t)})}();
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function u(e){return e.getParam("pagebreak_split_block",!1)}function l(e){var a='<img src="'+n.transparentSrc+'" class="'+m+'" data-mce-resize="false" data-mce-placeholder />';return e?"<p>"+a+"</p>":a}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.Env"),m="mce-pagebreak";e.add("pagebreak",function(e){var a,n,o,i,t,r;function c(){return n.execCommand("mcePageBreak")}function g(){return u(o)}(a=e).addCommand("mcePageBreak",function(){a.insertContent(l(u(a)))}),(n=e).ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:c}),n.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:c}),i=(o=e).getParam("pagebreak_separator","\x3c!-- pagebreak --\x3e"),t=new RegExp(i.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(e){return"\\"+e}),"gi"),o.on("BeforeSetContent",function(e){e.content=e.content.replace(t,l(g()))}),o.on("PreInit",function(){o.serializer.addNodeFilter("img",function(e){for(var a,n,t,r=e.length;r--;)(t=(n=e[r]).attr("class"))&&-1!==t.indexOf(m)&&(a=n.parent,o.schema.getBlockElements()[a.name]&&g()?(a.type=3,a.value=i,a.raw=!0,n.remove()):(n.type=3,n.value=i,n.raw=!0))})}),(r=e).on("ResolveName",function(e){"IMG"===e.target.nodeName&&r.dom.hasClass(e.target,m)&&(e.name="pagebreak")})})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/paste/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("preview",function(e){var n,t;function i(){return t.execCommand("mcePreview")}(n=e).addCommand("mcePreview",function(){var e,t;t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","","string");n+='<base href="'+i(t.documentBaseURI.getURI())+'">';var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='<link type="text/css" rel="stylesheet" href="'+i(t.documentBaseURI.toAbsolute(e))+'"'+o+">"}),e&&(n+='<style type="text/css">'+e+"</style>");var a,r,s,c,d,l,m,y=-1===(c=(a=t).getParam("body_id","tinymce","string")).indexOf("=")?c:(s=(r=a).getParam("body_id","","hash"))[r.id]||s,u=-1===(m=(d=t).getParam("body_class","","string")).indexOf("=")?m:(l=d).getParam("body_class","","hash")[l.id]||"",v='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A" && !('+(f.mac?"e.metaKey":"e.ctrlKey && !e.altKey")+")) {e.preventDefault();}}}, false);<\/script> ",g=t.getBody().dir,p=g?' dir="'+i(g)+'"':"";return"<!DOCTYPE html><html><head>"+n+'</head><body id="'+i(y)+'" class="mce-content-body '+i(u)+'"'+p+">"+t.getContent()+v+"</body></html>"}(e=n),e.windowManager.open({title:"Preview",size:"large",body:{type:"panel",items:[{name:"preview",type:"iframe",sandboxed:!0}]},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{preview:t}}).focus("close")}),(t=e).ui.registry.addButton("preview",{icon:"preview",tooltip:"Preview",onAction:i}),t.ui.registry.addMenuItem("preview",{icon:"preview",text:"Preview",onAction:i})})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/print/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env");n.add("print",function(n){var t,i;function e(){return i.execCommand("mcePrint")}(t=n).addCommand("mcePrint",function(){r.browser.isIE()?t.getDoc().execCommand("print",!1,null):t.getWin().print()}),(i=n).ui.registry.addButton("print",{icon:"print",tooltip:"Print",onAction:e}),i.ui.registry.addMenuItem("print",{text:"Print...",icon:"print",onAction:e}),n.addShortcut("Meta+P","","mcePrint")})}();
|
||||
9
plugins/addon/example/template/clientarea/pc/default/js/tinymce/plugins/save/plugin.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
|
||||
* Licensed under the LGPL or a commercial license.
|
||||
* For LGPL see License.txt in the project root for license information.
|
||||
* For commercial licenses see https://www.tiny.cloud/
|
||||
*
|
||||
* Version: 5.10.0 (2021-10-11)
|
||||
*/
|
||||
!function(){"use strict";function o(e){return e.getParam("save_enablewhendirty",!0)}function a(e,n){e.notificationManager.open({text:n,type:"error"})}function t(t){t.addCommand("mceSave",function(){!function(e){var n=c.DOM.getParent(e.id,"form");if(!o(e)||e.isDirty()){if(e.save(),e.getParam("save_onsavecallback"))return e.execCallback("save_onsavecallback",e),e.nodeChanged();n?(e.setDirty(!1),n.onsubmit&&!n.onsubmit()||("function"==typeof n.submit?n.submit():a(e,"Error: Form submit field collision.")),e.nodeChanged()):a(e,"Error: No form element found.")}}(t)}),t.addCommand("mceCancel",function(){var e=t,n=r.trim(e.startContent);e.getParam("save_oncancelcallback")?e.execCallback("save_oncancelcallback",e):e.resetContent(n)})}function i(t){return function(e){function n(){e.setDisabled(o(t)&&!t.isDirty())}return n(),t.on("NodeChange dirty",n),function(){return t.off("NodeChange dirty",n)}}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),r=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("save",function(e){var n;(n=e).ui.registry.addButton("save",{icon:"save",tooltip:"Save",disabled:!0,onAction:function(){return n.execCommand("mceSave")},onSetup:i(n)}),n.ui.registry.addButton("cancel",{icon:"cancel",tooltip:"Cancel",disabled:!0,onAction:function(){return n.execCommand("mceCancel")},onSetup:i(n)}),n.addShortcut("Meta+S","","mceSave"),t(e)})}();
|
||||