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 @@