regionInfoCard.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import './regionInfoCard.css'
  2. import defaultRegionImg from '@/assets/img/map/lichi.png'
  3. import config from '@/api/config.js'
  4. function pickField(item, keys, fallback = '') {
  5. for (const key of keys) {
  6. const val = item[key]
  7. if (val !== undefined && val !== null && val !== '') {
  8. return val
  9. }
  10. }
  11. return fallback
  12. }
  13. function resolveImageUrl(item) {
  14. const raw = pickField(item, ['icon', 'image', 'img', 'speciesIcon', 'varietyIcon'])
  15. if (!raw) return defaultRegionImg
  16. if (/^https?:\/\//i.test(raw)) return raw
  17. if (raw.startsWith('/')) return raw
  18. return config.base_img_url2 + raw
  19. }
  20. /**
  21. * @param {Record<string, unknown>} item 分区数据
  22. * @param {{ enterSelectTree?: boolean, selected?: boolean, onClick?: () => void }} options
  23. */
  24. export function createRegionInfoCard(item, options = {}) {
  25. const { enterSelectTree = false, selected = false, onClick } = options
  26. const el = document.createElement('div')
  27. el.className = 'region-info-card'
  28. if (enterSelectTree) el.classList.add('is-selectable')
  29. if (selected) el.classList.add('is-selected')
  30. const check = document.createElement('div')
  31. check.className = 'region-info-card__check'
  32. const img = document.createElement('img')
  33. img.className = 'region-info-card__img'
  34. img.alt = ''
  35. img.src = resolveImageUrl(item)
  36. img.onerror = () => {
  37. img.onerror = null
  38. img.src = defaultRegionImg
  39. }
  40. const body = document.createElement('div')
  41. body.className = 'region-info-card__body'
  42. const name = document.createElement('div')
  43. name.className = 'region-info-card__name'
  44. name.textContent = pickField(item, ['name', 'regionName'], '分区')
  45. const varietyRow = document.createElement('div')
  46. varietyRow.className = 'region-info-card__row'
  47. const varietyLabel = document.createElement('span')
  48. varietyLabel.className = 'region-info-card__label'
  49. varietyLabel.textContent = '品种:'
  50. const varietyVal = document.createElement('span')
  51. varietyVal.textContent = pickField(item, ['pz', 'speciesName', 'varietyName', 'variety'], '--')
  52. varietyRow.append(varietyLabel, varietyVal)
  53. const ageRow = document.createElement('div')
  54. ageRow.className = 'region-info-card__row'
  55. const ageLabel = document.createElement('span')
  56. ageLabel.className = 'region-info-card__label'
  57. ageLabel.textContent = '树龄:'
  58. const ageVal = document.createElement('span')
  59. const age = pickField(item, ['age', 'treeAge'])
  60. ageVal.textContent = age !== '' && age != null ? `${age}年` : '树龄'
  61. ageRow.append(ageLabel, ageVal)
  62. body.append(name, varietyRow, ageRow)
  63. const arrow = document.createElement('div')
  64. arrow.className = 'region-info-card__arrow'
  65. el.append(check, img, body, arrow)
  66. if (enterSelectTree && onClick) {
  67. el.addEventListener('click', (e) => {
  68. e.stopPropagation()
  69. onClick()
  70. })
  71. }
  72. return el
  73. }
  74. export function updateRegionInfoCard(el, { enterSelectTree, selected }) {
  75. if (!el) return
  76. el.classList.toggle('is-selectable', !!enterSelectTree)
  77. el.classList.toggle('is-selected', !!selected)
  78. }