Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/add insee multiselect and licence groups #347

Merged
merged 37 commits into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6152fe7
feat: :sparkles: Add Insee codes to publishingform spatial coverage
Jorek57 Jan 24, 2024
87de072
add optgroups to Multiselect
Jorek57 Jan 30, 2024
9a89d86
feat: :sparkles: groups working with description and code
Jorek57 Jan 30, 2024
99c7a18
refactor: :art: improve code readability
Jorek57 Jan 31, 2024
d3d94e3
Revert "refactor: :art: improve code readability"
Jorek57 Jan 31, 2024
826e7e9
fix: revert error commit
Jorek57 Jan 31, 2024
c7029aa
fix: revert error commit
Jorek57 Jan 31, 2024
4c1f5e6
fix: correct minor syntax error
Jorek57 Jan 31, 2024
27443e8
fix: remove console.log
Jorek57 Jan 31, 2024
bcddd82
Merge branch 'master' into feat/add-insee-multiselect
Jorek57 Feb 2, 2024
dee9b95
refac: improve code organization
Jorek57 Feb 2, 2024
85ec3c8
refactor: :art: add types + pass spatialGranularities as a initialOpt…
Jorek57 Feb 5, 2024
3c7c0d1
fix: remove commented code and syntax changes
Jorek57 Feb 19, 2024
048483d
fix: put spatial granularities api call in an api file
Jorek57 Feb 26, 2024
8783f1d
fix: edit syntax
Jorek57 Feb 27, 2024
187251e
fix: corrected previous emrge error
Jorek57 Feb 27, 2024
6e81144
fix: various types fixes
Jorek57 Feb 27, 2024
3234817
fix: edit wrong types + fix granularities call
Jorek57 Feb 27, 2024
bd26e91
Merge branch 'fix/correct-multiselect' into feat/add-insee-multiselect
Jorek57 Feb 27, 2024
0aa2571
fix: remove double placeholder in Multiselect
Jorek57 Feb 27, 2024
10b9bb8
fix: remove duplicate types
Jorek57 Feb 29, 2024
a6954fa
fix: add LocalizedUrl to spatial granularities
Jorek57 Feb 29, 2024
b1a54a4
fix: make description in multiselect optionnal + fix granularitiesUrl
Jorek57 Feb 29, 2024
c3b5c0d
fix: remove console.log
Jorek57 Mar 6, 2024
d0badef
fix: handle LICENSE_GROUPS not defined + correct wrong type in Multis…
Jorek57 Mar 21, 2024
4aaeb8c
fix: another type corrected in Multiselect
Jorek57 Mar 21, 2024
3347537
feat: :lipstick: update optgroup style in Multiselect to match design
Jorek57 Mar 26, 2024
182580b
docs: :memo: add changelog
Jorek57 Mar 26, 2024
7a1cc08
Merge branch 'master' into feat/add-insee-multiselect
Jorek57 Apr 2, 2024
5431e23
fix: fix conflicts
Jorek57 Apr 2, 2024
1939da4
refactor: :art: various types of syntax corrections
Jorek57 Apr 3, 2024
f37a1f0
fix: display description in Spatial coverage
Jorek57 Apr 4, 2024
084c9a8
style: :art: fix indentation in types.ts
Jorek57 Apr 8, 2024
b4ff3c0
Merge branch 'master' into feat/add-insee-multiselect
Jorek57 Apr 8, 2024
fdfd237
fix: :lipstick: edit multiselect css to match design expectations
Jorek57 Apr 8, 2024
ad48f10
fix multiselect line-heights and align
Jorek57 Apr 8, 2024
04ba1d0
fix: correct line-heights in multiselect
Jorek57 Apr 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,23 @@

## Current (in progress)

- Move Pagination to datagouv-components [#365](https://github.com/etalab/udata-front/pull/365)
- Fix release CI [#380](https://github.com/etalab/udata-front/pull/380)
- Add stories to Resource component [#364](https://github.com/etalab/udata-front/pull/364)
- Move Well to datagouv-components [#382](https://github.com/etalab/udata-front/pull/382)
- Add markdown editor [#351](https://github.com/etalab/udata-front/pull/351)
- Add codes and optgroups in Multiselect to display Insee codes and Licence groups [#347] (https://github.com/etalab/udata-front/pull/347)

## 3.5.4 (2024-03-20)

- Fix footer links and some translations [#366](https://github.com/etalab/udata-front/pull/366)
- Show error when dataset discussion from url doesn't exist [#367](https://github.com/etalab/udata-front/pull/367)
- Hide quality score on "work in progress" backends [#370](https://github.com/etalab/udata-front/pull/370)
- Add a new vite config for development [#372](https://github.com/etalab/udata-front/pull/372)
- Fix structure tab not shown [#369](https://github.com/etalab/udata-front/pull/369)
- Update sentry configuration to ignore aborted requests [#368](https://github.com/etalab/udata-front/pull/368)
- Fix CI not using udata release when needed [#363](https://github.com/etalab/udata-front/pull/363)

## 3.5.3 (2024-02-22)

- Show a map of datasets' spatial coverage [#354](https://github.com/etalab/udata-front/pull/354)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,6 @@ export default defineComponent({
* @type {Promise<import("axios").AxiosResponse<Array<Data> | {data: Array<Data> }>>}
*/
const request = api.get(props.listUrl)
console.log(request)
return request
.then(resp => {
let data = resp.data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,8 +293,8 @@
:placeholder="$t('Spatial granularity')"
:searchPlaceholder="$t('Search a granularity...')"
:initialOptions="granularities"
:values="dataset.spatial.granularity"
@change="(value) => dataset.spatial.granularity = value"
:values="dataset.spatial?.granularity"
@change="(value: string) => dataset.spatial ? dataset.spatial.granularity = value : dataset.spatial = {granularity: value}"
Jorek57 marked this conversation as resolved.
Show resolved Hide resolved
:hasWarning="fieldHasWarning('spatial_information')"
:allOption="$t('Select an option')"
:addAllOption="false"
Expand All @@ -318,6 +318,7 @@
export type Step2DescribeDatasetProps = {
originalDataset: NewDataset,
steps: Array<string>,
granularities: Array<SpatialGranularity>
};
</script>
<script setup lang="ts">
Expand All @@ -339,145 +340,89 @@ import { license_groups_options, quality_description_length, title } from "../..
import { useI18n } from 'vue-i18n';
import { getLicensesUrl } from '../../api/licenses';
import { getFrequenciesUrl } from '../../api/datasets';
import { NewDataset, PublishingFormAccordionState } from '../../types';
import { NewDataset, PublishingFormAccordionState, SpatialGranularity } from '../../types';
Jorek57 marked this conversation as resolved.
Show resolved Hide resolved

export default defineComponent({
components: { Accordion, AccordionGroup, Container, InputGroup, LinkedToAccordion, MultiSelect, Stepper, Well, Sidemenu },
emits: ["next"],
props: {
originalDataset: {
/** @type {import("vue").PropType<import("../../types").NewDataset>} */
type: Object,
required: true
},
steps: {
type: Array,
required: true,
},
granularities: {
/** @type {import("vue").PropType<Array<import("../../types").SpatialGranularity>>} */
type: Array,
required: true
}
},
tags: { required: tagsRequired },
temporal_coverage: { required: temporalCoverageRequired },
title: { required },
};
const emit = defineEmits(["next"]);
const props = defineProps<Step2DescribeDatasetProps>();

const { getErrorText, getFunctionalState, getWarningText, hasError, hasWarning, validateRequiredRules, v$, vWarning$ } = useFunctionalState(dataset, requiredRules, warningRules);
const { t } = useI18n();
const { id: nameDatasetAccordionId } = useUid("accordion");
const { id: addAcronymAccordionId } = useUid("accordion");
const { id: writeAGoodDescriptionAccordionId } = useUid("accordion");
const { id: useTagsAccordionId } = useUid("accordion");
const { id: selectLicenseAccordionId } = useUid("accordion");
const { id: chooseFrequencyAccordionId } = useUid("accordion");
const { id: addTemporalCoverageAccordionId } = useUid("accordion");
const { id: addSpatialInformationAccordionId } = useUid("accordion");

const frequenciesUrl = getFrequenciesUrl();
const licensesUrl = getLicensesUrl();
const licensesGroups = license_groups_options?.map(([name, values]) => ({
name,
values
}));
const formatSpatialZones = (data) => {
const suggestions = data.map(item => {
const matchingGranularity = props.granularities.find(granularity => granularity.id === item.level);
if (matchingGranularity) {
return {
...item,
description: matchingGranularity.name,
};
} else {
return {
...item,
};
}
});
return suggestions;
}

const notUnknown = not(t("The value must be different than unknown."), sameAs("unknown"));
const tagsRequired = requiredWithCustomMessage(t("Adding tags helps improve the SEO of your data."));
const temporalCoverageRequired = requiredWithCustomMessage(t("You did not provide the temporal coverage."));
const spatialGranularityRequired = requiredWithCustomMessage(t("You have not specified the spatial granularity."));
const dataset = reactive({...props.originalDataset});
if(!dataset.spatial) {
dataset.spatial = {
zones: undefined,
Jorek57 marked this conversation as resolved.
Show resolved Hide resolved
granularity: undefined,
}
}

const requiredRules = {
description: { required },
frequency: { required },
title: { required },
const frequenciesUrl = getFrequenciesUrl();
const licensesUrl = getLicensesUrl();
const licensesGroups = license_groups_options?.map(([name, values]) => ({
name,
values
}));
const formatSpatialZones = (data) => {
const suggestions = data.map(item => {
const matchingGranularity = props.granularities.find(granularity => granularity.id === item.level);
if (matchingGranularity) {
return {
...item,
description: matchingGranularity.name,
};

const warningRules = {
acronym: {},
description: {required, minLengthValue: minLengthWarning(quality_description_length), },
frequency: { required, notUnknown },
license: { required },
spatial: {
granularity: { required: spatialGranularityRequired },
},
tags: { required: tagsRequired },
temporal_coverage: { required: temporalCoverageRequired },
title: { required },
} else {
return {
...item,
};
}
});
return suggestions;
}

const { getErrorText, getFunctionalState, getWarningText, hasError, hasWarning, validateRequiredRules, v$, vWarning$ } = useFunctionalState(dataset, requiredRules, warningRules);

/**
* @type {import("vue").ComputedRef<Record<string, import("../../types").PublishingFormAccordionState>>}
*/
const state = computed(() => {
return {
acronym: vWarning$.value.acronym.$dirty ? "info" : "disabled",
title: getFunctionalState(vWarning$.value.title.$dirty, v$.value.title.$invalid, vWarning$.value.title.$error),
description: getFunctionalState(vWarning$.value.description.$dirty, v$.value.description.$invalid, vWarning$.value.description.$error),
tags: getFunctionalState(vWarning$.value.tags.$dirty, false, vWarning$.value.tags.$error),
license: getFunctionalState(vWarning$.value.license.$dirty, false, vWarning$.value.license.$error),
frequency: getFunctionalState(vWarning$.value.frequency.$dirty, v$.value.frequency.$invalid, vWarning$.value.frequency.$error),
temporal_coverage: getFunctionalState(vWarning$.value.temporal_coverage.$dirty, false, vWarning$.value.temporal_coverage.$error),
spatial_information: getFunctionalState(vWarning$.value.spatial.granularity.$dirty, false, vWarning$.value.spatial.granularity.$error),
};
});
const notUnknown = not(t("The value must be different than unknown."), sameAs("unknown"));
const tagsRequired = requiredWithCustomMessage(t("Adding tags helps improve the SEO of your data."));
const temporalCoverageRequired = requiredWithCustomMessage(t("You did not provide the temporal coverage."));
const spatialGranularityRequired = requiredWithCustomMessage(t("You have not specified the spatial granularity."));

/**
*
* @param {string} field
*/
const fieldHasError = (field) => hasError(state, field);
const requiredRules = {
description: { required },
frequency: { required },
title: { required },
};

/**
*
* @param {string} field
*/
const fieldHasWarning = (field) => hasWarning(state, field);
const warningRules = {
acronym: {},
description: {required, minLengthValue: minLengthWarning(parseInt(quality_description_length ?? "0"))},
frequency: { required, notUnknown },
license: { required },
spatial: {
granularity: { required: spatialGranularityRequired },
},
tags: { required: tagsRequired },
temporal_coverage: { required: temporalCoverageRequired },
title: { required },
};

const submit = () => {
validateRequiredRules().then(valid => {
if(valid) {
emit("next", dataset);
}
});
};
const { getErrorText, getFunctionalState, getWarningText, hasError, hasWarning, validateRequiredRules, v$, vWarning$ } = useFunctionalState(dataset, requiredRules, warningRules);

return {
addAcronymAccordionId,
nameDatasetAccordionId,
writeAGoodDescriptionAccordionId,
useTagsAccordionId,
selectLicenseAccordionId,
chooseFrequencyAccordionId,
addTemporalCoverageAccordionId,
addSpatialInformationAccordionId,
dataset,
editIcon,
frequenciesUrl,
licensesUrl,
licensesGroups,
state,
fieldHasError,
fieldHasWarning,
formatSpatialZones,
getErrorText,
getWarningText,
submit,
title,
v$,
vWarning$,
};
},
const state = computed<Record<string, PublishingFormAccordionState>>(() => {
return {
acronym: vWarning$.value.acronym.$dirty ? "info" : "disabled",
title: getFunctionalState(vWarning$.value.title.$dirty, v$.value.title.$invalid, vWarning$.value.title.$error),
description: getFunctionalState(vWarning$.value.description.$dirty, v$.value.description.$invalid, vWarning$.value.description.$error),
tags: getFunctionalState(vWarning$.value.tags.$dirty, false, vWarning$.value.tags.$error),
license: getFunctionalState(vWarning$.value.license.$dirty, false, vWarning$.value.license.$error),
frequency: getFunctionalState(vWarning$.value.frequency.$dirty, v$.value.frequency.$invalid, vWarning$.value.frequency.$error),
temporal_coverage: getFunctionalState(vWarning$.value.temporal_coverage.$dirty, false, vWarning$.value.temporal_coverage.$error),
spatial_information: getFunctionalState(vWarning$.value.spatial.granularity.$dirty, false, vWarning$.value.spatial.granularity.$error),
};
});

const fieldHasError = (field: string) => hasError(state, field);
Expand Down