Merge branch 'build' of http://git.sinoecare.com/sinoecare/digital_village_v2/dvcp_v2_webapp into build
This commit is contained in:
		| @@ -1,12 +1,12 @@ | ||||
| <template> | ||||
|   <div class="layout-config__group--wrapper"> | ||||
|     <ai-dialog | ||||
|       append-to-body | ||||
|       :visible.sync="isShowEditor" | ||||
|       width="1000px" | ||||
|       class="layout-config__edit" | ||||
|       title="编辑器" | ||||
|       @onConfirm="onConfirm"> | ||||
|         append-to-body | ||||
|         :visible.sync="isShowEditor" | ||||
|         width="1000px" | ||||
|         class="layout-config__edit" | ||||
|         title="编辑器" | ||||
|         @onConfirm="onConfirm"> | ||||
|       <div> | ||||
|         <code-editor v-model="json" lang="json" theme="github" width="100%" height="440"></code-editor> | ||||
|       </div> | ||||
| @@ -18,10 +18,10 @@ | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="options.dataType" placeholder="请选择数据类型"> | ||||
|             <el-option | ||||
|               v-for="item in dataTypes" | ||||
|               :key="item.value" | ||||
|               :label="item.label" | ||||
|               :value="item.value"> | ||||
|                 v-for="item in dataTypes" | ||||
|                 :key="item.value" | ||||
|                 :label="item.label" | ||||
|                 :value="item.value"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
| @@ -36,10 +36,10 @@ | ||||
|           <div class="layout-config__item--right"> | ||||
|             <el-select size="mini" v-model="options.sourceDataId" placeholder="请选择数据源" @change="onDataChange"> | ||||
|               <el-option | ||||
|                 v-for="item in sourceData" | ||||
|                 :key="item.id" | ||||
|                 :label="item.description" | ||||
|                 :value="item.id"> | ||||
|                   v-for="item in sourceData" | ||||
|                   :key="item.id" | ||||
|                   :label="item.description" | ||||
|                   :value="item.id"> | ||||
|               </el-option> | ||||
|             </el-select> | ||||
|           </div> | ||||
| @@ -63,17 +63,18 @@ | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="layout-config__group" v-if="options.dataType !== 'staticData' && options.type === 'monitor' && (options.monitorType === 'cmcc' || options.monitorType === 'slw')"> | ||||
|     <div class="layout-config__group" | ||||
|          v-if="options.dataType !== 'staticData' && options.type === 'monitor' && (options.monitorType === 'cmcc' || options.monitorType === 'slw')"> | ||||
|       <h2>字段设置</h2> | ||||
|       <div class="layout-config__item"> | ||||
|         <label>监控视频</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="options.moniterId" placeholder="请选择监控视频" @change="onMoniterId"> | ||||
|             <el-option | ||||
|               v-for="(item, index) in monitorList" | ||||
|               :key="index" | ||||
|               :label="item.name" | ||||
|               :value="item.id"> | ||||
|                 v-for="(item, index) in monitorList" | ||||
|                 :key="index" | ||||
|                 :label="item.name" | ||||
|                 :value="item.id"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
| @@ -86,10 +87,10 @@ | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" v-model="options.dataX" placeholder="请选择X轴" @change="onChooseChange"> | ||||
|             <el-option | ||||
|               v-for="(item, index) in keys" | ||||
|               :key="index" | ||||
|               :label="item" | ||||
|               :value="item"> | ||||
|                 v-for="(item, index) in keys" | ||||
|                 :key="index" | ||||
|                 :label="item" | ||||
|                 :value="item"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
| @@ -97,12 +98,13 @@ | ||||
|       <div class="layout-config__item"> | ||||
|         <label>Y轴设置</label> | ||||
|         <div class="layout-config__item--right"> | ||||
|           <el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100" v-model="options.dataY" collapse-tags placeholder="请选择Y轴" @change="onChooseChange"> | ||||
|           <el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100" v-model="options.dataY" collapse-tags placeholder="请选择Y轴" | ||||
|                      @change="onChooseChange"> | ||||
|             <el-option | ||||
|               v-for="(item, index) in keys" | ||||
|               :key="index" | ||||
|               :label="item" | ||||
|               :value="item"> | ||||
|                 v-for="(item, index) in keys" | ||||
|                 :key="index" | ||||
|                 :label="item" | ||||
|                 :value="item"> | ||||
|             </el-option> | ||||
|           </el-select> | ||||
|         </div> | ||||
| @@ -112,295 +114,318 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|   import CodeEditor from 'bin-ace-editor' | ||||
|   require('brace/mode/json') | ||||
|   require('brace/snippets/json') | ||||
|   require('brace/theme/github') | ||||
|   require('brace/theme/monokai') | ||||
| import CodeEditor from 'bin-ace-editor' | ||||
| import 'brace/mode/json' | ||||
| import 'brace/snippets/json'; | ||||
| import 'brace/theme/github'; | ||||
| import 'brace/theme/monokai'; | ||||
|  | ||||
|   export default { | ||||
|     name: 'dataConfig', | ||||
| export default { | ||||
|   name: 'dataConfig', | ||||
|  | ||||
|     props: { | ||||
|       options: Object, | ||||
|       instance: Function, | ||||
|       dict: Object, | ||||
|       params: Object, | ||||
|     }, | ||||
|   props: { | ||||
|     options: Object, | ||||
|     instance: Function, | ||||
|     dict: Object, | ||||
|     params: Object, | ||||
|   }, | ||||
|  | ||||
|     data () { | ||||
|       return { | ||||
|         dataTypes: [ | ||||
|           { | ||||
|             value: 'staticData', | ||||
|             label: '静态数据' | ||||
|           }, | ||||
|           { | ||||
|             value: 'dynamicData', | ||||
|             label: '动态数据' | ||||
|           }, | ||||
|           { | ||||
|             value: 'apiData', | ||||
|             label: '接口' | ||||
|           } | ||||
|         ], | ||||
|         isShowEditor: false, | ||||
|         json: {}, | ||||
|         sourceDataId: '', | ||||
|         sourceData: [], | ||||
|         keys: [], | ||||
|         monitorList: [], | ||||
|         list: [], | ||||
|         jsonData: `{"title":"测试json数据","children":[{"name":"子项名称", "desc":"子项说明" },{"name":"子项名称1", "desc":"子项说明1" }]}` | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     components: { | ||||
|       CodeEditor | ||||
|     }, | ||||
|  | ||||
|     mounted () { | ||||
|       this.getDataList() | ||||
|  | ||||
|       if ((this.options.dataY && this.options.dataY.length && this.options.dataX) || this.options.type === 'monitor') { | ||||
|         const api = this.options.dataType === 'apiData' ? this.options.api : `/app/appdiylargescreen/statisticsByLsid?id=${this.options.sourceDataId}` | ||||
|         this.instance.post(api).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             if (res.data.length && this.options.type !== 'monitor') { | ||||
|               this.list = res.data | ||||
|               this.keys = Object.keys(res.data[0]) | ||||
|  | ||||
|               this.$nextTick(() => { | ||||
|                 this.onChooseChange() | ||||
|               }) | ||||
|             } else if (this.options.type === 'monitor') { | ||||
|               this.monitorList = res.data | ||||
|  | ||||
|               if (this.options.src) { | ||||
|                 const obj = res.data.filter(v => this.options.title === v.name) | ||||
|  | ||||
|                 if (obj.length) { | ||||
|                   this.options.src = obj[0].url | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     methods: { | ||||
|       showEditor () { | ||||
|         this.json = JSON.stringify(this.options.staticData, null, 2) | ||||
|         this.isShowEditor = true | ||||
|       }, | ||||
|  | ||||
|       onMoniterId (e) { | ||||
|         this.instance.post(`/app/appzyvideoequipment/getWebSdkUrl?deviceId=${e}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.options.src = JSON.parse(res.data).url | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       getDataList () { | ||||
|         this.instance.post(`/app/appdiylargescreen/allDatasourceByPage`, null, { | ||||
|           params: { | ||||
|             current: 1, | ||||
|             size: 10000 | ||||
|           } | ||||
|         }).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             this.sourceData = res.data.records | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onApiChange () { | ||||
|         this.options.dataX = '' | ||||
|         this.options.dataY = [] | ||||
|         this.instance.post(this.options.api).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             if (res.data.length) { | ||||
|               if (this.options.type === 'table') { | ||||
|                 const keys = Object.keys(res.data[0]) | ||||
|                 const list = res.data | ||||
|                 this.options.apiData = keys.map(v => { | ||||
|                   let obj = {} | ||||
|                   list.forEach((item, index) => { | ||||
|                     obj[`v${index}`] = item[v] | ||||
|                   }) | ||||
|  | ||||
|                   return { | ||||
|                     row: v, | ||||
|                     ...obj | ||||
|                   } | ||||
|                 }) | ||||
|               } else if (this.options.type === 'summary') { | ||||
|                 if (this.options.display === 'summary9') { | ||||
|                   this.options.apiData = res.data | ||||
|                 } else { | ||||
|                   this.options.apiData = Object.keys(res.data[0]).map(item => { | ||||
|                     return { | ||||
|                       key: item, | ||||
|                       value: res.data[0][item] | ||||
|                     } | ||||
|                   }) | ||||
|                 } | ||||
|               } else if (this.options.type === 'monitor') { | ||||
|                 this.monitorList = res.data | ||||
|               } else { | ||||
|                 this.list = res.data | ||||
|                 this.keys = Object.keys(res.data[0]) | ||||
|               } | ||||
|             } | ||||
|           } else { | ||||
|             this.options.dynamicData = [] | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|  | ||||
|       onChooseChange () { | ||||
|         let arr = [] | ||||
|         if (this.options.dataX && this.options.dataY.length) { | ||||
|           this.list.forEach(item => { | ||||
|             let obj = {} | ||||
|             this.options.dataY.forEach(v => { | ||||
|               obj[v] = item[v] | ||||
|             }) | ||||
|             arr.push({ | ||||
|               [this.options.dataX]: item[this.options.dataX], | ||||
|               ...obj | ||||
|             }) | ||||
|           }) | ||||
|  | ||||
|           this.options[this.options.dataType] = arr | ||||
|   data() { | ||||
|     return { | ||||
|       dataTypes: [ | ||||
|         { | ||||
|           value: 'staticData', | ||||
|           label: '静态数据' | ||||
|         }, | ||||
|         { | ||||
|           value: 'dynamicData', | ||||
|           label: '动态数据' | ||||
|         }, | ||||
|         { | ||||
|           value: 'apiData', | ||||
|           label: '接口' | ||||
|         } | ||||
|       }, | ||||
|       ], | ||||
|       isShowEditor: false, | ||||
|       json: {}, | ||||
|       sourceDataId: '', | ||||
|       sourceData: [], | ||||
|       keys: [], | ||||
|       monitorList: [], | ||||
|       list: [], | ||||
|       jsonData: `{"title":"测试json数据","children":[{"name":"子项名称", "desc":"子项说明" },{"name":"子项名称1", "desc":"子项说明1" }]}` | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|       onDataChange (e) { | ||||
|         this.options.dataX = '' | ||||
|         this.options.dataY = [] | ||||
|         this.instance.post(`/app/appdiylargescreen/statisticsByLsid?id=${e}`).then(res => { | ||||
|           if (res.code == 0) { | ||||
|             if (res.data.length) { | ||||
|               if (this.options.type === 'table') { | ||||
|                 const keys = Object.keys(res.data[0]) | ||||
|                 const list = res.data | ||||
|                 this.options.dynamicData = keys.map(v => { | ||||
|                   let obj = {} | ||||
|                   list.forEach((item, index) => { | ||||
|                     obj[`v${index}`] = item[v] | ||||
|                   }) | ||||
|   components: { | ||||
|     CodeEditor | ||||
|   }, | ||||
|  | ||||
|                   return { | ||||
|                     row: v, | ||||
|                     ...obj | ||||
|                   } | ||||
|   mounted() { | ||||
|     this.getDataList() | ||||
|  | ||||
|     if ((this.options.dataY && this.options.dataY.length && this.options.dataX) || this.options.type === 'monitor') { | ||||
|       const api = this.options.dataType === 'apiData' ? this.options.api : `/app/appdiylargescreen/statisticsByLsid?id=${this.options.sourceDataId}` | ||||
|       this.instance.post(api).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           if (res.data.length && this.options.type !== 'monitor') { | ||||
|             this.list = res.data | ||||
|             this.keys = Object.keys(res.data[0]) | ||||
|  | ||||
|             this.$nextTick(() => { | ||||
|               this.onChooseChange() | ||||
|             }) | ||||
|           } else if (this.options.type === 'monitor') { | ||||
|             this.monitorList = res.data | ||||
|  | ||||
|             if (this.options.src) { | ||||
|               const obj = res.data.filter(v => this.options.title === v.name) | ||||
|  | ||||
|               if (obj.length) { | ||||
|                 this.options.src = obj[0].url | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     showEditor() { | ||||
|       this.json = JSON.stringify(this.options.staticData, null, 2) | ||||
|       this.isShowEditor = true | ||||
|     }, | ||||
|  | ||||
|     onMoniterId(e) { | ||||
|       this.instance.post(`/app/appzyvideoequipment/getWebSdkUrl?deviceId=${e}`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.options.src = JSON.parse(res.data).url | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getDataList() { | ||||
|       this.instance.post(`/app/appdiylargescreen/allDatasourceByPage`, null, { | ||||
|         params: { | ||||
|           current: 1, | ||||
|           size: 10000 | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.sourceData = res.data.records | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onApiChange() { | ||||
|       this.options.dataX = '' | ||||
|       this.options.dataY = [] | ||||
|       this.instance.post(this.options.api).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           if (res.data.length) { | ||||
|             if (this.options.type === 'table') { | ||||
|               const keys = Object.keys(res.data[0]) | ||||
|               const list = res.data | ||||
|               this.options.apiData = keys.map(v => { | ||||
|                 let obj = {} | ||||
|                 list.forEach((item, index) => { | ||||
|                   obj[`v${index}`] = item[v] | ||||
|                 }) | ||||
|               } else if (this.options.type === 'summary') { | ||||
|                 this.options.dynamicData = Object.keys(res.data[0]).map(item => { | ||||
|  | ||||
|                 return { | ||||
|                   row: v, | ||||
|                   ...obj | ||||
|                 } | ||||
|               }) | ||||
|             } else if (this.options.type === 'summary') { | ||||
|               if (this.options.display === 'summary9') { | ||||
|                 this.options.apiData = res.data | ||||
|               } else { | ||||
|                 this.options.apiData = Object.keys(res.data[0]).map(item => { | ||||
|                   return { | ||||
|                     key: item, | ||||
|                     value: res.data[0][item] | ||||
|                   } | ||||
|                 }) | ||||
|               } else { | ||||
|                 this.list = res.data | ||||
|                 this.keys = Object.keys(res.data[0]) | ||||
|               } | ||||
|             } else if (this.options.type === 'monitor') { | ||||
|               this.monitorList = res.data | ||||
|             } else { | ||||
|               this.options.dynamicData = [] | ||||
|               this.list = res.data | ||||
|               this.keys = Object.keys(res.data[0]) | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|       }, | ||||
|         } else { | ||||
|           this.options.dynamicData = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|       onConfirm () { | ||||
|         this.$set(this.options, 'staticData', JSON.parse(this.json)) | ||||
|         this.isShowEditor = false | ||||
|         this.$emit('change') | ||||
|     onChooseChange() { | ||||
|       let arr = [] | ||||
|       if (this.options.dataX && this.options.dataY.length) { | ||||
|         this.list.forEach(item => { | ||||
|           let obj = {} | ||||
|           this.options.dataY.forEach(v => { | ||||
|             obj[v] = item[v] | ||||
|           }) | ||||
|           arr.push({ | ||||
|             [this.options.dataX]: item[this.options.dataX], | ||||
|             ...obj | ||||
|           }) | ||||
|         }) | ||||
|  | ||||
|         this.options[this.options.dataType] = arr | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     onDataChange(e) { | ||||
|       this.options.dataX = '' | ||||
|       this.options.dataY = [] | ||||
|       this.instance.post(`/app/appdiylargescreen/statisticsByLsid?id=${e}`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           if (res.data.length) { | ||||
|             if (this.options.type === 'table') { | ||||
|               const keys = Object.keys(res.data[0]) | ||||
|               const list = res.data | ||||
|               this.options.dynamicData = keys.map(v => { | ||||
|                 let obj = {} | ||||
|                 list.forEach((item, index) => { | ||||
|                   obj[`v${index}`] = item[v] | ||||
|                 }) | ||||
|  | ||||
|                 return { | ||||
|                   row: v, | ||||
|                   ...obj | ||||
|                 } | ||||
|               }) | ||||
|             } else if (this.options.type === 'summary') { | ||||
|               this.options.dynamicData = Object.keys(res.data[0]).map(item => { | ||||
|                 return { | ||||
|                   key: item, | ||||
|                   value: res.data[0][item] | ||||
|                 } | ||||
|               }) | ||||
|             } else { | ||||
|               this.list = res.data | ||||
|               this.keys = Object.keys(res.data[0]) | ||||
|             } | ||||
|           } else { | ||||
|             this.options.dynamicData = [] | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onConfirm() { | ||||
|       this.$set(this.options, 'staticData', JSON.parse(this.json)) | ||||
|       this.isShowEditor = false | ||||
|       this.$emit('change') | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
|    .el-dialog__body { | ||||
|       .jsoneditor-vue { | ||||
|         height: 480px; | ||||
| .el-dialog__body { | ||||
|   .jsoneditor-vue { | ||||
|     height: 480px; | ||||
|  | ||||
|         .jsoneditor-poweredBy { | ||||
|           display: none; | ||||
|     .jsoneditor-poweredBy { | ||||
|       display: none; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .layout-config__group--wrapper { | ||||
|   .layout-config__code .bin-ace-editor { | ||||
|   } | ||||
|  | ||||
|   .layout-config__group { | ||||
|     padding: 10px 10px 20px; | ||||
|     border-bottom: 1px solid #000000; | ||||
|  | ||||
|     &:last-child { | ||||
|       border: none; | ||||
|     } | ||||
|  | ||||
|     .layout-config__code { | ||||
|       position: relative; | ||||
|       padding-left: 10px; | ||||
|  | ||||
|       .layout-config__code--btn { | ||||
|         position: absolute; | ||||
|         right: 0; | ||||
|         top: 0; | ||||
|         color: gray; | ||||
|         z-index: 111; | ||||
|  | ||||
|         &:hover { | ||||
|           opacity: 0.8; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   .layout-config__group--wrapper { | ||||
|     .layout-config__code .bin-ace-editor { | ||||
|  | ||||
|     & > h2 { | ||||
|       margin-bottom: 20px; | ||||
|       color: #FFFFFF; | ||||
|       font-size: 15px; | ||||
|       font-weight: 700; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .layout-config__item { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: space-between; | ||||
|     margin-bottom: 10px; | ||||
|  | ||||
|     &:last-child { | ||||
|       margin-bottom: 0; | ||||
|     } | ||||
|  | ||||
|     .layout-config__group { | ||||
|       padding: 10px 10px 20px; | ||||
|       border-bottom: 1px solid #000000; | ||||
|  | ||||
|       &:last-child { | ||||
|         border: none; | ||||
|       } | ||||
|  | ||||
|       .layout-config__code { | ||||
|         position: relative; | ||||
|         padding-left: 10px; | ||||
|  | ||||
|         .layout-config__code--btn { | ||||
|           position: absolute; | ||||
|           right: 0; | ||||
|           top: 0; | ||||
|           color: gray; | ||||
|           z-index: 111; | ||||
|  | ||||
|           &:hover { | ||||
|             opacity: 0.8; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       & > h2 { | ||||
|         margin-bottom: 20px; | ||||
|         color: #FFFFFF; | ||||
|         font-size: 15px; | ||||
|         font-weight: 700; | ||||
|       } | ||||
|     label { | ||||
|       flex-shrink: 0; | ||||
|       width: 60px; | ||||
|       color: #FFFFFF; | ||||
|       font-size: 12px; | ||||
|       text-align: right; | ||||
|     } | ||||
|  | ||||
|     .layout-config__item { | ||||
|     .layout-config__item--right { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       margin-bottom: 10px; | ||||
|       justify-content: flex-end; | ||||
|       width: 200px; | ||||
|       text-align: right; | ||||
|     } | ||||
|  | ||||
|     .el-select .el-tag { | ||||
|       color: #fff; | ||||
|       background: transparent; | ||||
|     } | ||||
|  | ||||
|     input { | ||||
|       background: #262C33; | ||||
|       font-size: 12px; | ||||
|       color: #fff; | ||||
|       border: 1px solid #030411; | ||||
|     } | ||||
|  | ||||
|     .el-input__icon { | ||||
|       color: #fff; | ||||
|     } | ||||
|  | ||||
|     .el-switch__label { | ||||
|       color: #fff; | ||||
|     } | ||||
|  | ||||
|     .el-select { | ||||
|       width: 100%; | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-bottom: 0; | ||||
|       } | ||||
|  | ||||
|       label { | ||||
|         flex-shrink: 0; | ||||
|         width: 60px; | ||||
|         color: #FFFFFF; | ||||
|         font-size: 12px; | ||||
|         text-align: right; | ||||
|       } | ||||
|  | ||||
|       .layout-config__item--right { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         justify-content: flex-end; | ||||
|         width: 200px; | ||||
|         text-align: right; | ||||
|       } | ||||
|  | ||||
|       .el-select .el-tag { | ||||
|         color: #fff; | ||||
|         background: transparent; | ||||
|         margin-right: 0; | ||||
|       } | ||||
|  | ||||
|       input { | ||||
| @@ -413,29 +438,7 @@ | ||||
|       .el-input__icon { | ||||
|         color: #fff; | ||||
|       } | ||||
|  | ||||
|       .el-switch__label { | ||||
|         color: #fff; | ||||
|       } | ||||
|  | ||||
|       .el-select { | ||||
|         width: 100%; | ||||
|  | ||||
|         &:last-child { | ||||
|           margin-right: 0; | ||||
|         } | ||||
|  | ||||
|         input { | ||||
|           background: #262C33; | ||||
|           font-size: 12px; | ||||
|           color: #fff; | ||||
|           border: 1px solid #030411; | ||||
|         } | ||||
|  | ||||
|         .el-input__icon { | ||||
|           color: #fff; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -36,7 +36,6 @@ | ||||
|             <code-editor v-model="form.config" auto-format :lint="false"/> | ||||
|           </el-form-item> | ||||
|         </el-form> | ||||
|  | ||||
|         <el-row type="flex" justify="center" class="footer"> | ||||
|           <el-button @click="drawer=false">取消</el-button> | ||||
|           <el-button type="primary" @click="submit">提交</el-button> | ||||
| @@ -47,8 +46,11 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import {CodeEditor} from 'bin-code-editor' | ||||
| import 'bin-code-editor/lib/styles/index.css' | ||||
| import CodeEditor from 'bin-ace-editor' | ||||
| import 'brace/mode/json' | ||||
| import 'brace/snippets/json'; | ||||
| import 'brace/theme/github'; | ||||
| import 'brace/theme/monokai'; | ||||
|  | ||||
| const label = "应用定制配置"; | ||||
| export default { | ||||
|   | ||||
| @@ -1,675 +0,0 @@ | ||||
| <template> | ||||
|   <section class="AiCodeEditor "> | ||||
|     <div class="dark" ref="editorContent"/> | ||||
|   </section> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import CodeMirror from "codemirror" | ||||
| // modes | ||||
| import 'codemirror/mode/javascript/javascript.js' | ||||
| import 'codemirror/mode/css/css.js' | ||||
| import 'codemirror/mode/htmlmixed/htmlmixed.js' | ||||
|  | ||||
| // addons | ||||
| import 'codemirror/addon/edit/closebrackets.js' | ||||
| import 'codemirror/addon/edit/closetag.js' | ||||
| import 'codemirror/addon/comment/comment.js' | ||||
| import 'codemirror/addon/fold/foldcode.js' | ||||
| import 'codemirror/addon/fold/foldgutter.js' | ||||
| import 'codemirror/addon/fold/brace-fold.js' | ||||
| import 'codemirror/addon/fold/indent-fold.js' | ||||
| import 'codemirror/addon/fold/comment-fold.js' | ||||
|  | ||||
| export default { | ||||
|   name: "AiCodeEditor", | ||||
|   model: { | ||||
|     prop: "value", | ||||
|     event: "change" | ||||
|   }, | ||||
|   props: { | ||||
|     value: {default: ""}, | ||||
|     mode: {default: "htmlmixed"}, | ||||
|     readonly: Boolean | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       editor: null, | ||||
|     } | ||||
|   }, | ||||
|   watch: { | ||||
|     value(v) { | ||||
|       if (v != this.editor?.getValue()) { | ||||
|         this.editor?.setValue(v) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     initEditor() { | ||||
|       const options = { | ||||
|         ...this.$props, | ||||
|         tabSize: 2, | ||||
|         autoCloseBrackets: true, | ||||
|         autoCloseTags: true, | ||||
|         foldGutter: true, | ||||
|         lineWrapping: true, | ||||
|         lineNumbers: true, | ||||
|         // theme: 'idea', | ||||
|         gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'], | ||||
|       } | ||||
|       this.editor = new CodeMirror(this.$refs.editorContent, options) | ||||
|       this.editor.on('change', () => { | ||||
|         this.$emit("change", this.editor.getValue()) | ||||
|       }) | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.initEditor() | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .AiCodeEditor { | ||||
|   background-color: #242424; | ||||
|  | ||||
|   .CodeMirror { | ||||
|     color: var(--symbols); | ||||
|     --symbols: #777; | ||||
|     --base: #545281; | ||||
|     --comment: hsl(210, 25%, 60%); | ||||
|     --keyword: #af4ab1; | ||||
|     --variable: var(--base); | ||||
|     --function: #c25205; | ||||
|     --string: #2ba46d; | ||||
|     --number: #c25205; | ||||
|     --tags: #dd0000; | ||||
|     --brackets: var(--comment); | ||||
|     --qualifier: #ff6032; | ||||
|     --important: var(--string); | ||||
|     --attribute: #9c3eda; | ||||
|     --property: #6182b8; | ||||
|  | ||||
|     --selected-bg: #d7d4f0; | ||||
|     --selected-bg-non-focus: #d9d9d9; | ||||
|     --cursor: #000; | ||||
|  | ||||
|     direction: ltr; | ||||
|     font-family: var(--font-code); | ||||
|     height: auto; | ||||
|   } | ||||
|  | ||||
|   .dark .CodeMirror { | ||||
|     color: var(--symbols); | ||||
|     --symbols: #89ddff; | ||||
|     --base: #a6accd; | ||||
|     --comment: #6d6d6d; | ||||
|     --keyword: #89ddff; | ||||
|     --string: #c3e88d; | ||||
|     --variable: #82aaff; | ||||
|     --number: #f78c6c; | ||||
|     --tags: #f07178; | ||||
|     --brackets: var(--symbols); | ||||
|     --property: #f07178; | ||||
|     --attribute: #c792ea; | ||||
|     --cursor: #fff; | ||||
|  | ||||
|     --selected-bg: rgba(255, 255, 255, 0.1); | ||||
|     --selected-bg-non-focus: rgba(255, 255, 255, 0.15); | ||||
|   } | ||||
|  | ||||
|   /* PADDING */ | ||||
|  | ||||
|   .CodeMirror-lines { | ||||
|     padding: 4px 0; /* Vertical padding around content */ | ||||
|   } | ||||
|  | ||||
|   .CodeMirror pre { | ||||
|     padding: 0 4px; /* Horizontal padding of content */ | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-scrollbar-filler, | ||||
|   .CodeMirror-gutter-filler { | ||||
|     background-color: white; /* The little square between H and V scrollbars */ | ||||
|   } | ||||
|  | ||||
|   /* GUTTER */ | ||||
|  | ||||
|   .CodeMirror-gutters { | ||||
|     border-right: 1px solid var(--border); | ||||
|     background-color: transparent; | ||||
|     white-space: nowrap; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-linenumber { | ||||
|     padding: 0 3px 0 5px; | ||||
|     min-width: 20px; | ||||
|     text-align: right; | ||||
|     color: var(--comment); | ||||
|     white-space: nowrap; | ||||
|     opacity: 0.6; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-guttermarker { | ||||
|     color: black; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-guttermarker-subtle { | ||||
|     color: #999; | ||||
|   } | ||||
|  | ||||
|   /* FOLD GUTTER */ | ||||
|  | ||||
|   .CodeMirror-foldmarker { | ||||
|     color: #414141; | ||||
|     text-shadow: #ff9966 1px 1px 2px, #ff9966 -1px -1px 2px, #ff9966 1px -1px 2px, | ||||
|     #ff9966 -1px 1px 2px; | ||||
|     font-family: arial; | ||||
|     line-height: 0.3; | ||||
|     cursor: pointer; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-foldgutter { | ||||
|     width: 0.7em; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-foldgutter-open, | ||||
|   .CodeMirror-foldgutter-folded { | ||||
|     cursor: pointer; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-foldgutter-open:after, | ||||
|   .CodeMirror-foldgutter-folded:after { | ||||
|     content: '>'; | ||||
|     font-size: 0.8em; | ||||
|     opacity: 0.8; | ||||
|     transition: transform 0.2s; | ||||
|     display: inline-block; | ||||
|     top: -0.1em; | ||||
|     position: relative; | ||||
|     transform: rotate(90deg); | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-foldgutter-folded:after { | ||||
|     transform: none; | ||||
|   } | ||||
|  | ||||
|   /* CURSOR */ | ||||
|  | ||||
|   .CodeMirror-cursor { | ||||
|     border-left: 1px solid var(--cursor); | ||||
|     border-right: none; | ||||
|     width: 0; | ||||
|   } | ||||
|  | ||||
|   /* Shown when moving in bi-directional text */ | ||||
|   .CodeMirror div.CodeMirror-secondarycursor { | ||||
|     border-left: 1px solid silver; | ||||
|   } | ||||
|  | ||||
|   .cm-fat-cursor .CodeMirror-cursor { | ||||
|     width: auto; | ||||
|     border: 0 !important; | ||||
|     background: #7e7; | ||||
|   } | ||||
|  | ||||
|   .cm-fat-cursor div.CodeMirror-cursors { | ||||
|     z-index: 1; | ||||
|   } | ||||
|  | ||||
|   .cm-fat-cursor-mark { | ||||
|     background-color: rgba(20, 255, 20, 0.5); | ||||
|     -webkit-animation: blink 1.06s steps(1) infinite; | ||||
|     -moz-animation: blink 1.06s steps(1) infinite; | ||||
|     animation: blink 1.06s steps(1) infinite; | ||||
|   } | ||||
|  | ||||
|   .cm-animate-fat-cursor { | ||||
|     width: auto; | ||||
|     border: 0; | ||||
|     -webkit-animation: blink 1.06s steps(1) infinite; | ||||
|     -moz-animation: blink 1.06s steps(1) infinite; | ||||
|     animation: blink 1.06s steps(1) infinite; | ||||
|     background-color: #7e7; | ||||
|   } | ||||
|  | ||||
|   @-moz-keyframes blink { | ||||
|     0% { | ||||
|     } | ||||
|     50% { | ||||
|       background-color: transparent; | ||||
|     } | ||||
|     100% { | ||||
|     } | ||||
|   } | ||||
|   @-webkit-keyframes blink { | ||||
|     0% { | ||||
|     } | ||||
|     50% { | ||||
|       background-color: transparent; | ||||
|     } | ||||
|     100% { | ||||
|     } | ||||
|   } | ||||
|   @keyframes blink { | ||||
|     0% { | ||||
|     } | ||||
|     50% { | ||||
|       background-color: transparent; | ||||
|     } | ||||
|     100% { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .cm-tab { | ||||
|     display: inline-block; | ||||
|     text-decoration: inherit; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-rulers { | ||||
|     position: absolute; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     top: -50px; | ||||
|     bottom: -20px; | ||||
|     overflow: hidden; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-ruler { | ||||
|     border-left: 1px solid #ccc; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     position: absolute; | ||||
|   } | ||||
|  | ||||
|   /* DEFAULT THEME */ | ||||
|   .cm-s-default.CodeMirror { | ||||
|     background-color: transparent; | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-header { | ||||
|     color: blue; | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-quote { | ||||
|     color: #090; | ||||
|   } | ||||
|  | ||||
|   .cm-negative { | ||||
|     color: #d44; | ||||
|   } | ||||
|  | ||||
|   .cm-positive { | ||||
|     color: #292; | ||||
|   } | ||||
|  | ||||
|   .cm-header, | ||||
|   .cm-strong { | ||||
|     font-weight: bold; | ||||
|   } | ||||
|  | ||||
|   .cm-em { | ||||
|     font-style: italic; | ||||
|   } | ||||
|  | ||||
|   .cm-link { | ||||
|     text-decoration: underline; | ||||
|   } | ||||
|  | ||||
|   .cm-strikethrough { | ||||
|     text-decoration: line-through; | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-atom, | ||||
|   .cm-s-default .cm-def, | ||||
|   .cm-s-default .cm-variable-2, | ||||
|   .cm-s-default .cm-variable-3, | ||||
|   .cm-s-default .cm-punctuation { | ||||
|     color: var(--base); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-property { | ||||
|     color: var(--property); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-hr, | ||||
|   .cm-s-default .cm-comment { | ||||
|     color: var(--comment); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-attribute { | ||||
|     color: var(--attribute); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-keyword { | ||||
|     color: var(--keyword); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-variable { | ||||
|     color: var(--variable); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-tag { | ||||
|     color: var(--tags); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-bracket { | ||||
|     color: var(--brackets); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-number { | ||||
|     color: var(--number); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-string, | ||||
|   .cm-s-default .cm-string-2 { | ||||
|     color: var(--string); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-type { | ||||
|     color: #085; | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-meta { | ||||
|     color: #555; | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-qualifier { | ||||
|     color: var(--qualifier); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-builtin { | ||||
|     color: #7539ff; | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-link { | ||||
|     color: var(--flash); | ||||
|   } | ||||
|  | ||||
|   .cm-s-default .cm-error { | ||||
|     color: #ff008c; | ||||
|   } | ||||
|  | ||||
|   .cm-invalidchar { | ||||
|     color: #ff008c; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-composing { | ||||
|     border-bottom: 2px solid; | ||||
|   } | ||||
|  | ||||
|   /* Default styles for common addons */ | ||||
|  | ||||
|   div.CodeMirror span.CodeMirror-matchingbracket { | ||||
|     color: #0b0; | ||||
|   } | ||||
|  | ||||
|   div.CodeMirror span.CodeMirror-nonmatchingbracket { | ||||
|     color: #a22; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-matchingtag { | ||||
|     background: rgba(255, 150, 0, 0.3); | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-activeline-background { | ||||
|     background: #e8f2ff; | ||||
|   } | ||||
|  | ||||
|   /* STOP */ | ||||
|  | ||||
|   /* The rest of this file contains styles related to the mechanics of | ||||
|      the editor. You probably shouldn't touch them. */ | ||||
|  | ||||
|   .CodeMirror { | ||||
|     position: relative; | ||||
|     overflow: hidden; | ||||
|     background: white; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-scroll { | ||||
|     overflow: scroll !important; /* Things will break if this is overridden */ | ||||
|     /* 30px is the magic margin used to hide the element's real scrollbars */ | ||||
|     /* See overflow: hidden in .CodeMirror */ | ||||
|     margin-bottom: -30px; | ||||
|     margin-right: -30px; | ||||
|     padding-bottom: 30px; | ||||
|     height: 100%; | ||||
|     outline: none; /* Prevent dragging from highlighting the element */ | ||||
|     position: relative; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-sizer { | ||||
|     position: relative; | ||||
|     border-right: 30px solid transparent; | ||||
|   } | ||||
|  | ||||
|   /* The fake, visible scrollbars. Used to force redraw during scrolling | ||||
|      before actual scrolling happens, thus preventing shaking and | ||||
|      flickering artifacts. */ | ||||
|   .CodeMirror-vscrollbar, | ||||
|   .CodeMirror-hscrollbar, | ||||
|   .CodeMirror-scrollbar-filler, | ||||
|   .CodeMirror-gutter-filler { | ||||
|     position: absolute; | ||||
|     z-index: 6; | ||||
|     display: none; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-vscrollbar { | ||||
|     right: 0; | ||||
|     top: 0; | ||||
|     overflow-x: hidden; | ||||
|     overflow-y: scroll; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-hscrollbar { | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     overflow-y: hidden; | ||||
|     overflow-x: scroll; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-scrollbar-filler { | ||||
|     right: 0; | ||||
|     bottom: 0; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter-filler { | ||||
|     left: 0; | ||||
|     bottom: 0; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutters { | ||||
|     position: absolute; | ||||
|     left: 0; | ||||
|     top: 0; | ||||
|     min-height: 100%; | ||||
|     z-index: 3; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter { | ||||
|     white-space: normal; | ||||
|     height: 100%; | ||||
|     display: inline-block; | ||||
|     vertical-align: top; | ||||
|     margin-bottom: -30px; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter-wrapper { | ||||
|     position: absolute; | ||||
|     z-index: 4; | ||||
|     background: none !important; | ||||
|     border: none !important; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter-background { | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     z-index: 4; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter-elt { | ||||
|     position: absolute; | ||||
|     cursor: default; | ||||
|     z-index: 4; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter-wrapper ::selection { | ||||
|     background-color: transparent; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-gutter-wrapper ::-moz-selection { | ||||
|     background-color: transparent; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-lines { | ||||
|     cursor: text; | ||||
|     min-height: 1px; /* prevents collapsing before first draw */ | ||||
|   } | ||||
|  | ||||
|   .CodeMirror pre { | ||||
|     /* Reset some styles that the rest of the page might have set */ | ||||
|     -moz-border-radius: 0; | ||||
|     -webkit-border-radius: 0; | ||||
|     border-radius: 0; | ||||
|     border-width: 0; | ||||
|     background: transparent; | ||||
|     font-family: inherit; | ||||
|     font-size: inherit; | ||||
|     margin: 0; | ||||
|     white-space: pre; | ||||
|     word-wrap: normal; | ||||
|     line-height: inherit; | ||||
|     color: inherit; | ||||
|     z-index: 2; | ||||
|     position: relative; | ||||
|     overflow: visible; | ||||
|     -webkit-tap-highlight-color: transparent; | ||||
|     -webkit-font-variant-ligatures: contextual; | ||||
|     font-variant-ligatures: contextual; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-wrap pre { | ||||
|     word-wrap: break-word; | ||||
|     white-space: pre-wrap; | ||||
|     word-break: normal; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-linebackground { | ||||
|     position: absolute; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     z-index: 0; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-linewidget { | ||||
|     position: relative; | ||||
|     z-index: 2; | ||||
|     padding: 0.1px; /* Force widget margins to stay inside of the container */ | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-rtl pre { | ||||
|     direction: rtl; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-code { | ||||
|     outline: none; | ||||
|   } | ||||
|  | ||||
|   /* Force content-box sizing for the elements where we expect it */ | ||||
|   .CodeMirror-scroll, | ||||
|   .CodeMirror-sizer, | ||||
|   .CodeMirror-gutter, | ||||
|   .CodeMirror-gutters, | ||||
|   .CodeMirror-linenumber { | ||||
|     -moz-box-sizing: content-box; | ||||
|     box-sizing: content-box; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-measure { | ||||
|     position: absolute; | ||||
|     width: 100%; | ||||
|     height: 0; | ||||
|     overflow: hidden; | ||||
|     visibility: hidden; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-cursor { | ||||
|     position: absolute; | ||||
|     pointer-events: none; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-measure pre { | ||||
|     position: static; | ||||
|   } | ||||
|  | ||||
|   div.CodeMirror-cursors { | ||||
|     visibility: hidden; | ||||
|     position: relative; | ||||
|     z-index: 3; | ||||
|   } | ||||
|  | ||||
|   div.CodeMirror-dragcursors { | ||||
|     visibility: visible; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-focused div.CodeMirror-cursors { | ||||
|     visibility: visible; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-selected { | ||||
|     background: var(--selected-bg-non-focus); | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-focused .CodeMirror-selected { | ||||
|     background: var(--selected-bg); | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-crosshair { | ||||
|     cursor: crosshair; | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-line::selection, | ||||
|   .CodeMirror-line > span::selection, | ||||
|   .CodeMirror-line > span > span::selection { | ||||
|     background: var(--selected-bg); | ||||
|   } | ||||
|  | ||||
|   .CodeMirror-line::-moz-selection, | ||||
|   .CodeMirror-line > span::-moz-selection, | ||||
|   .CodeMirror-line > span > span::-moz-selection { | ||||
|     background: var(--selected-bg); | ||||
|   } | ||||
|  | ||||
|   .cm-searching { | ||||
|     background-color: #ffa; | ||||
|     background-color: rgba(255, 255, 0, 0.4); | ||||
|   } | ||||
|  | ||||
|   /* Used to force a border model for a node */ | ||||
|   .cm-force-border { | ||||
|     padding-right: 0.1px; | ||||
|   } | ||||
|  | ||||
|   @media print { | ||||
|     /* Hide the cursor when printing */ | ||||
|     .CodeMirror div.CodeMirror-cursors { | ||||
|       visibility: hidden; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* See issue #2901 */ | ||||
|   .cm-tab-wrap-hack:after { | ||||
|     content: ''; | ||||
|   } | ||||
|  | ||||
|   /* Help users use markselection to safely style text background */ | ||||
|   span.CodeMirror-selectedtext { | ||||
|     background: none; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
		Reference in New Issue
	
	Block a user