BorderSetting.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <template>
  2. <div>
  3. <el-form-item
  4. :label-width="labelWidth"
  5. label="边框"
  6. >
  7. <el-input
  8. v-model="title"
  9. clearable
  10. read-only
  11. placeholder="请选择边框"
  12. @focus="init"
  13. >
  14. <template slot="append">
  15. <el-button
  16. size="small"
  17. type="primary"
  18. @click="init"
  19. >
  20. 选择
  21. </el-button>
  22. </template>
  23. </el-input>
  24. <BorderSelect
  25. v-model="config.type"
  26. ref="BorderSelect"
  27. />
  28. </el-form-item>
  29. <el-form-item
  30. :label-width="labelWidth"
  31. label="上边距"
  32. >
  33. <el-input-number
  34. v-model="config.padding[0]"
  35. class="bs-el-input-number"
  36. :min="0"
  37. :step="1"
  38. />
  39. </el-form-item>
  40. <el-form-item
  41. :label-width="labelWidth"
  42. label="右边距"
  43. >
  44. <el-input-number
  45. v-model="config.padding[1]"
  46. class="bs-el-input-number"
  47. :min="0"
  48. :step="1"
  49. />
  50. </el-form-item>
  51. <el-form-item
  52. :label-width="labelWidth"
  53. label="下边距"
  54. >
  55. <el-input-number
  56. v-model="config.padding[2]"
  57. class="bs-el-input-number"
  58. :min="0"
  59. :step="1"
  60. />
  61. </el-form-item>
  62. <el-form-item
  63. :label-width="labelWidth"
  64. label="左边距"
  65. >
  66. <el-input-number
  67. v-model="config.padding[3]"
  68. class="bs-el-input-number"
  69. :min="0"
  70. :step="1"
  71. />
  72. </el-form-item>
  73. <div v-if="config.type">
  74. <el-form-item
  75. :label-width="labelWidth"
  76. label="是否显示标题"
  77. v-if="config.type!='GcBorder16'"
  78. >
  79. <el-switch
  80. v-model="config.isTitle"
  81. class="bs-el-switch"
  82. :active-value="true"
  83. :inactive-value="false"
  84. />
  85. </el-form-item>
  86. <el-form-item
  87. v-if="config.isTitle&&config.type!='GcBorder11'"
  88. :label-width="labelWidth"
  89. label="标题高度"
  90. >
  91. <el-input-number
  92. v-model="config.titleHeight"
  93. class="bs-el-input-number"
  94. :min="0"
  95. :step="1"
  96. />
  97. </el-form-item>
  98. <el-form-item
  99. v-if="config.isTitle&&config.type!='GcBorder11'"
  100. :label-width="labelWidth"
  101. label="标题字体大小"
  102. >
  103. <el-input-number
  104. v-model="config.fontSize"
  105. class="bs-el-input-number"
  106. :min="0"
  107. :step="1"
  108. />
  109. </el-form-item>
  110. <el-form-item
  111. v-if="config.isTitle&&config.type!='GcBorder11'"
  112. :label-width="labelWidth"
  113. label="标题颜色"
  114. >
  115. <el-color-picker
  116. v-model="config.fontColor"
  117. popper-class="bs-el-color-picker"
  118. class="bs-el-color-picker"
  119. show-alpha
  120. />
  121. </el-form-item>
  122. <!-- <el-form-item
  123. v-if="config.type=='GcBorder15'"
  124. :label-width="labelWidth"
  125. label="外侧边框线宽度"
  126. >
  127. <el-input-number
  128. v-model="borderWidth"
  129. class="bs-el-input-number"
  130. :step="1"
  131. :min="0"
  132. :max="100000"
  133. />
  134. </el-form-item> -->
  135. <div
  136. v-for="(setting, settingIndex) in list.setting"
  137. :key="settingIndex+1"
  138. >
  139. <el-form-item
  140. :label="setting.type=== 'padding' ? '' : setting.label"
  141. :label-width="labelWidth"
  142. >
  143. <el-input
  144. v-if="setting.type === 'input'"
  145. v-model="config[setting.field]"
  146. :placeholder="`请输入${setting.label}`"
  147. clearable
  148. />
  149. <el-input
  150. v-model="config[setting.field]"
  151. v-else-if="setting.type === 'background'"
  152. clearable
  153. placeholder="选择或输入链接"
  154. >
  155. <template slot="append">
  156. <el-button
  157. size="small"
  158. type="primary"
  159. @click="initCard"
  160. >
  161. 选择
  162. </el-button>
  163. </template>
  164. </el-input>
  165. <el-button
  166. v-else-if="setting.type === 'move'"
  167. type="primary"
  168. @click="initMove(config.imgUrl)"
  169. >
  170. 图形切割
  171. </el-button>
  172. <el-select
  173. v-else-if="setting.type === 'select'"
  174. v-model="config[setting.field]"
  175. popper-class="bs-el-select"
  176. class="bs-el-select"
  177. :placeholder="`请选择${setting.label}`"
  178. :multiple="setting.multiple"
  179. clearable
  180. >
  181. <el-option
  182. v-for="(opt, optIndex) in setting.options"
  183. :key="optIndex"
  184. :label="opt.label"
  185. :value="opt.value"
  186. />
  187. </el-select>
  188. <template v-else-if="setting.type === 'colorSelect'">
  189. <color-select
  190. v-model="colorScheme"
  191. @update="updateColorScheme"
  192. />
  193. <div
  194. style="
  195. display: flex;
  196. align-items: center;
  197. flex-wrap: wrap;
  198. "
  199. class="color-picker-box"
  200. >
  201. <el-color-picker
  202. v-for="(colorItem, colorItemIndex) in colors"
  203. :key="colorItemIndex"
  204. v-model="setting.value[colorItemIndex]"
  205. popper-class="bs-el-color-picker"
  206. show-alpha
  207. class="start-color"
  208. />
  209. <span
  210. class="el-icon-circle-plus-outline"
  211. style="color: #007aff; font-size: 20px"
  212. @click="addColor"
  213. />
  214. <span
  215. v-if="colors.length"
  216. class="el-icon-remove-outline"
  217. style="color: #ea0b30; font-size: 20px"
  218. @click="delColor()"
  219. />
  220. </div>
  221. </template>
  222. <el-color-picker
  223. v-else-if="setting.type === 'colorPicker'"
  224. v-model="config[setting.field]"
  225. popper-class="bs-el-color-picker"
  226. class="bs-el-color-picker"
  227. show-alpha
  228. />
  229. <BorderColorSetting
  230. v-else-if="setting.type === 'gradual'"
  231. v-model="config[setting.field]"
  232. />
  233. <el-input-number
  234. v-else-if="setting.type === 'inputNumber'"
  235. v-model="config[setting.field]"
  236. class="bs-el-input-number"
  237. :step="setting.step || 1"
  238. :min="setting.min || 0"
  239. :max="setting.max || 100000"
  240. />
  241. <el-radio-group
  242. v-else-if="setting.type === 'radio'"
  243. v-model="config[setting.field]"
  244. class="bs-el-radio-group"
  245. >
  246. <template v-for="(opt, optIndex) in setting.options">
  247. <el-radio-button
  248. :key="optIndex"
  249. :label="opt.value"
  250. >
  251. {{ opt.label }}
  252. </el-radio-button>
  253. </template>
  254. </el-radio-group>
  255. <el-switch
  256. v-else-if="setting.type === 'switch'"
  257. v-model="config[setting.field]"
  258. class="bs-el-switch"
  259. :active-value="setting.active"
  260. :inactive-value="setting.inactive"
  261. />
  262. <el-slider
  263. v-else-if="setting.type === 'slider'"
  264. v-model="config[setting.field]"
  265. :min="0"
  266. :max="1"
  267. :step="0.01"
  268. />
  269. <PaddingSetting
  270. v-else-if="setting.type === 'padding'"
  271. v-model="config[setting.field]"
  272. />
  273. </el-form-item>
  274. </div>
  275. <SourceDialog ref="SourceDialog" @getImg='changeImg' />
  276. <MoveDialog @getArray='changeBorder' ref="MoveDialog"/>
  277. </div>
  278. </div>
  279. </template>
  280. <script>
  281. import _ from 'lodash'
  282. import plotList from 'data-room-ui/BorderComponents/settingList.js'
  283. import BorderColorSetting from 'data-room-ui/BigScreenDesign/RightSetting/BorderColorSetting/index.vue'
  284. import ColorSelect from 'data-room-ui/ColorMultipleSelect/index.vue'
  285. import BorderSelect from 'data-room-ui/BorderSelect/index.vue'
  286. import SourceDialog from '../SourceDialog/index.vue'
  287. import MoveDialog from './MoveDialog/index.vue'
  288. export default {
  289. name: '',
  290. components: {
  291. BorderSelect,
  292. ColorSelect,
  293. BorderColorSetting,
  294. SourceDialog,
  295. MoveDialog
  296. },
  297. props: {
  298. bigTitle:{
  299. type: String,
  300. default: ''
  301. },
  302. config: {
  303. type: Object,
  304. default: () => ({
  305. type: '',
  306. titleHeight: 0,
  307. fontSize: 0,
  308. h: 0,
  309. })
  310. },
  311. labelWidth: {
  312. type: String,
  313. default: '100px'
  314. }
  315. },
  316. watch:{
  317. // borderWidth:{
  318. // handler (val) {
  319. // this.config.borderWidth=val
  320. // }
  321. // },
  322. 'config.type':{
  323. handler (val) {
  324. this.config.isTitle=this.list.isTitle
  325. plotList[Symbol.iterator]=function*(){
  326. let keys=Object.keys(plotList)
  327. for(let k of keys){
  328. yield [k,plotList[k]]
  329. }
  330. }
  331. for(let [key,value] of plotList){
  332. if(value.padding&&val==value.type){
  333. this.config.padding=[...value.padding]
  334. }
  335. if(value.type==this.config.type){
  336. value.setting.forEach((item)=>{
  337. this.$set(this.config,item.field,item.value)
  338. })
  339. }
  340. }
  341. }
  342. },
  343. },
  344. computed:{
  345. title:{
  346. set(){
  347. this.config.type=''
  348. this.config.padding=[16,16,16,16]
  349. },
  350. get(){
  351. plotList[Symbol.iterator]=function*(){
  352. let keys=Object.keys(plotList)
  353. for(let k of keys){
  354. yield [k,plotList[k]]
  355. }
  356. }
  357. let name
  358. for(let [key,value] of plotList){
  359. if(value.type==this.config.type){
  360. name=value.name
  361. }
  362. }
  363. return name
  364. }
  365. },
  366. list(){
  367. plotList[Symbol.iterator]=function*(){
  368. let keys=Object.keys(plotList)
  369. for(let k of keys){
  370. yield [k,plotList[k]]
  371. }
  372. }
  373. let obj={}
  374. for(let [key,value] of plotList){
  375. if(value.type==this.config.type){
  376. obj={setting:value.setting,isTitle:value.isTitle}
  377. }
  378. }
  379. return obj
  380. }
  381. },
  382. data () {
  383. return {
  384. // borderWidth:0
  385. }
  386. },
  387. mounted () {
  388. // if(this.config.borderWidth){
  389. // this.borderWidth=this.config.borderWidth
  390. // }
  391. },
  392. methods: {
  393. changeBorder(val){
  394. this.$set(this.config,'borderArray',val)
  395. },
  396. changeImg(val){
  397. this.$set(this.config,'imgUrl',val.url)
  398. },
  399. init(){
  400. this.$refs.BorderSelect.init()
  401. },
  402. initCard(){
  403. this.$refs.SourceDialog.init()
  404. },
  405. initMove(val){
  406. this.$refs.MoveDialog.init(val,this.config.borderArray)
  407. }
  408. }
  409. }
  410. </script>
  411. <style lang="scss" scoped>
  412. ::v-deep .el-color-picker__trigger {
  413. border-color: var(--bs-el-border);
  414. }
  415. ::v-deep .el-input--suffix .el-input__inner{
  416. padding-right: 10px !important;
  417. }
  418. .color-picker-box{
  419. ::v-deep .el-color-picker__trigger {
  420. width: 27px!important;
  421. }
  422. }
  423. </style>