{"version":3,"file":"DatasetDetailsDataServices.vue.mjs","sources":["../../../lib/datasetDetails/features/DatasetDetailsDataServices.vue"],"sourcesContent":["<template>\n  <div class=\"dsd-feature\">\n    <dataset-details-feature-header\n      :title=\"`${$t('message.metadata.dataServices')} (${getDataServices ? getDataServices.length.toLocaleString('fi') : 0})`\"\n      :arrowDown=\"!dataServices.isVisible\"\n      tag=\"documentation-toggle\"\n      :onClick=\"toggleDataServices\"\n    />\n    <div v-if=\"dataServices.isVisible\" data-cy=\"documentation\" class=\"w-100\">\n      <!-- Desktop Table View -->\n      <div class=\"table-responsive-wrapper d-none d-md-block\">\n        <div class=\"data-services-wrapper\">\n          <div class=\"data-services-grid\">\n            <!-- Header -->\n            <div class=\"grid-header\">\n              <div class=\"grid-col title-col\">\n                <button class=\"sort-button\" @click=\"toggleSort('title')\"\n                  :aria-label=\"$t('message.metadata.title') + ' sort'\">\n                  {{ $t('message.metadata.title') }}\n                  <div class=\"sort-arrows\">\n                    <svg class=\"sort-arrow sort-arrow-up\" :class=\"{ active: sortField === 'title' && sortOrder === 'asc' }\" width=\"10\" height=\"8\"\n                      viewBox=\"0 0 10 8\">\n                      <path d=\"M5 1 L9 6 L1 6 Z\" fill=\"currentColor\" />\n                    </svg>\n                    <svg class=\"sort-arrow sort-arrow-down\" :class=\"{ active: sortField === 'title' && sortOrder === 'desc' }\" width=\"10\"\n                      height=\"8\" viewBox=\"0 0 10 8\">\n                      <path d=\"M5 7 L1 2 L9 2 Z\" fill=\"currentColor\" />\n                    </svg>\n                  </div>\n                </button>\n              </div>\n              <div class=\"grid-col actions-col\">{{ $t('message.dataupload.menu.actions') }}</div>\n            </div>\n            \n            <!-- Data Service rows -->\n            <div v-for=\"(dataService, index) in displayedDataServices\" :key=\"index\" class=\"data-service-item\"\n              :class=\"{ 'accordion-open': expandedDataServices.includes(`data-service-${index}`) }\">\n              <div class=\"grid-row data-service-header\">\n                <div class=\"grid-col title-col\">\n                  <div class=\"title-with-arrow\">\n                    <button :id=\"`accordion-button-${index}`\" class=\"accordion-title\"\n                      :aria-expanded=\"expandedDataServices.includes(`data-service-${index}`) || false\" \n                      :aria-controls=\"`accordion-content-${index}`\"\n                      type=\"button\" @click=\"toggleDataService(`data-service-${index}`)\"\n                      @keydown.enter=\"toggleDataService(`data-service-${index}`)\"\n                      @keydown.space.prevent=\"toggleDataService(`data-service-${index}`)\">\n                      <h3 class=\"m-0 data-service-title\" :title=\"getDataServiceTitle(dataService)\">{{ getDataServiceTitle(dataService) }}\n                          <svg :class=\"`accordion-arrow ${expandedDataServices.includes(`data-service-${index}`) ? 'rotated' : ''}`\" width=\"16\" height=\"16\"\n                        viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                        <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\n                      </svg>\n                      </h3>\n                    \n                    </button>\n                  </div>\n                </div>\n                <div class=\"grid-col actions-col\">\n                  <div class=\"actions-container\">\n                    <app-link class=\"action-btns\"\n                              :to=\"dataService.endpoint_url[0]\"\n                              target=\"_blank\"\n                              rel=\"dcat:distribution noopener\"\n                              matomo-track-download\n                              @after-click=\"trackGoto\">\n                      {{ $t('message.datasetDetails.access') }}\n                    </app-link>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Accordion Content -->\n              <div v-if=\"expandedDataServices.includes(`data-service-${index}`)\" :id=\"`accordion-content-${index}`\"\n                :aria-labelledby=\"`accordion-button-${index}`\" class=\"accordion-content\" role=\"region\">\n                <div class=\"expanded-details\">\n                  <dl class=\"details-list\">\n                    <dt v-if=\"getDataServiceDescription(dataService)\">\n                      {{ $t('message.metadata.description') }}\n                    </dt>\n                    <dd v-if=\"getDataServiceDescription(dataService)\">\n                      {{ getDataServiceDescription(dataService) }} \n                    </dd>\n\n                    <dt v-if=\"getDataServiceResource(dataService)\">\n                      Resource\n                    </dt>\n                    <dd v-if=\"getDataServiceResource(dataService)\">\n                      <a :href=\"getDataServiceResource(dataService)\">{{ getDataServiceResource(dataService) }}</a>\n                    </dd>\n\n                    <dt v-if=\"dataService.endpoint_url && dataService.endpoint_url.length > 0\">\n                      Endpoint URL\n                    </dt>\n                    <dd v-if=\"dataService.endpoint_url && dataService.endpoint_url.length > 0\">\n                      <a :href=\"dataService.endpoint_url[0]\" target=\"_blank\">{{ dataService.endpoint_url[0] }}</a>\n                    </dd>\n                  </dl>\n                </div>\n              </div>\n            </div>\n\n            <!-- Empty state -->\n            <div v-if=\"!getDataServices || getDataServices.length === 0\" class=\"grid-row empty-state\">\n              <div class=\"grid-col-full text-center text-muted\">\n                {{ $t('message.metadata.noDataServicesAvailable') }}\n              </div>\n            </div>\n          </div>\n        </div>\n      \n      </div>\n\n      <!-- Mobile Card View -->\n      <div class=\"data-services-cards d-md-none\">\n        <div v-for=\"(dataService, index) in displayedDataServices\" :key=\"index\" class=\"data-service-card\"\n          :class=\"{ 'expanded': expandedDataServices.includes(`data-service-${index}`) }\">\n          \n          <!-- Card Header -->\n          <div class=\"card-header\" @click=\"toggleDataService(`data-service-${index}`)\">\n            <div class=\"card-title-section\">\n              <h3 class=\"data-service-title\" :title=\"getDataServiceTitle(dataService)\">{{ getDataServiceTitle(dataService) }}</h3>\n            </div>\n            <svg class=\"accordion-arrow\" :class=\"{ 'rotated': expandedDataServices.includes(`data-service-${index}`) }\" width=\"16\" height=\"16\"\n              viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n              <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\n            </svg>\n          </div>\n\n          <!-- Card Actions -->\n          <div class=\"card-actions\">\n            <app-link class=\"card-action-btn access-btn\"\n                      :to=\"dataService.endpoint_url[0]\"\n                      target=\"_blank\"\n                      rel=\"dcat:distribution noopener\"\n                      matomo-track-download\n                      @after-click=\"trackGoto\">\n              {{ $t('message.datasetDetails.access') }}\n            </app-link>\n          </div>\n\n          <!-- Expanded Content -->\n          <div v-if=\"expandedDataServices.includes(`data-service-${index}`)\" class=\"card-expanded-content\">\n            <div class=\"expanded-details\">\n              <dl class=\"details-list\">\n                <dt v-if=\"getDataServiceDescription(dataService)\">\n                  {{ $t('message.metadata.description') }}\n                </dt>\n                <dd v-if=\"getDataServiceDescription(dataService)\">\n                  {{ getDataServiceDescription(dataService) }}\n                </dd>\n\n                <dt v-if=\"getDataServiceResource(dataService)\">\n                  Resource\n                </dt>\n                <dd v-if=\"getDataServiceResource(dataService)\">\n                  <a :href=\"getDataServiceResource(dataService)\">{{ getDataServiceResource(dataService) }}</a>\n                </dd>\n\n                <dt v-if=\"dataService.endpoint_url && dataService.endpoint_url.length > 0\">\n                  Endpoint URL\n                </dt>\n                <dd v-if=\"dataService.endpoint_url && dataService.endpoint_url.length > 0\">\n                  <a :href=\"dataService.endpoint_url[0]\" target=\"_blank\">{{ dataService.endpoint_url[0] }}</a>\n                </dd>\n              </dl>\n            </div>\n          </div>\n        </div>\n\n        <!-- Empty state for mobile -->\n        <div v-if=\"!getDataServices || getDataServices.length === 0\" class=\"empty-state-card\">\n          <div class=\"text-center text-muted\">\n            {{ $t('message.metadata.noDataServicesAvailable') }}\n          </div>\n        </div>\n\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport {getTranslationFor, truncate} from \"../../utils/helpers\";\nimport {has, isNil} from \"lodash\";\nimport AppLink from \"../../widgets/AppLink\";\nimport {mapGetters} from \"vuex\";\n// DatasetDetailsFeatureHeader is imported globally\n// import DatasetDetailsFeatureHeader from \"../../modules/datasetDetails/features/DatasetDetailsFeatureHeader\";\n\nexport default {\n  name: \"DatasetDetailsDataServices\",\n  components: {\n    // DatasetDetailsFeatureHeader,\n     AppLink},\n  props: {\n    getDataServices: Array,\n    nonOverflowingIncrementsForPages: Function,\n    increaseNumDisplayedPages: Function,\n    trackGoto: Function\n  },\n  data() {\n    return {\n      dataServices: {\n        isVisible: this.$env.content.datasetDetails.dataServices.isVisible,\n        displayAll: this.$env.content.datasetDetails.dataServices.displayAll,\n        displayCount: this.$env.content.datasetDetails.dataServices.displayCount,\n        incrementSteps: this.$env.content.datasetDetails.dataServices.incrementSteps,\n        descriptionMaxLines: this.$env.content.datasetDetails.dataServices.descriptionMaxLines,\n        descriptionMaxChars: this.$env.content.datasetDetails.dataServices.descriptionMaxChars,\n      },\n      expandedDataServicesDescriptions: [],\n      expandedDataServices: [],\n      sortField: 'title',\n      sortOrder: 'asc',\n    };\n  },\n  computed: {\n    ...mapGetters('datasetDetails', [\n      'getLanguages'\n    ]),\n    displayedDataServices() {\n      const sorted = [...this.getDataServices].sort((a, b) => {\n        let aValue = '';\n        let bValue = '';\n        \n        if (this.sortField === 'title') {\n          aValue = getTranslationFor(a.title, this.$route.query.locale, this.getLanguages) || '';\n          bValue = getTranslationFor(b.title, this.$route.query.locale, this.getLanguages) || '';\n        }\n        \n        const comparison = aValue.localeCompare(bValue);\n        return this.sortOrder === 'asc' ? comparison : -comparison;\n      });\n      \n      return this.dataServices.displayAll\n        ? Object.freeze(sorted)\n        : Object.freeze(sorted.slice(0, this.dataServices.displayCount));\n    },\n    isDataServicesAllDisplayed() {\n      return this.dataServices.displayCount === this.getDataServices.length;\n    },\n    remainingDataServices() {\n      return this.getDataServices.length - this.dataServices.displayCount;\n    }\n  },\n  methods: {\n    truncate,\n    toggleSort(field) {\n      if (this.sortField === field) {\n        this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';\n      } else {\n        this.sortField = field;\n        this.sortOrder = 'asc';\n      }\n    },\n    toggleDataService(id) {\n      const index = this.expandedDataServices.indexOf(id);\n      if (index > -1) this.expandedDataServices.splice(index, 1);\n      else this.expandedDataServices.push(id);\n    },\n    toggleDataServiceDescription(id) {\n      const index = this.expandedDataServicesDescriptions.indexOf(id);\n      if (index > -1) this.expandedDataServicesDescriptions.splice(index, 1);\n      else this.expandedDataServicesDescriptions.push(id);\n    },\n    toggleDataServices() {\n      this.dataServices.isVisible = !this.dataServices.isVisible;\n    },\n    dataServiceIsExpanded(id) {\n      return this.expandedDataServices.includes(id);\n    },\n    dataServiceDescriptionIsExpanded(id) {\n      return this.expandedDataServicesDescriptions.includes(id);\n    },\n    dataServiceDescriptionIsExpandable(description) {\n      return isNil(description) ? false : description.length > this.dataServices.descriptionMaxChars;\n    },\n    getDataServiceTitle(dataService) {\n      return dataService.title ? getTranslationFor(dataService.title, this.$route.query.locale, this.getLanguages) : truncate(dataService.endpoint_url[0], 50);\n    },\n    getDataServiceDescription(dataService) {\n      return (has(dataService, 'description') && !isNil(dataService.description)) ? getTranslationFor(dataService.description, this.$route.query.locale, this.getLanguages) : this.$t('message.catalogsAndDatasets.noDescriptionAvailable');\n    },\n    getDataServiceResource(dataService) {\n      return (has(dataService.availability, 'resource') && !isNil(dataService.availability.resource)) ? dataService.availability.resource : '';\n    }\n  },\n  mounted() {\n    const dataServicesConf = this.$env.content.datasetDetails && this.$env.content.datasetDetails.dataServices;\n    if (dataServicesConf) {\n      this.dataServices.displayAll = dataServicesConf.displayAll || this.dataServices.displayAll;\n      this.dataServices.displayCount = parseInt(dataServicesConf.displayCount, 10) || this.dataServices.displayCount;\n\n      if (typeof dataServicesConf.incrementSteps === 'string') {\n        // Need to parse as json array since env variables are string only\n        dataServicesConf.incrementSteps = JSON.parse(dataServicesConf.incrementSteps);\n      }\n      this.dataServices.incrementSteps = dataServicesConf.incrementSteps || this.dataServices.incrementSteps;\n    }\n\n    if (this.dataServices.displayAll) this.dataServices.displayCount = this.getDataServices.length;\n  }\n}\n</script>\n\n<style scoped lang=\"scss\">\n.dsd-feature {\n  margin-bottom: 2rem;\n}\n\n// Desktop Table Styles\n.table-responsive-wrapper {\n  position: relative;\n  margin-top: 1rem;\n}\n\n.data-services-wrapper {\n  width: 100%;\n  overflow-x: auto;\n}\n\n.data-services-grid {\n  display: grid;\n  grid-template-columns: 1fr auto;\n  gap: 0;\n  min-width: 600px;\n}\n\n.grid-header {\n  display: contents;\n  \n  .grid-col {\n    padding: 0.75rem 1rem;\n    font-weight: 600;\n    background-color: #f3f6fc;\n    border-bottom: 2px solid #dee2e6;\n    \n    &:first-child {\n      border-top-left-radius: 4px;\n    }\n    \n    &:last-child {\n      border-top-right-radius: 4px;\n    }\n  }\n}\n\n.grid-row {\n  display: contents;\n  \n  &.empty-state {\n    .grid-col-full {\n      grid-column: 1 / -1;\n      padding: 2rem;\n      text-align: center;\n    }\n  }\n}\n\n.grid-col {\n  padding: 1rem;\n  border-bottom: 1px solid #dee2e6;\n  display: flex;\n  align-items: center;\n  \n  &.title-col {\n    min-width: 300px;\n  }\n  \n  &.actions-col {\n    min-width: 220px;    \n  }\n\n   &.end {\n    justify-content: flex-end;\n  }\n\n}\n\n// Sort Button Styles\n.sort-button {\n  background: none;\n  border: none;\n  display: flex;\n  align-items: center;\n  gap: 0.2rem;\n  font-weight: bold;\n  cursor: pointer;\n  padding: 0;\n  color: inherit;\n  font-size: inherit;\n  font-family: inherit;\n\n  &:hover {\n    color: #0E47CB;\n\n    .sort-arrows .sort-arrow {\n      opacity: 0.7;\n    }\n  }\n}\n\n.sort-arrows {\n  display: flex;\n  flex-direction: column;\n  gap: 1px;\n  margin-left: 0.25rem;\n}\n\n.sort-arrow {\n  color: #3b3b3b;\n  opacity: 0.8;\n  transition: all 0.2s ease;\n\n  &.active {\n    color: #0E47CB;\n    opacity: 1;\n  }\n\n  &:not(.active):hover {\n    opacity: 0.7;\n  }\n}\n\n.sort-arrow-up {\n  margin-bottom: -1px;\n}\n\n.sort-arrow-down {\n  margin-top: -1px;\n}\n\n// Data Service Item Styles\n.data-service-item {\n  display: contents;\n  \n  &.accordion-open {\n    .accordion-arrow {\n      transform: rotate(180deg);\n    }\n  }\n}\n\n.data-service-header {\n  background-color: #fff;\n  transition: background-color 0.2s ease;\n  \n  &:hover {\n    background-color: #f8f9fa;\n  }\n}\n\n.title-with-arrow {\n  width: 100%;\n}\n\n.accordion-title {\n  background: none;\n  border: none;\n  padding: 0;\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  cursor: pointer;\n  text-align: left;\n  color: #0E47CB;\n  \n}\n\n.data-service-title {\n  font-size: 1rem;\n  font-weight: 500;\n  margin: 0;\n  flex: 1;\n  word-break: break-word;\n  transition: color 0.2s ease;\n  font-weight: 700;\n}\n\n.accordion-arrow {\n  flex-shrink: 0;\n  margin-left: 0.5rem;\n  transition: transform 0.3s ease;\n  color: #0E47CB;\n  \n  &.rotated {\n    transform: rotate(180deg);\n  }\n}\n\n// Accordion Content\n.accordion-content {\n  grid-column: 1 / -1;\n  padding: 1rem 1rem 1.5rem;\n  background-color: #f8f9fa;\n  border-bottom: 1px solid #dee2e6;\n  animation: slideDown 0.3s ease;\n}\n\n@keyframes slideDown {\n  from {\n    opacity: 0;\n    max-height: 0;\n  }\n  to {\n    opacity: 1;\n    max-height: 500px;\n  }\n}\n\n.expanded-details {\n  max-width: 100%;\n}\n\n.details-list {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  gap: 0.75rem 1.5rem;\n  margin: 0;\n  font-size: 12px;\n  \n  dt {\n    font-weight: 600;\n     color: #333333;\n  }\n  \n  dd {\n    margin: 0;\n    color: #333333;\n    word-break: break-word;\n    \n    a {\n      color: #0E47CB;\n      text-decoration: none;\n      \n      &:hover {\n        text-decoration: underline;\n      }\n    }\n  }\n}\n\n// Actions Styles\n.actions-container {\n  display: flex;\n  gap: 0.5rem;\n  justify-content: flex-end;\n}\n\n.action-btns {\n    font-family: Arial;\n    font-weight: 400;\n    font-size: 16px !important;\n    line-height: 24px;\n    letter-spacing: 0px;\n    color: #0E47CB;\n    background: none;\n    border: none;\n    cursor: pointer;\n    margin-right: 12px;\n}\n\n// Show More Actions\n.show-more-actions {\n  display: flex;\n  justify-content: center;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n  padding: 1rem 0;\n}\n\n// Mobile Card Styles\n.data-services-cards {\n  margin-top: 1rem;\n}\n\n.data-service-card {\n  background: white;\n  border: 1px solid #dee2e6;\n  border-radius: 8px;\n  margin-bottom: 1rem;\n  overflow: hidden;\n  transition: box-shadow 0.2s ease;\n  \n  &:hover {\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n  }\n  \n  .card-header {\n    padding: 1rem;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    cursor: pointer;\n    border-bottom: 1px solid #dee2e6;\n    \n    &:hover {\n      background-color: #f8f9fa;\n    }\n  }\n  \n  .card-title-section {\n    flex: 1;\n  }\n  \n  .data-service-title {\n    font-size: 1rem;\n    font-weight: 500;\n    margin: 0;\n    word-break: break-word;\n  }\n  \n  .card-actions {\n    padding: 1rem;\n    display: flex;\n    flex-direction: column;\n    gap: 0.75rem;\n    border-bottom: 1px solid #dee2e6;\n  }\n  \n  .card-action-btn {\n    padding: 0.5rem 1rem;\n    font-size: 0.875rem;\n    border-radius: 4px;\n    border: none;\n    background-color: #0E47CB;\n    color: white;\n    cursor: pointer;\n    text-decoration: none;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    transition: background-color 0.2s ease;\n    \n    &:hover {\n      background-color: #0c3aa0;\n      color: white;\n      text-decoration: none;\n    }\n  }\n  \n  .card-expanded-content {\n    padding: 1rem;\n    background-color: #f8f9fa;\n    animation: slideDown 0.3s ease;\n  }\n}\n\n.empty-state-card {\n  background: white;\n  border: 1px solid #dee2e6;\n  border-radius: 8px;\n  padding: 2rem;\n  text-align: center;\n}\n</style>\n"],"names":["_sfc_main","AppLink","mapGetters","sorted","a","b","aValue","bValue","getTranslationFor","comparison","truncate","field","id","index","description","isNil","dataService","has","dataServicesConf","_hoisted_1","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_16","_hoisted_17","_hoisted_19","_hoisted_20","_hoisted_30","_hoisted_31","_hoisted_33","_hoisted_35","_hoisted_37","_hoisted_38","_hoisted_48","_openBlock","_createElementBlock","_createVNode","_component_dataset_details_feature_header","_ctx","$props","$data","$options","_hoisted_2","_createElementVNode","_createTextVNode","_toDisplayString","_normalizeClass","_Fragment","_renderList","$event","_withKeys","_withModifiers","_component_app_link","_hoisted_22","_hoisted_24","_hoisted_25","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_34","_hoisted_36","_hoisted_40","_hoisted_42","_hoisted_43","_hoisted_45","_hoisted_46","_hoisted_47"],"mappings":"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"}