BorderSetting.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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-select
  166. v-else-if="setting.type === 'select'"
  167. v-model="config[setting.field]"
  168. popper-class="bs-el-select"
  169. class="bs-el-select"
  170. :placeholder="`请选择${setting.label}`"
  171. :multiple="setting.multiple"
  172. clearable
  173. >
  174. <el-option
  175. v-for="(opt, optIndex) in setting.options"
  176. :key="optIndex"
  177. :label="opt.label"
  178. :value="opt.value"
  179. />
  180. </el-select>
  181. <template v-else-if="setting.type === 'colorSelect'">
  182. <color-select
  183. v-model="colorScheme"
  184. @update="updateColorScheme"
  185. />
  186. <div
  187. style="
  188. display: flex;
  189. align-items: center;
  190. flex-wrap: wrap;
  191. "
  192. class="color-picker-box"
  193. >
  194. <el-color-picker
  195. v-for="(colorItem, colorItemIndex) in colors"
  196. :key="colorItemIndex"
  197. v-model="setting.value[colorItemIndex]"
  198. popper-class="bs-el-color-picker"
  199. show-alpha
  200. class="start-color"
  201. />
  202. <span
  203. class="el-icon-circle-plus-outline"
  204. style="color: #007aff; font-size: 20px"
  205. @click="addColor"
  206. />
  207. <span
  208. v-if="colors.length"
  209. class="el-icon-remove-outline"
  210. style="color: #ea0b30; font-size: 20px"
  211. @click="delColor()"
  212. />
  213. </div>
  214. </template>
  215. <el-color-picker
  216. v-else-if="setting.type === 'colorPicker'"
  217. v-model="config[setting.field]"
  218. popper-class="bs-el-color-picker"
  219. class="bs-el-color-picker"
  220. show-alpha
  221. />
  222. <BorderColorSetting
  223. v-else-if="setting.type === 'gradual'"
  224. v-model="config[setting.field]"
  225. />
  226. <el-input-number
  227. v-else-if="setting.type === 'inputNumber'"
  228. v-model="config[setting.field]"
  229. class="bs-el-input-number"
  230. :step="setting.step || 1"
  231. :min="setting.min || 0"
  232. :max="setting.max || 100000"
  233. />
  234. <el-radio-group
  235. v-else-if="setting.type === 'radio'"
  236. v-model="config[setting.field]"
  237. class="bs-el-radio-group"
  238. >
  239. <template v-for="(opt, optIndex) in setting.options">
  240. <el-radio-button
  241. :key="optIndex"
  242. :label="opt.value"
  243. >
  244. {{ opt.label }}
  245. </el-radio-button>
  246. </template>
  247. </el-radio-group>
  248. <el-switch
  249. v-else-if="setting.type === 'switch'"
  250. v-model="config[setting.field]"
  251. class="bs-el-switch"
  252. :active-value="setting.active"
  253. :inactive-value="setting.inactive"
  254. />
  255. <el-slider
  256. v-else-if="setting.type === 'slider'"
  257. v-model="config[setting.field]"
  258. :min="0"
  259. :max="1"
  260. :step="0.01"
  261. />
  262. <PaddingSetting
  263. v-else-if="setting.type === 'padding'"
  264. v-model="config[setting.field]"
  265. />
  266. </el-form-item>
  267. </div>
  268. <SourceDialog ref="SourceDialog" @getImg='changeImg' />
  269. </div>
  270. </div>
  271. </template>
  272. <script>
  273. import _ from 'lodash'
  274. import plotList from 'data-room-ui/BorderComponents/settingList.js'
  275. import BorderColorSetting from 'data-room-ui/BigScreenDesign/RightSetting/BorderColorSetting/index.vue'
  276. import ColorSelect from 'data-room-ui/ColorMultipleSelect/index.vue'
  277. import BorderSelect from 'data-room-ui/BorderSelect/index.vue'
  278. import SourceDialog from '../SourceDialog/index.vue'
  279. export default {
  280. name: '',
  281. components: {
  282. BorderSelect,
  283. ColorSelect,
  284. BorderColorSetting,
  285. SourceDialog
  286. },
  287. props: {
  288. bigTitle:{
  289. type: String,
  290. default: ''
  291. },
  292. config: {
  293. type: Object,
  294. default: () => ({
  295. type: '',
  296. titleHeight: 0,
  297. fontSize: 0,
  298. h: 0,
  299. })
  300. },
  301. labelWidth: {
  302. type: String,
  303. default: '100px'
  304. }
  305. },
  306. watch:{
  307. // borderWidth:{
  308. // handler (val) {
  309. // this.config.borderWidth=val
  310. // }
  311. // },
  312. 'config.type':{
  313. handler (val) {
  314. this.config.isTitle=this.list.isTitle
  315. plotList[Symbol.iterator]=function*(){
  316. let keys=Object.keys(plotList)
  317. for(let k of keys){
  318. yield [k,plotList[k]]
  319. }
  320. }
  321. for(let [key,value] of plotList){
  322. if(value.padding&&val==value.type){
  323. this.config.padding=[...value.padding]
  324. }
  325. if(value.type==this.config.type){
  326. value.setting.forEach((item)=>{
  327. this.$set(this.config,item.field,item.value)
  328. })
  329. }
  330. }
  331. }
  332. },
  333. },
  334. computed:{
  335. title:{
  336. set(){
  337. this.config.type=''
  338. this.config.padding=[16,16,16,16]
  339. },
  340. get(){
  341. plotList[Symbol.iterator]=function*(){
  342. let keys=Object.keys(plotList)
  343. for(let k of keys){
  344. yield [k,plotList[k]]
  345. }
  346. }
  347. let name
  348. for(let [key,value] of plotList){
  349. if(value.type==this.config.type){
  350. name=value.name
  351. }
  352. }
  353. return name
  354. }
  355. },
  356. list(){
  357. plotList[Symbol.iterator]=function*(){
  358. let keys=Object.keys(plotList)
  359. for(let k of keys){
  360. yield [k,plotList[k]]
  361. }
  362. }
  363. let obj={}
  364. for(let [key,value] of plotList){
  365. if(value.type==this.config.type){
  366. obj={setting:value.setting,isTitle:value.isTitle}
  367. }
  368. }
  369. return obj
  370. }
  371. },
  372. data () {
  373. return {
  374. // borderWidth:0
  375. }
  376. },
  377. mounted () {
  378. // if(this.config.borderWidth){
  379. // this.borderWidth=this.config.borderWidth
  380. // }
  381. },
  382. methods: {
  383. changeImg(val){
  384. console.log(val)
  385. this.$set(this.config,'imgUrl',val.url)
  386. },
  387. init(){
  388. this.$refs.BorderSelect.init()
  389. },
  390. initCard(){
  391. this.$refs.SourceDialog.init()
  392. }
  393. }
  394. }
  395. </script>
  396. <style lang="scss" scoped>
  397. ::v-deep .el-color-picker__trigger {
  398. border-color: var(--bs-el-border);
  399. }
  400. ::v-deep .el-input--suffix .el-input__inner{
  401. padding-right: 10px !important;
  402. }
  403. .color-picker-box{
  404. ::v-deep .el-color-picker__trigger {
  405. width: 27px!important;
  406. }
  407. }
  408. </style>