Skip to content

Commit 5e592bf

Browse files
authored
feat: add organisation select
1 parent 8eab8cd commit 5e592bf

21 files changed

Lines changed: 7737 additions & 14 deletions

go.work.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU
1111
github.com/italia/publiccode-parser-go v1.2.4 h1:ASdOVjgCNtlRKW+/ZrPxmguUxjhKx74vv0TKwLH3U6M=
1212
github.com/italia/publiccode-parser-go v1.2.4/go.mod h1:zYlDR8AbitTI9RzX3IRV73tqsmR0SOmhWCJDb3FpMT0=
1313
github.com/italia/publiccode-parser-go/v3 v3.0.0/go.mod h1:MXFsgghRD+t6k+08WEeRLNrlTzvPo1AqIRL2tRB4tDE=
14+
github.com/italia/publiccode-parser-go/v5 v5.1.1 h1:XVuWXNohNJfSvvXO3OjBoKJU09UELEtRXFpkSwOttvg=
15+
github.com/italia/publiccode-parser-go/v5 v5.1.1/go.mod h1:xndoanQHcweEnJlubntvOHlT/cvde0eFDF59O5PwuCg=
16+
github.com/italia/publiccode-parser-go/v5 v5.2.1 h1:9aDiCrh84nHAJzDRhf/Gx+exusfd4iQ0GCwtEwofeqo=
17+
github.com/italia/publiccode-parser-go/v5 v5.2.1/go.mod h1:xndoanQHcweEnJlubntvOHlT/cvde0eFDF59O5PwuCg=
1418
github.com/kyoh86/go-spdx v0.0.5-0.20220421143955-2f42f2d4c410/go.mod h1:0Ndah0G/f6NZOyvjm4hUmUGUjCKRzC1qirN4LKASBkM=
1519
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
1620
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
"prebuild": "npm run build:wasm && npm run build:licenses",
1414
"build:providers-oembed": "tsx scripts/getProvidersOembed.ts src/generated/providers-oembed.json",
1515
"build:licenses": "mkdir -p src/generated && tsx scripts/genLicenseList.ts src/generated/licenses.json",
16+
"build:organisations": "tsx src/app/data/generateOrganisations.ts",
1617
"build:wasm": "cp \"$(go env GOROOT)/misc/wasm/wasm_exec.js\" public && GOOS=js GOARCH=wasm go build -o public/main.wasm src/wasm/main.go",
1718
"serve": "rm -rf dist; npm run build && http-server dist",
1819
"test": "jest --passWithNoTests",
1920
"gdeploy": "gh-pages -u 'Deploy Bot <no-reply@puzzle.ch>' -d dist",
2021
"deploy": "gh-pages -u 'Deploy Bot <no-reply@teamdigitale.governo.it>' -d dist",
2122
"release": "release-it",
23+
"postinstall": "npm run build:organisations",
2224
"_postinstall": "patch-package"
2325
},
2426
"keywords": [

src/app/components/Editor.tsx

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import useFormPersist from "react-hook-form-persist";
1212
import { useTranslation } from "react-i18next";
1313
import { RequiredDeep } from "type-fest";
1414
import licenses from "../../generated/licenses.json";
15-
import { allLangs, displayName } from "../../i18n";
15+
import organisationData from "../data/organisations.json";
16+
import { allLangs, displayName, getLocalizedText } from "../../i18n";
1617
import categories from "../contents/categories";
1718
import { DEFAULT_COUNTRY_SECTIONS } from "../contents/constants";
1819
import * as countrySection from "../contents/countrySpecificSection";
@@ -130,6 +131,7 @@ const resolver: Resolver<PublicCode | PublicCodeWithDeprecatedFields> = async (
130131
const defaultValues = {
131132
publiccodeYmlVersion: LATEST_VERSION,
132133
legal: {},
134+
organisation: {},
133135
localisation: { availableLanguages: [] },
134136
maintenance: { contacts: undefined, contractors: undefined },
135137
platforms: [],
@@ -149,7 +151,7 @@ const isNotTheSameVersion = (version1: string, version2: string) => {
149151

150152
export default function Editor() {
151153
//#region UI
152-
const { t } = useTranslation();
154+
const { t, i18n } = useTranslation();
153155
const { countrySections } = useCountryStore();
154156
const { resetWarnings, setWarnings } = useWarningStore();
155157
const {
@@ -164,6 +166,14 @@ export default function Editor() {
164166
const { languages, setLanguages, resetLanguages } = useLanguagesStore();
165167
const { setCountrySections } = useCountryStore();
166168

169+
const organisations = organisationData.flatMap(data =>
170+
data.organisations.map(organisation => ({
171+
text: getLocalizedText(organisation.name, i18n.language),
172+
value: organisation.id,
173+
group: getLocalizedText(data.name, i18n.language) + " (" + getLocalizedText(data.abbreviation, i18n.language) + ")",
174+
}))
175+
);
176+
167177
const getNestedValue = (
168178
obj: PublicCodeWithDeprecatedFields,
169179
path: string
@@ -249,14 +259,31 @@ export default function Editor() {
249259
[setValue]
250260
);
251261

262+
const updateOrganisation = useCallback(
263+
(value: Partial<PublicCode>) => {
264+
const uri = value.organisation?.uri;
265+
266+
if (uri) {
267+
const organisation = organisations.find(o => o.value === uri);
268+
setValue("organisation.name", organisation?.text);
269+
} else {
270+
setValue("organisation", undefined)
271+
}
272+
},
273+
[organisations, setValue]
274+
)
275+
252276
useEffect(() => {
253277
const subscription = watch((value, { name }) => {
254278
if (name === "maintenance.type") {
255279
resetMaintenance(value as PublicCode);
256280
}
281+
if (name === "organisation.uri") {
282+
updateOrganisation(value as PublicCode)
283+
}
257284
});
258285
return () => subscription.unsubscribe();
259-
}, [watch, resetMaintenance]);
286+
}, [watch, resetMaintenance, updateOrganisation]);
260287
//#endregion
261288

262289
//#region form action handlers
@@ -534,6 +561,13 @@ export default function Editor() {
534561
<span>
535562
<EditorInput<"landingURL"> fieldName="landingURL" />
536563
</span>
564+
<div className="mt-5">
565+
<EditorSelect<"organisation.uri">
566+
fieldName="organisation.uri"
567+
data={organisations}
568+
filter="contains"
569+
/>
570+
</div>
537571
<span>
538572
<EditorInput<"isBasedOn"> fieldName="isBasedOn" />
539573
</span>

src/app/components/EditorSelect.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import PublicCode from "../contents/publiccode";
1313
type Props<T> = {
1414
fieldName: T;
1515
required?: boolean;
16-
data: Array<{ value: string; text: string }>;
17-
filter?: Filter<{ value: string; text: string }>;
16+
data: Array<{ value: string; text: string; group?: string }>;
17+
filter?: Filter<{ value: string; text: string; group?: string }>;
1818
};
1919

2020
export default function EditorSelect<
@@ -48,10 +48,18 @@ export default function EditorSelect<
4848
onChange(value)
4949
}}
5050
value={value}
51-
data={[...(!required ? [{ text: "(unset)", value: "" }] : []), ...data]}
51+
data={[...(!required ? [{text: "", value: ""}] : []), ...data]}
5252
dataKey="value"
5353
textField="text"
54+
renderListItem={(item) => {
55+
if (item.value === "") {
56+
return <span>(unset)</span>;
57+
} else {
58+
return <span>{item.text}</span>;
59+
}
60+
}}
5461
filter={filter}
62+
groupBy={"group"}
5563
/>
5664
<small className="form-text">{description}</small>
5765
{errorMessage && (

src/app/contents/fields/generic.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,17 @@ const fields = (): Array<Field> => {
7979
section: 1,
8080
widget: "url",
8181
},
82+
{
83+
type: "array",
84+
title: "uri",
85+
section: 0,
86+
items: {
87+
type: "string",
88+
enum: [],
89+
},
90+
widget: "combobox",
91+
group: "organization",
92+
},
8293
{
8394
title: "localisedName",
8495
type: "string",

src/app/contents/publiccode.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import maintenanceTypes from "./maintenanceTypes";
44
import scopes from "./scopes";
55
import softwareTypes from "./softwareTypes";
66

7-
export const LATEST_VERSION = "0.4.0"
7+
export const LATEST_VERSION = "0.5.0"
88

99
// https://yml.publiccode.tools/schema.core.html
1010
export default interface PublicCode {
@@ -13,6 +13,7 @@ export default interface PublicCode {
1313
applicationSuite?: string;
1414
url: string;
1515
landingURL?: string;
16+
organisation?: Organisation;
1617
isBasedOn?: string;
1718
softwareVersion?: string;
1819
releaseDate?: string; // “YYYY-MM-DD”
@@ -72,6 +73,11 @@ interface Legal {
7273
authorsFile?: string;
7374
}
7475

76+
interface Organisation {
77+
uri: string;
78+
name?: string;
79+
}
80+
7581
interface Maintenance {
7682
type: (typeof maintenanceTypes)[number];
7783
contractors?: Array<Contractor>;
@@ -186,6 +192,7 @@ export const publicCodeDummyObjectFactory = () => ({
186192
applicationSuite: '',
187193
url: '',
188194
landingURL: '',
195+
organisation: { uri: '' },
189196
isBasedOn: '',
190197
softwareVersion: '',
191198
releaseDate: '',

src/app/data/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Data
2+
3+
## Organisations
4+
5+
The data in the file `organisations.json` originates from the following sources:
6+
7+
- The seven departements and the Federal Chancellery (`departements.json`)
8+
```
9+
https://ld.admin.ch/sparql/#query=PREFIX%20schema%3A%20%3Chttp%3A%2F%2Fschema.org%2F%3E%0APREFIX%20rdf%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0APREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0A%0ASELECT%20DISTINCT%20%3Fdepartment%20%3FnameDepDe%20%3FnameDepFr%20%3FnameDepIt%20%3FnameDepEn%20%3FaltNameDepDe%20%3FaltNameDepFr%20%3FaltNameDepIt%20%3FaltNameDepEn%20%3Foffice%20%3FnameDe%20%3FnameFr%20%3FnameIt%20%3FnameEn%20WHERE%20%7B%0A%20%20%0A%20%20%3Fdepartment%20schema%3AinDefinedTermSet%20%3Chttps%3A%2F%2Fld.admin.ch%2Fdimension%2Fdepartment%3E.%0A%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDe.%20FILTER(lang(%3FnameDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameFr.%20FILTER(lang(%3FnameFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameIt.%20FILTER(lang(%3FnameIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameEn.%20FILTER(lang(%3FnameEn)%20%3D%20%22en%22)%20%7D%0A%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDe.%20FILTER(lang(%3FaltNameDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameFr.%20FILTER(lang(%3FaltNameFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameIt.%20FILTER(lang(%3FaltNameIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameEn.%20FILTER(lang(%3FaltNameEn)%20%3D%20%22en%22)%20%7D%0A%20%20%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepDe.%20FILTER(lang(%3FnameDepDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepFr.%20FILTER(lang(%3FnameDepFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepIt.%20FILTER(lang(%3FnameDepIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepEn.%20FILTER(lang(%3FnameDepEn)%20%3D%20%22en%22)%20%7D%0A%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepDe.%20FILTER(lang(%3FaltNameDepDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepFr.%20FILTER(lang(%3FaltNameDepFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepIt.%20FILTER(lang(%3FaltNameDepIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepEn.%20FILTER(lang(%3FaltNameDepEn)%20%3D%20%22en%22)%20%7D%0A%0A%7D%0A&endpoint=https%3A%2F%2Fld.admin.ch%2Fquery&requestMethod=POST&tabTitle=Query&headers=%7B%7D&contentTypeConstruct=text%2Fturtle&contentTypeSelect=application%2Fsparql-results%2Bjson&outputFormat=table&outputSettings=%7B%22isEllipsed%22%3Atrue%2C%22compact%22%3Afalse%7D
10+
```
11+
12+
- All offices of the seven departments (`offices.json`)
13+
```
14+
https://ld.admin.ch/sparql/#query=PREFIX%20schema%3A%20%3Chttp%3A%2F%2Fschema.org%2F%3E%0APREFIX%20rdf%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0APREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0A%0ASELECT%20DISTINCT%20%3Fdepartment%20%3FnameDepDe%20%3FnameDepFr%20%3FnameDepIt%20%3FnameDepEn%20%3FaltNameDepDe%20%3FaltNameDepFr%20%3FaltNameDepIt%20%3FaltNameDepEn%20%3Foffice%20%3FnameDe%20%3FnameFr%20%3FnameIt%20%3FnameEn%20WHERE%20%7B%0A%20%0A%20%20%3Foffice%20schema%3AinDefinedTermSet%20%3Chttps%3A%2F%2Fld.admin.ch%2Foffice%3E.%0A%20%20%3Foffice%20schema%3AparentOrganization%20%3Fdepartment.%0A%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3Aname%20%3FnameDe.%20FILTER(lang(%3FnameDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3Aname%20%3FnameFr.%20FILTER(lang(%3FnameFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3Aname%20%3FnameIt.%20FILTER(lang(%3FnameIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3Aname%20%3FnameEn.%20FILTER(lang(%3FnameEn)%20%3D%20%22en%22)%20%7D%0A%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3AalternateName%20%3FaltNameDe.%20FILTER(lang(%3FaltNameDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3AalternateName%20%3FaltNameFr.%20FILTER(lang(%3FaltNameFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3AalternateName%20%3FaltNameIt.%20FILTER(lang(%3FaltNameIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Foffice%20schema%3AalternateName%20%3FaltNameEn.%20FILTER(lang(%3FaltNameEn)%20%3D%20%22en%22)%20%7D%0A%20%20%0A%20%20%3Fdepartment%20schema%3AinDefinedTermSet%20%3Chttps%3A%2F%2Fld.admin.ch%2Fdepartment%3E.%0A%20%20%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepDe.%20FILTER(lang(%3FnameDepDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepFr.%20FILTER(lang(%3FnameDepFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepIt.%20FILTER(lang(%3FnameDepIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3Aname%20%3FnameDepEn.%20FILTER(lang(%3FnameDepEn)%20%3D%20%22en%22)%20%7D%0A%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepDe.%20FILTER(lang(%3FaltNameDepDe)%20%3D%20%22de%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepFr.%20FILTER(lang(%3FaltNameDepFr)%20%3D%20%22fr%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepIt.%20FILTER(lang(%3FaltNameDepIt)%20%3D%20%22it%22)%20%7D%0A%20%20OPTIONAL%20%7B%20%3Fdepartment%20schema%3AalternateName%20%3FaltNameDepEn.%20FILTER(lang(%3FaltNameDepEn)%20%3D%20%22en%22)%20%7D%0A%0A%7D%0A&endpoint=https%3A%2F%2Fld.admin.ch%2Fquery&requestMethod=POST&tabTitle=Query&headers=%7B%7D&contentTypeConstruct=text%2Fturtle&contentTypeSelect=application%2Fsparql-results%2Bjson&outputFormat=table&outputSettings=%7B%22pageSize%22%3A-1%7D
15+
```
16+
17+
It can be (re-)generated by running:
18+
19+
```bash
20+
npx run build:organisations
21+
```

0 commit comments

Comments
 (0)