BorderSetting.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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. <div v-if="config.type">
  30. <el-form-item
  31. :label-width="labelWidth"
  32. label="是否显示标题"
  33. >
  34. <el-switch
  35. v-model="config.isTitle"
  36. class="bs-el-switch"
  37. :active-value="true"
  38. :inactive-value="false"
  39. />
  40. </el-form-item>
  41. <el-form-item
  42. v-if="!config.isTitle"
  43. :label-width="labelWidth"
  44. label="上边距"
  45. >
  46. <el-input-number
  47. v-model="config.paddingTop"
  48. class="bs-el-input-number"
  49. :min="0"
  50. :step="1"
  51. />
  52. </el-form-item>
  53. <el-form-item
  54. v-if="config.isTitle"
  55. :label-width="labelWidth"
  56. label="标题高度"
  57. >
  58. <el-input-number
  59. v-model="config.titleHeight"
  60. class="bs-el-input-number"
  61. :min="0"
  62. :step="1"
  63. />
  64. </el-form-item>
  65. <el-form-item
  66. v-if="config.isTitle"
  67. :label-width="labelWidth"
  68. label="标题字体大小"
  69. >
  70. <el-input-number
  71. v-model="config.fontSize"
  72. class="bs-el-input-number"
  73. :min="0"
  74. :step="1"
  75. />
  76. </el-form-item>
  77. <el-form-item
  78. v-if="config.isTitle"
  79. :label-width="labelWidth"
  80. label="标题颜色"
  81. >
  82. <el-color-picker
  83. v-model="config.fontColor"
  84. popper-class="bs-el-color-picker"
  85. class="bs-el-color-picker"
  86. show-alpha
  87. />
  88. </el-form-item>
  89. <div
  90. v-for="(setting, settingIndex) in list"
  91. :key="settingIndex+1"
  92. >
  93. <el-form-item
  94. :label="setting.type=== 'padding' ? '' : setting.label"
  95. :label-width="labelWidth"
  96. >
  97. <el-input
  98. v-if="setting.type === 'input'"
  99. v-model="config[setting.field]"
  100. :placeholder="`请输入${setting.label}`"
  101. clearable
  102. />
  103. <el-select
  104. v-else-if="setting.type === 'select'"
  105. v-model="config[setting.field]"
  106. popper-class="bs-el-select"
  107. class="bs-el-select"
  108. :placeholder="`请选择${setting.label}`"
  109. :multiple="setting.multiple"
  110. clearable
  111. >
  112. <el-option
  113. v-for="(opt, optIndex) in setting.options"
  114. :key="optIndex"
  115. :label="opt.label"
  116. :value="opt.value"
  117. />
  118. </el-select>
  119. <template v-else-if="setting.type === 'colorSelect'">
  120. <color-select
  121. v-model="colorScheme"
  122. @update="updateColorScheme"
  123. />
  124. <div
  125. style="
  126. display: flex;
  127. align-items: center;
  128. flex-wrap: wrap;
  129. "
  130. class="color-picker-box"
  131. >
  132. <el-color-picker
  133. v-for="(colorItem, colorItemIndex) in colors"
  134. :key="colorItemIndex"
  135. v-model="setting.value[colorItemIndex]"
  136. popper-class="bs-el-color-picker"
  137. show-alpha
  138. class="start-color"
  139. />
  140. <span
  141. class="el-icon-circle-plus-outline"
  142. style="color: #007aff; font-size: 20px"
  143. @click="addColor"
  144. />
  145. <span
  146. v-if="colors.length"
  147. class="el-icon-remove-outline"
  148. style="color: #ea0b30; font-size: 20px"
  149. @click="delColor()"
  150. />
  151. </div>
  152. </template>
  153. <el-color-picker
  154. v-else-if="setting.type === 'colorPicker'"
  155. v-model="config[setting.field]"
  156. popper-class="bs-el-color-picker"
  157. class="bs-el-color-picker"
  158. show-alpha
  159. />
  160. <GradualSetting
  161. v-else-if="setting.type === 'gradual'"
  162. v-model="config[setting.field]"
  163. />
  164. <el-input-number
  165. v-else-if="setting.type === 'inputNumber'"
  166. v-model="config[setting.field]"
  167. class="bs-el-input-number"
  168. :step="setting.step || 1"
  169. :min="setting.min || 0"
  170. :max="setting.max || 100000"
  171. />
  172. <el-radio-group
  173. v-else-if="setting.type === 'radio'"
  174. v-model="config[setting.field]"
  175. class="bs-el-radio-group"
  176. >
  177. <template v-for="(opt, optIndex) in setting.options">
  178. <el-radio-button
  179. :key="optIndex"
  180. :label="opt.value"
  181. >
  182. {{ opt.label }}
  183. </el-radio-button>
  184. </template>
  185. </el-radio-group>
  186. <el-switch
  187. v-else-if="setting.type === 'switch'"
  188. v-model="config[setting.field]"
  189. class="bs-el-switch"
  190. :active-value="setting.active"
  191. :inactive-value="setting.inactive"
  192. />
  193. <el-slider
  194. v-else-if="setting.type === 'slider'"
  195. v-model="config[setting.field]"
  196. :min="0"
  197. :max="1"
  198. :step="0.01"
  199. />
  200. <PaddingSetting
  201. v-else-if="setting.type === 'padding'"
  202. v-model="config[setting.field]"
  203. />
  204. </el-form-item>
  205. </div>
  206. </div>
  207. </div>
  208. </template>
  209. <script>
  210. import plotList from 'data-room-ui/BorderComponents/settingList.js'
  211. import ColorSelect from 'data-room-ui/ColorMultipleSelect/index.vue'
  212. import BorderSelect from 'data-room-ui/BorderSelect/index.vue'
  213. export default {
  214. name: '',
  215. components: {
  216. BorderSelect,
  217. ColorSelect
  218. },
  219. props: {
  220. config: {
  221. type: Object,
  222. default: () => ({
  223. type: '',
  224. titleHeight: 0,
  225. fontSize: 0,
  226. h: 0,
  227. })
  228. },
  229. labelWidth: {
  230. type: String,
  231. default: '100px'
  232. }
  233. },
  234. computed:{
  235. title:{
  236. set(){
  237. this.config.type=''
  238. },
  239. get(){
  240. plotList[Symbol.iterator]=function*(){
  241. let keys=Object.keys(plotList)
  242. for(let k of keys){
  243. yield [k,plotList[k]]
  244. }
  245. }
  246. let name
  247. for(let [key,value] of plotList){
  248. if(value.type==this.config.type){
  249. name=value.name
  250. }
  251. }
  252. return name
  253. }
  254. },
  255. list(){
  256. plotList[Symbol.iterator]=function*(){
  257. let keys=Object.keys(plotList)
  258. for(let k of keys){
  259. yield [k,plotList[k]]
  260. }
  261. }
  262. let arr=[]
  263. for(let [key,value] of plotList){
  264. if(value.type==this.config.type){
  265. arr=value.setting
  266. }
  267. }
  268. return arr
  269. }
  270. },
  271. data () {
  272. return {
  273. }
  274. },
  275. mounted () {
  276. },
  277. methods: {
  278. init(){
  279. this.$refs.BorderSelect.init()
  280. }
  281. }
  282. }
  283. </script>
  284. <style lang="scss" scoped>
  285. ::v-deep .el-color-picker__trigger {
  286. border-color: var(--bs-el-border);
  287. }
  288. ::v-deep .el-input--suffix .el-input__inner{
  289. padding-right: 10px !important;
  290. }
  291. .color-picker-box{
  292. ::v-deep .el-color-picker__trigger {
  293. width: 27px!important;
  294. }
  295. }
  296. </style>