diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f2657f753..37b7874b8 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -137,7 +137,7 @@ jobs:
with:
repository: opendatateam/udata
path: ${{ env.UDATA_WORKING_DIR }}
- ref: main
+ ref: feat/add-file-to-charts
- name: Set up uv
uses: astral-sh/setup-uv@v6
diff --git a/components/Charts/ChartConfigurator.vue b/components/Charts/ChartConfigurator.vue
index 60698f5e0..705cec5de 100644
--- a/components/Charts/ChartConfigurator.vue
+++ b/components/Charts/ChartConfigurator.vue
@@ -36,6 +36,7 @@
@@ -415,7 +416,7 @@ const savedResources = reactive>({})
const selectedResource = ref('14dba482-41e3-4c54-b82a-d8c11d1d80eb')
const savedChart = ref(null)
const selectedChartId = ref('')
-
+const image = ref(null)
const debounceMs = 300
const title = ref(form.value.title)
const desc = ref(form.value.description)
@@ -450,7 +451,7 @@ const columnDetails = computed(() => {
return options
})
-const { $api } = useNuxtApp()
+const { $api, $fileApi } = useNuxtApp()
const runtimeConfig = useRuntimeConfig()
const hasTabularData = useHasTabularData()
const getProfile = useGetProfile()
@@ -506,6 +507,11 @@ watch(columns, (columnsPerResource) => {
}
})
+async function updateImage(value: string) {
+ const i = await fetch(value)
+ image.value = await i.blob()
+}
+
async function loadMissingResourcesForChart(resourceIds: Set) {
for (const id of resourceIds) {
if (savedResources[id]) continue
@@ -577,6 +583,15 @@ async function saveChart() {
})
}
+ if (image.value) {
+ const formData = new FormData()
+ formData.set('file', image.value, 'image.png')
+ await $fileApi(`/api/1/visualizations/${savedChart.value.id}/image/`, {
+ method: 'POST',
+ body: formData,
+ })
+ }
+
toast.success(update ? t('Graphique mis à jour !') : t('Graphique sauvegardé !'))
await refresh()
selectedChartId.value = savedChart.value.id
diff --git a/datagouv-components/src/components/Chart/ChartViewer.vue b/datagouv-components/src/components/Chart/ChartViewer.vue
index 093da9eca..f84dfb37e 100644
--- a/datagouv-components/src/components/Chart/ChartViewer.vue
+++ b/datagouv-components/src/components/Chart/ChartViewer.vue
@@ -26,10 +26,18 @@ const props = defineProps<{
}
}>()
+const emit = defineEmits<{
+ update: [value: string | null]
+}>()
+
const { locale } = useTranslation()
const chartContainer = ref(null)
let echartsInstance: EChartsType | null = null
+const finishHandler = () => {
+ emit('update', echartsInstance?.getDataURL() ?? null)
+}
+
function mapXAxisType(xAxis: XAxis | XAxisForm): 'category' | 'value' {
if (!xAxis) return 'category'
return (xAxis.type ?? 'discrete') === 'continuous' ? 'value' : 'category'
@@ -187,12 +195,14 @@ const echartsOption = computed(() => {
onMounted(() => {
if (chartContainer.value) {
echartsInstance = init(chartContainer.value)
+ echartsInstance.on('finished', finishHandler)
updateChart()
}
})
onUnmounted(() => {
if (echartsInstance) {
+ echartsInstance.off('finished', finishHandler)
echartsInstance.dispose()
echartsInstance = null
}
diff --git a/datagouv-components/src/components/Chart/ChartViewerWrapper.vue b/datagouv-components/src/components/Chart/ChartViewerWrapper.vue
index 34dfc1182..068a29f3b 100644
--- a/datagouv-components/src/components/Chart/ChartViewerWrapper.vue
+++ b/datagouv-components/src/components/Chart/ChartViewerWrapper.vue
@@ -7,6 +7,7 @@
{ if (value) $emit('update', value) }"
/>
@@ -32,6 +33,7 @@ const props = defineProps<{
const emit = defineEmits<{
columns: [columns: Record>]
+ update: [value: string]
}>()
const { t } = useTranslation()