index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. <template>
  2. <el-date-picker
  3. :key="config.customize.type"
  4. v-model="config.customize.value"
  5. :picker-options="config.customize.pickerOptions"
  6. :type="config.customize.type"
  7. clearable
  8. :class="['basic-component-date-picker', `date-picker-${config.code}`]"
  9. :popper-class="'basic-component-date-picker date-picker-popper-' + config.code"
  10. :value-format="config.customize.valueFormat"
  11. size="large"
  12. @focus="focusEvent"
  13. @change="changeValue"
  14. @mouseenter.native="mouseenter"
  15. />
  16. </template>
  17. <script>
  18. import cloneDeep from 'lodash/cloneDeep'
  19. import commonMixins from 'data-room-ui/js/mixins/commonMixins'
  20. import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
  21. import { settingToTheme } from 'data-room-ui/js/utils/themeFormatting'
  22. import { mapState } from 'vuex'
  23. window.dataSetFields = []
  24. export default {
  25. name: 'BasicComponentSelect',
  26. components: {},
  27. mixins: [commonMixins, linkageMixins],
  28. props: {
  29. // 组件配置
  30. config: {
  31. type: Object,
  32. default: () => ({})
  33. }
  34. },
  35. data () {
  36. return {
  37. innerConfig: {}
  38. }
  39. },
  40. computed: {
  41. ...mapState({
  42. chartList: state => state.bigScreen.pageInfo.chartList
  43. }),
  44. isPreview () {
  45. return (this.$route.path === window?.BS_CONFIG?.routers?.previewUrl) || (this.$route.path === '/big-screen/preview')
  46. }
  47. },
  48. watch: {
  49. config: {
  50. handler: function (val) {
  51. if (val && val.customize && val.customize.formatType === 'custom') {
  52. // 解决时间格式化类型为自定义时,时间格式化类型和时间格式化值数据类型不匹配的问题
  53. this.$nextTick(() => {
  54. this.value = toString(this.value)
  55. })
  56. }
  57. },
  58. deep: true
  59. }
  60. },
  61. created () { },
  62. mounted () {
  63. if (!this.isPreview) {
  64. document.querySelector(`.date-picker-${this.config.code}`).style.pointerEvents = 'none'
  65. }
  66. this.changeStyle(this.config)
  67. },
  68. beforeDestroy () {
  69. },
  70. methods: {
  71. dataFormatting (config, data) {
  72. config.option.data = []
  73. return config
  74. },
  75. changeStyle (config) {
  76. config = { ...this.config, ...config }
  77. // 样式改变时更新主题配置
  78. config.theme = settingToTheme(cloneDeep(config), this.customTheme)
  79. this.changeChartConfig(config)
  80. this.innerConfig = config
  81. // 时间选择器元素
  82. const { bgColor, fontColor, fontSize } = config.customize
  83. this.$nextTick(() => {
  84. const timePickerEl = document.querySelector(`.date-picker-${config.code}`)
  85. timePickerEl.style.backgroundColor = bgColor
  86. // 时间选择器输入框元素
  87. const timePickerInput = timePickerEl.querySelector('.el-input__inner')
  88. if (timePickerInput) {
  89. // 时间选择器输入框背景颜色
  90. timePickerInput.style.backgroundColor = bgColor
  91. // 时间选择器输入框字体颜色
  92. timePickerInput.style.color = fontColor
  93. // 时间选择器输入框字体大小
  94. timePickerInput.style.fontSize = fontSize + 'px'
  95. }
  96. // 时间范围选择器输入框元素
  97. const timePickerRangeInput = timePickerEl.querySelectorAll('.el-range-input')
  98. if (timePickerRangeInput.length > 0) {
  99. // 连接符
  100. const timePickerRangeSeparator = timePickerEl.querySelector('.el-range-separator')
  101. if (timePickerRangeSeparator) {
  102. // 宽度和字体大小保持一致
  103. timePickerRangeSeparator.style.width = fontSize + 'px'
  104. timePickerRangeSeparator.style.color = fontColor
  105. timePickerRangeSeparator.style.fontSize = fontSize + 'px'
  106. }
  107. timePickerRangeInput.forEach((el) => {
  108. // 时间范围选择器输入框背景颜色
  109. el.style.backgroundColor = bgColor
  110. // 时间范围选择器输入框字体颜色
  111. el.style.color = fontColor
  112. // 时间范围选择器输入框字体大小
  113. el.style.fontSize = fontSize + 'px'
  114. })
  115. }
  116. // 时间选择器图标
  117. const timePickerIcon = timePickerEl.querySelector('.el-input__icon')
  118. if (timePickerIcon) {
  119. timePickerIcon.style.width = fontSize + 'px'
  120. timePickerIcon.style.fontSize = fontSize + 'px'
  121. }
  122. })
  123. },
  124. // 组件联动
  125. changeValue (val) {
  126. this.linkage({ [this.config.code]: val })
  127. },
  128. focusEvent () {
  129. this.$nextTick(() => {
  130. const { code } = this.innerConfig
  131. const { bgColor, fontColor, hoverFontColor, hoverBgColor, selectedFontColor, rangeBgColor, inputBgColor } = this.innerConfig.customize.dropDownBox
  132. const timePickerPopper = document.querySelector(`.date-picker-popper-${code}`)
  133. if (timePickerPopper) {
  134. // 去除边框
  135. timePickerPopper.style.border = 'none'
  136. // 确保下拉项的箭头颜色与下拉框的背景颜色保持一致
  137. timePickerPopper.style.color = bgColor
  138. }
  139. // 下拉项元素
  140. const pickerDropdownPanleContent = document.querySelector(`.date-picker-popper-${code}`)
  141. if (pickerDropdownPanleContent) {
  142. // 文字颜色
  143. pickerDropdownPanleContent.style.color = fontColor
  144. // 背景颜色
  145. pickerDropdownPanleContent.style.backgroundColor = bgColor
  146. // 下拉项添加var变量
  147. const dropdown = pickerDropdownPanleContent.style
  148. dropdown.setProperty('--fontColor', fontColor)
  149. dropdown.setProperty('--hoverFontColor', hoverFontColor)
  150. dropdown.setProperty('--bgColor', bgColor)
  151. dropdown.setProperty('--inputBgColor', inputBgColor)
  152. dropdown.setProperty('--selectedFontColor', selectedFontColor)
  153. dropdown.setProperty('--hoverBgColor', hoverBgColor)
  154. dropdown.setProperty('--rangeBgColor', rangeBgColor)
  155. // 选中项字体颜色
  156. const selectedEl = pickerDropdownPanleContent.querySelector('.selected')
  157. if (selectedEl) {
  158. selectedEl.style.color = selectedFontColor
  159. }
  160. // 选择过的,需要将选中颜色重置
  161. const pickerItemEl = document.querySelectorAll(`.date-picker-popper-${code} .el-time-spinner__item`)
  162. pickerItemEl.forEach((el) => {
  163. el.style.color = fontColor
  164. })
  165. }
  166. })
  167. },
  168. mouseenter () {
  169. if (this.config.customize.value) {
  170. setTimeout(() => {
  171. // 清空图标
  172. const timePickerCloseIcon = document.querySelector(`.date-picker-${this.innerConfig.code} .el-icon-circle-close`)
  173. if (timePickerCloseIcon) {
  174. timePickerCloseIcon.style.fontSize = this.innerConfig.customize.fontSize + 'px'
  175. }
  176. }, 25)
  177. }
  178. }
  179. }
  180. }
  181. </script>
  182. <style lang="scss">
  183. .basic-component-date-picker {
  184. color: '';
  185. // 清空图标
  186. .el-icon-circle-close {
  187. display: flex ;
  188. align-items: center ;
  189. }
  190. // 时间选择器
  191. .el-icon-time {
  192. display: flex ;
  193. align-items: center ;
  194. }
  195. .el-time-panel {
  196. border: none ;
  197. background-color: var(--bgColor) ;
  198. }
  199. // 选择日期 时间区域
  200. .el-date-picker__time-header {
  201. border-bottom: var(--bgColor) ;
  202. .el-input__inner {
  203. border: none ;
  204. // 添加一点阴影
  205. box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1) ;
  206. color: var(--fontColor) ;
  207. background-color: var(--inputBgColor) ;
  208. }
  209. }
  210. // 头部,修改文字颜色和图标颜色
  211. .el-date-picker__header {
  212. color: var(--fontColor) ;
  213. .el-date-picker__header-label {
  214. color: var(--fontColor) ;
  215. }
  216. // 左右箭头图标颜色
  217. .el-picker-panel__icon-btn {
  218. color: var(--fontColor) ;
  219. }
  220. }
  221. // datetimerange
  222. .el-date-range-picker__time-header {
  223. border-color: var(--fontColor);
  224. // 中间箭头图标颜色
  225. .el-icon-arrow-right {
  226. color: var(--fontColor) ;
  227. }
  228. // 时间选择器输入框
  229. .el-input__inner{
  230. border: none;
  231. color: var(--fontColor);
  232. // 添加一点阴影
  233. background-color: var(--inputBgColor) ;
  234. box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1) ;
  235. }
  236. }
  237. // datetimerange
  238. .el-picker-panel__content{
  239. .el-icon-d-arrow-left{
  240. color: var(--fontColor) ;
  241. &:after{
  242. color: var(--fontColor) ;
  243. }
  244. }
  245. .el-icon-arrow-left{
  246. color: var(--fontColor) ;
  247. &:after{
  248. color: var(--fontColor) ;
  249. }
  250. }
  251. .el-icon-d-arrow-right{
  252. color: var(--fontColor) ;
  253. &:after{
  254. color: var(--fontColor) ;
  255. }
  256. }
  257. .el-icon-arrow-right{
  258. color: var(--fontColor) ;
  259. &:after{
  260. color: var(--fontColor) ;
  261. }
  262. }
  263. }
  264. .el-date-range-picker__content.is-left{
  265. border-color: var(--fontColor) ;
  266. }
  267. .el-date-table{
  268. th{
  269. border-color: var(--fontColor) ;
  270. }
  271. td{
  272. div{
  273. color: var(--fontColor) ;
  274. &:hover{
  275. color: var(--hoverFontColor) ;
  276. }
  277. }
  278. }
  279. }
  280. // 范围选择器背景颜色
  281. .in-range {
  282. div {
  283. // 下拉范围选中背景颜色
  284. background-color: var(--rangeBgColor) !important;
  285. }
  286. }
  287. .today {
  288. span {
  289. color: var(--selectedFontColor) !important;
  290. }
  291. }
  292. .el-time-panel__content::before {
  293. content: "";
  294. top: 50%;
  295. position: absolute;
  296. margin-top: -15px;
  297. height: 32px;
  298. z-index: 1;
  299. left: 0;
  300. right: 0;
  301. box-sizing: border-box;
  302. padding-top: 6px;
  303. text-align: left;
  304. border-top: 1px solid var(--fontColor);
  305. border-bottom: 1px solid var(--fontColor);
  306. }
  307. // 脚部
  308. .el-picker-panel__footer {
  309. border-color: var(--fontColor);
  310. background-color: var(--bgColor) ;
  311. // 清空按钮
  312. .el-picker-panel__link-btn {
  313. span {
  314. color: var(--fontColor) ;
  315. }
  316. }
  317. // 确定按钮
  318. .el-button--default {
  319. border: none ;
  320. color: var(--fontColor) ;
  321. background-color: var(--bgColor) ;
  322. }
  323. .is-disabled {
  324. span {
  325. color: #999 ;
  326. }
  327. }
  328. }
  329. .el-time-spinner {
  330. margin-bottom: 0px ;
  331. .el-time-spinner__item {
  332. &:hover {
  333. color: var(--hoverFontColor) ;
  334. background-color: var(--hoverBgColor) ;
  335. }
  336. }
  337. .active {
  338. color: var(--selectedFontColor) ;
  339. &:hover {
  340. color: var(--selectedFontColor) ;
  341. background-color: transparent ;
  342. }
  343. }
  344. }
  345. .popper__arrow {
  346. bottom: -6px ;
  347. border-bottom-color: var(--bgColor) !important;
  348. &::after {
  349. bottom: 0px ;
  350. border-bottom-color: var(--bgColor) !important;
  351. }
  352. }
  353. .cancel {
  354. color: var(--fontColor) ;
  355. }
  356. .confirm {
  357. color: var(--selectedFontColor);
  358. }
  359. .el-time-panel__footer {
  360. border-top: 1px solid var(--fontColor) ;
  361. .cancel {
  362. span {
  363. color: var(--fontColor) ;
  364. }
  365. }
  366. // 确定按钮
  367. .confirm {
  368. border: none ;
  369. color: var(--fontColor) ;
  370. background-color: var(--bgColor) ;
  371. }
  372. }
  373. // 年选择器
  374. .el-year-table {
  375. a{
  376. color: var(--fontColor) ;
  377. &:hover{
  378. color: var(--hoverFontColor) ;
  379. }
  380. }
  381. }
  382. // 月选择器
  383. .el-month-table {
  384. a{
  385. color: var(--fontColor) ;
  386. &:hover{
  387. color: var(--hoverFontColor) ;
  388. }
  389. }
  390. }
  391. }
  392. </style>
  393. <style lang="scss" scoped>
  394. .basic-component-date-picker {
  395. width: 100%;
  396. height: 100%;
  397. // 范围时间选择器连接符
  398. ::v-deep .el-range-separator {
  399. display: flex !important;
  400. align-items: center !important;
  401. }
  402. .el-input--mini ::v-deep .el-input__inner {
  403. height: 100% !important;
  404. line-height: 100% !important;
  405. }
  406. .el-tag.el-tag--info {
  407. color: var(--bs-el-text) !important;
  408. }
  409. }
  410. ::v-deep .el-input__inner {
  411. height: 100% !important;
  412. line-height: 100% !important;
  413. }
  414. ::v-deep .el-range-input{
  415. width: 45% !important;
  416. }
  417. </style>