@lblod/ember-rdfa-editor-lblod-plugins 32.4.1 → 32.5.0-dev.e43d6dc46e0ca0a9cbcfb4bdd58985927f840af9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/unlucky-camels-fail.md +5 -0
- package/CHANGELOG.md +6 -0
- package/addon/components/roadsign-regulation-plugin/roadsigns-modal.gts +35 -16
- package/addon/components/roadsign-regulation-plugin/roadsigns-table.gts +10 -7
- package/addon/plugins/roadsign-regulation-plugin/actions/insert-measure.ts +14 -12
- package/addon/plugins/roadsign-regulation-plugin/constants.ts +12 -9
- package/addon/plugins/roadsign-regulation-plugin/queries/mobility-measure-concept.ts +17 -11
- package/addon/plugins/roadsign-regulation-plugin/queries/{sign-codes.ts → traffic-signal-codes.ts} +14 -8
- package/addon/plugins/roadsign-regulation-plugin/queries/{sign-concept.ts → traffic-signal-concept.ts} +11 -6
- package/addon/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept.ts +2 -2
- package/addon/plugins/roadsign-regulation-plugin/schemas/traffic-signal-code.ts +8 -0
- package/addon/plugins/roadsign-regulation-plugin/schemas/{sign-concept.ts → traffic-signal-concept.ts} +6 -6
- package/declarations/addon/components/roadsign-regulation-plugin/roadsigns-modal.d.ts +5 -3
- package/declarations/addon/plugins/roadsign-regulation-plugin/constants.d.ts +5 -5
- package/declarations/addon/plugins/roadsign-regulation-plugin/queries/mobility-measure-concept.d.ts +2 -2
- package/declarations/addon/plugins/roadsign-regulation-plugin/queries/{sign-codes.d.ts → traffic-signal-codes.d.ts} +1 -1
- package/declarations/addon/plugins/roadsign-regulation-plugin/queries/{sign-concept.d.ts → traffic-signal-concept.d.ts} +1 -1
- package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept.d.ts +3 -3
- package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/{sign-code.d.ts → traffic-signal-code.d.ts} +2 -2
- package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/{sign-concept.d.ts → traffic-signal-concept.d.ts} +2 -2
- package/package.json +1 -1
- package/addon/plugins/roadsign-regulation-plugin/schemas/sign-code.ts +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @lblod/ember-rdfa-editor-lblod-plugins
|
|
2
2
|
|
|
3
|
+
## 32.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#590](https://github.com/lblod/ember-rdfa-editor-lblod-plugins/pull/590) [`beb01f5`](https://github.com/lblod/ember-rdfa-editor-lblod-plugins/commit/beb01f573a2bf1ce42852e7ddb972a4ca01bf724) Thanks [@elpoelma](https://github.com/elpoelma)! - Rename `traffic-sign` to `traffic-signal`
|
|
8
|
+
|
|
3
9
|
## 32.4.1
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -13,12 +13,14 @@ import {
|
|
|
13
13
|
queryMobilityMeasures,
|
|
14
14
|
} from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/queries/mobility-measure-concept';
|
|
15
15
|
import queryRoadSignCategories from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/queries/road-sign-category';
|
|
16
|
-
import
|
|
16
|
+
import queryTrafficSignalCodes from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/queries/traffic-signal-codes';
|
|
17
17
|
import { MobilityMeasureConcept } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept';
|
|
18
18
|
import { pagination } from '@lblod/ember-rdfa-editor-lblod-plugins/helpers/pagination';
|
|
19
19
|
import { restartableTask, task, timeout } from 'ember-concurrency';
|
|
20
20
|
import t from 'ember-intl/helpers/t';
|
|
21
|
-
import PowerSelect
|
|
21
|
+
import PowerSelect, {
|
|
22
|
+
Select,
|
|
23
|
+
} from 'ember-power-select/components/power-select';
|
|
22
24
|
import PowerSelectMultiple from 'ember-power-select/components/power-select-multiple';
|
|
23
25
|
import { TaskInstance, trackedTask } from 'reactiveweb/ember-concurrency';
|
|
24
26
|
import { trackedFunction } from 'reactiveweb/function';
|
|
@@ -27,7 +29,7 @@ import PaginationView from '../pagination/pagination-view';
|
|
|
27
29
|
import { not, or } from 'ember-truth-helpers';
|
|
28
30
|
import { on } from '@ember/modifier';
|
|
29
31
|
import {
|
|
30
|
-
|
|
32
|
+
TRAFFIC_SIGNAL_CONCEPT_TYPES,
|
|
31
33
|
ZONALITY_OPTIONS,
|
|
32
34
|
} from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/constants';
|
|
33
35
|
import { resolveTemplate } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/actions/resolve-template';
|
|
@@ -104,9 +106,9 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
104
106
|
this.selectedCategory = undefined;
|
|
105
107
|
} else {
|
|
106
108
|
if (
|
|
107
|
-
(
|
|
108
|
-
|
|
109
|
-
)
|
|
109
|
+
(
|
|
110
|
+
this.trafficSignalConceptTypes.map((type) => type.uri) as string[]
|
|
111
|
+
).includes(option.uri)
|
|
110
112
|
) {
|
|
111
113
|
this.selectedType = option;
|
|
112
114
|
this.selectedCategory = undefined;
|
|
@@ -150,6 +152,18 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
150
152
|
this.args.closeModal();
|
|
151
153
|
}
|
|
152
154
|
|
|
155
|
+
@action
|
|
156
|
+
doFirstCodeSearch(select: Select) {
|
|
157
|
+
if (
|
|
158
|
+
this.searchCodes.isIdle &&
|
|
159
|
+
!select.searchText &&
|
|
160
|
+
// @ts-expect-error not part of the public API... (tested on PS 7 and 8)
|
|
161
|
+
this.searchCodes.lastSuccessful?.args?.[0] !== ''
|
|
162
|
+
) {
|
|
163
|
+
this.searchCodes.perform('');
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
153
167
|
searchCodes = restartableTask(async (term: string) => {
|
|
154
168
|
const category = this.selectedCategory?.uri;
|
|
155
169
|
const type = this.selectedType?.label;
|
|
@@ -157,7 +171,7 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
157
171
|
await timeout(DEBOUNCE_MS);
|
|
158
172
|
const abortController = new AbortController();
|
|
159
173
|
try {
|
|
160
|
-
return
|
|
174
|
+
return queryTrafficSignalCodes(this.endpoint, {
|
|
161
175
|
searchString: term,
|
|
162
176
|
roadSignCategory: category,
|
|
163
177
|
types,
|
|
@@ -174,12 +188,15 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
174
188
|
if (!selectedCode) {
|
|
175
189
|
return [];
|
|
176
190
|
}
|
|
177
|
-
let
|
|
191
|
+
let combinedWith: string[] = [selectedCode.uri];
|
|
178
192
|
if (this.selectedCodeCombination) {
|
|
179
|
-
|
|
193
|
+
combinedWith = [
|
|
194
|
+
...combinedWith,
|
|
195
|
+
...this.selectedCodeCombination.map((s) => s.uri),
|
|
196
|
+
];
|
|
180
197
|
}
|
|
181
|
-
return
|
|
182
|
-
combinedWith
|
|
198
|
+
return queryTrafficSignalCodes(this.endpoint, {
|
|
199
|
+
combinedWith,
|
|
183
200
|
});
|
|
184
201
|
});
|
|
185
202
|
|
|
@@ -195,18 +212,18 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
195
212
|
return this.classificationsQuery.value ?? [];
|
|
196
213
|
}
|
|
197
214
|
|
|
198
|
-
|
|
215
|
+
trafficSignalConceptTypes = [
|
|
199
216
|
{
|
|
200
217
|
label: 'Verkeersborden',
|
|
201
|
-
uri:
|
|
218
|
+
uri: TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN,
|
|
202
219
|
},
|
|
203
220
|
{
|
|
204
221
|
label: 'Wegmarkeringen',
|
|
205
|
-
uri:
|
|
222
|
+
uri: TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_MARKING,
|
|
206
223
|
},
|
|
207
224
|
{
|
|
208
225
|
label: 'Verkeerslichten',
|
|
209
|
-
uri:
|
|
226
|
+
uri: TRAFFIC_SIGNAL_CONCEPT_TYPES.TRAFFIC_LIGHT,
|
|
210
227
|
},
|
|
211
228
|
];
|
|
212
229
|
|
|
@@ -217,7 +234,7 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
217
234
|
return [
|
|
218
235
|
{
|
|
219
236
|
groupName: 'Types',
|
|
220
|
-
options: this.
|
|
237
|
+
options: this.trafficSignalConceptTypes,
|
|
221
238
|
},
|
|
222
239
|
{
|
|
223
240
|
groupName: 'Categorieën',
|
|
@@ -398,9 +415,11 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
398
415
|
@verticalPosition='below'
|
|
399
416
|
@searchEnabled={{true}}
|
|
400
417
|
@search={{this.searchCodes.perform}}
|
|
418
|
+
@options={{or this.searchCodes.last.value undefined}}
|
|
401
419
|
@selected={{this.selectedCode}}
|
|
402
420
|
@allowClear={{true}}
|
|
403
421
|
@onChange={{this.changeCode}}
|
|
422
|
+
@onOpen={{this.doFirstCodeSearch}}
|
|
404
423
|
as |option|
|
|
405
424
|
>
|
|
406
425
|
{{option.label}}
|
|
@@ -19,7 +19,7 @@ import { eq } from 'ember-truth-helpers';
|
|
|
19
19
|
import t from 'ember-intl/helpers/t';
|
|
20
20
|
import { on } from '@ember/modifier';
|
|
21
21
|
import { fn } from '@ember/helper';
|
|
22
|
-
import {
|
|
22
|
+
import { TRAFFIC_SIGNAL_CONCEPT_TYPES } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/constants';
|
|
23
23
|
|
|
24
24
|
type Signature = {
|
|
25
25
|
Args: {
|
|
@@ -44,9 +44,9 @@ export default class RoadSignsTable extends Component<Signature> {
|
|
|
44
44
|
|
|
45
45
|
categories = (measureConcept: MobilityMeasureConcept) => {
|
|
46
46
|
const categorySet: Set<string> = new Set();
|
|
47
|
-
for (const
|
|
48
|
-
if (
|
|
49
|
-
const categoryLabels =
|
|
47
|
+
for (const signalConcept of measureConcept.trafficSignalConcepts) {
|
|
48
|
+
if (signalConcept.type === TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN) {
|
|
49
|
+
const categoryLabels = signalConcept.categories.map((cat) => cat.label);
|
|
50
50
|
addAll(categorySet, ...categoryLabels);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -94,13 +94,16 @@ export default class RoadSignsTable extends Component<Signature> {
|
|
|
94
94
|
</td>
|
|
95
95
|
<td>
|
|
96
96
|
<div class='au-o-grid au-o-grid--tiny'>
|
|
97
|
-
{{#each
|
|
97
|
+
{{#each
|
|
98
|
+
measureConcept.trafficSignalConcepts
|
|
99
|
+
as |signalConcept|
|
|
100
|
+
}}
|
|
98
101
|
<div class='au-o-grid__item au-u-1-3'>
|
|
99
102
|
<img
|
|
100
|
-
src={{
|
|
103
|
+
src={{signalConcept.image}}
|
|
101
104
|
alt={{t
|
|
102
105
|
'editor-plugins.roadsign-regulation.table.content.image.alt'
|
|
103
|
-
code=
|
|
106
|
+
code=signalConcept.code
|
|
104
107
|
}}
|
|
105
108
|
class='au-c-data-table__image'
|
|
106
109
|
/>
|
|
@@ -23,12 +23,12 @@ import { MobilityMeasureConcept } from '../schemas/mobility-measure-concept';
|
|
|
23
23
|
import { Variable } from '../schemas/variable';
|
|
24
24
|
import { buildArticleStructure } from '../../decision-plugin/utils/build-article-structure';
|
|
25
25
|
import { insertArticle } from '../../decision-plugin/actions/insert-article';
|
|
26
|
-
import {
|
|
26
|
+
import { TrafficSignalConcept } from '../schemas/traffic-signal-concept';
|
|
27
27
|
import {
|
|
28
28
|
ROAD_SIGN_CATEGORIES,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
TRAFFIC_SIGNAL_CONCEPT_TYPES,
|
|
30
|
+
TRAFFIC_SIGNAL_TYPE_MAPPING,
|
|
31
|
+
TRAFFIC_SIGNAL_TYPES,
|
|
32
32
|
ZONALITY_OPTIONS,
|
|
33
33
|
} from '../constants';
|
|
34
34
|
import { createTextVariable } from '../../variable-plugin/actions/create-text-variable';
|
|
@@ -59,7 +59,7 @@ export default function insertMeasure({
|
|
|
59
59
|
}: InsertMeasureArgs): TransactionMonad<boolean> {
|
|
60
60
|
return function (state: EditorState) {
|
|
61
61
|
const { schema } = state;
|
|
62
|
-
const signNodes = measureConcept.
|
|
62
|
+
const signNodes = measureConcept.trafficSignalConcepts.map((signConcept) =>
|
|
63
63
|
constructSignNode(signConcept, schema),
|
|
64
64
|
);
|
|
65
65
|
let signSection: PNode[] = [];
|
|
@@ -191,13 +191,13 @@ function constructMeasureBody(
|
|
|
191
191
|
return schema.nodes.paragraph.create({}, nodes);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
function determineSignLabel(signConcept:
|
|
194
|
+
function determineSignLabel(signConcept: TrafficSignalConcept) {
|
|
195
195
|
switch (signConcept.type) {
|
|
196
|
-
case
|
|
196
|
+
case TRAFFIC_SIGNAL_CONCEPT_TYPES.TRAFFIC_LIGHT:
|
|
197
197
|
return 'Verkeerslicht';
|
|
198
|
-
case
|
|
198
|
+
case TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_MARKING:
|
|
199
199
|
return 'Wegmarkering';
|
|
200
|
-
case
|
|
200
|
+
case TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN:
|
|
201
201
|
if (
|
|
202
202
|
signConcept.categories
|
|
203
203
|
.map((cat) => cat.uri)
|
|
@@ -210,7 +210,7 @@ function determineSignLabel(signConcept: SignConcept) {
|
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
function constructSignNode(signConcept:
|
|
213
|
+
function constructSignNode(signConcept: TrafficSignalConcept, schema: Schema) {
|
|
214
214
|
const signUri = `http://data.lblod.info/verkeerstekens/${uuid()}`;
|
|
215
215
|
const prefix = determineSignLabel(signConcept);
|
|
216
216
|
const node = schema.nodes.inline_rdfa.create(
|
|
@@ -221,11 +221,13 @@ function constructSignNode(signConcept: SignConcept, schema: Schema) {
|
|
|
221
221
|
properties: [
|
|
222
222
|
{
|
|
223
223
|
predicate: RDF('type').full,
|
|
224
|
-
object: sayDataFactory.namedNode(
|
|
224
|
+
object: sayDataFactory.namedNode(TRAFFIC_SIGNAL_TYPES.TRAFFIC_SIGNAL),
|
|
225
225
|
},
|
|
226
226
|
{
|
|
227
227
|
predicate: RDF('type').full,
|
|
228
|
-
object: sayDataFactory.namedNode(
|
|
228
|
+
object: sayDataFactory.namedNode(
|
|
229
|
+
TRAFFIC_SIGNAL_TYPE_MAPPING[signConcept.type],
|
|
230
|
+
),
|
|
229
231
|
},
|
|
230
232
|
{
|
|
231
233
|
predicate: MOBILITEIT('heeftVerkeersbordconcept'),
|
|
@@ -8,25 +8,28 @@ export const ZONALITY_OPTIONS = {
|
|
|
8
8
|
'http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc',
|
|
9
9
|
} as const;
|
|
10
10
|
|
|
11
|
-
export const
|
|
12
|
-
|
|
11
|
+
export const TRAFFIC_SIGNAL_CONCEPT_TYPES = {
|
|
12
|
+
TRAFFIC_SIGNAL: MOBILITEIT('Verkeerstekenconcept').full,
|
|
13
13
|
ROAD_SIGN: MOBILITEIT('Verkeersbordconcept').full,
|
|
14
14
|
TRAFFIC_LIGHT: MOBILITEIT('Verkeerslichtconcept').full,
|
|
15
15
|
ROAD_MARKING: MOBILITEIT('Wegmarkeringconcept').full,
|
|
16
16
|
} as const;
|
|
17
17
|
|
|
18
|
-
export const
|
|
19
|
-
|
|
18
|
+
export const TRAFFIC_SIGNAL_TYPES = {
|
|
19
|
+
TRAFFIC_SIGNAL: MOBILITEIT('Verkeersteken').full,
|
|
20
20
|
ROAD_SIGN: MOBILITEIT('Verkeersbord').full,
|
|
21
21
|
TRAFFIC_LIGHT: MOBILITEIT('Verkeerslicht').full,
|
|
22
22
|
ROAD_MARKING: MOBILITEIT('Wegmarkering').full,
|
|
23
23
|
} as const;
|
|
24
24
|
|
|
25
|
-
export const
|
|
26
|
-
[
|
|
27
|
-
|
|
28
|
-
[
|
|
29
|
-
[
|
|
25
|
+
export const TRAFFIC_SIGNAL_TYPE_MAPPING = {
|
|
26
|
+
[TRAFFIC_SIGNAL_CONCEPT_TYPES.TRAFFIC_SIGNAL]:
|
|
27
|
+
TRAFFIC_SIGNAL_TYPES.TRAFFIC_SIGNAL,
|
|
28
|
+
[TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN]: TRAFFIC_SIGNAL_TYPES.ROAD_SIGN,
|
|
29
|
+
[TRAFFIC_SIGNAL_CONCEPT_TYPES.TRAFFIC_LIGHT]:
|
|
30
|
+
TRAFFIC_SIGNAL_TYPES.TRAFFIC_LIGHT,
|
|
31
|
+
[TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_MARKING]:
|
|
32
|
+
TRAFFIC_SIGNAL_TYPES.ROAD_MARKING,
|
|
30
33
|
} as const;
|
|
31
34
|
|
|
32
35
|
export const ROAD_SIGN_CATEGORIES = {
|
|
@@ -9,14 +9,14 @@ import {
|
|
|
9
9
|
MobilityMeasureConceptSchema,
|
|
10
10
|
} from '../schemas/mobility-measure-concept';
|
|
11
11
|
import { z } from 'zod';
|
|
12
|
-
import {
|
|
12
|
+
import { queryTrafficSignalConcepts } from './traffic-signal-concept';
|
|
13
13
|
import { ZONALITY_OPTIONS } from '../constants';
|
|
14
14
|
|
|
15
15
|
type QueryOptions<Count extends boolean = boolean> = {
|
|
16
16
|
imageBaseUrl?: string;
|
|
17
17
|
searchString?: string;
|
|
18
18
|
zonality?: string;
|
|
19
|
-
|
|
19
|
+
trafficSignalType?: string;
|
|
20
20
|
codes?: string[];
|
|
21
21
|
category?: string;
|
|
22
22
|
page?: number;
|
|
@@ -32,15 +32,18 @@ type Result<Count extends boolean> = Count extends true
|
|
|
32
32
|
function _buildFilters(
|
|
33
33
|
options: Omit<QueryOptions, 'page' | 'pageSize' | 'abortSignal' | 'count'>,
|
|
34
34
|
) {
|
|
35
|
-
const { zonality,
|
|
35
|
+
const { zonality, trafficSignalType, codes, category, searchString } =
|
|
36
|
+
options;
|
|
36
37
|
const filters = [];
|
|
37
38
|
if (zonality) {
|
|
38
39
|
filters.push(
|
|
39
40
|
`FILTER(?zonality IN (${sparqlEscapeUri(zonality)}, ${sparqlEscapeUri(ZONALITY_OPTIONS.POTENTIALLY_ZONAL)}))`,
|
|
40
41
|
);
|
|
41
42
|
}
|
|
42
|
-
if (
|
|
43
|
-
filters.push(
|
|
43
|
+
if (trafficSignalType) {
|
|
44
|
+
filters.push(
|
|
45
|
+
`FILTER(?trafficSignalType = ${sparqlEscapeUri(trafficSignalType)})`,
|
|
46
|
+
);
|
|
44
47
|
}
|
|
45
48
|
if (codes) {
|
|
46
49
|
filters.push(`
|
|
@@ -100,7 +103,7 @@ async function _queryMobilityMeasures<Count extends boolean>(
|
|
|
100
103
|
?templateUri ext:preview ?preview.
|
|
101
104
|
|
|
102
105
|
?signUri
|
|
103
|
-
a ?
|
|
106
|
+
a ?trafficSignalType;
|
|
104
107
|
mobiliteit:heeftMaatregelconcept ?uri;
|
|
105
108
|
skos:prefLabel ?signCode.
|
|
106
109
|
|
|
@@ -139,13 +142,16 @@ async function _queryMobilityMeasures<Count extends boolean>(
|
|
|
139
142
|
);
|
|
140
143
|
const conceptsWithSigns = await Promise.all(
|
|
141
144
|
concepts.map(async (concept) => {
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
const trafficSignalConcepts = await queryTrafficSignalConcepts(
|
|
146
|
+
endpoint,
|
|
147
|
+
{
|
|
148
|
+
measureConceptUri: concept.uri,
|
|
149
|
+
imageBaseUrl,
|
|
150
|
+
},
|
|
151
|
+
);
|
|
146
152
|
return {
|
|
147
153
|
...concept,
|
|
148
|
-
|
|
154
|
+
trafficSignalConcepts,
|
|
149
155
|
};
|
|
150
156
|
}),
|
|
151
157
|
);
|
package/addon/plugins/roadsign-regulation-plugin/queries/{sign-codes.ts → traffic-signal-codes.ts}
RENAMED
|
@@ -5,9 +5,9 @@ import {
|
|
|
5
5
|
sparqlEscapeString,
|
|
6
6
|
sparqlEscapeUri,
|
|
7
7
|
} from '@lblod/ember-rdfa-editor-lblod-plugins/utils/sparql-helpers';
|
|
8
|
-
import {
|
|
8
|
+
import { TrafficSignalCodeSchema } from '../schemas/traffic-signal-code';
|
|
9
9
|
|
|
10
|
-
const
|
|
10
|
+
const DEFAULT_SIGNAL_TYPES = [
|
|
11
11
|
'https://data.vlaanderen.be/ns/mobiliteit#Verkeersbordconcept',
|
|
12
12
|
'https://data.vlaanderen.be/ns/mobiliteit#Wegmarkeringconcept',
|
|
13
13
|
'https://data.vlaanderen.be/ns/mobiliteit#Verkeerslichtconcept',
|
|
@@ -24,7 +24,7 @@ type QueryOptions = {
|
|
|
24
24
|
function buildFilters({
|
|
25
25
|
searchString,
|
|
26
26
|
roadSignCategory,
|
|
27
|
-
types =
|
|
27
|
+
types = DEFAULT_SIGNAL_TYPES,
|
|
28
28
|
combinedWith,
|
|
29
29
|
}: Omit<QueryOptions, 'abortSignal'>) {
|
|
30
30
|
const categoryFilter = roadSignCategory
|
|
@@ -32,7 +32,7 @@ function buildFilters({
|
|
|
32
32
|
: '';
|
|
33
33
|
const typesArray = !Array.isArray(types) ? [types] : types;
|
|
34
34
|
const typeFilter = `
|
|
35
|
-
VALUES ?
|
|
35
|
+
VALUES ?trafficSignalType {
|
|
36
36
|
${typesArray.map((type) => sparqlEscapeUri(type)).join(`\n`)}
|
|
37
37
|
}
|
|
38
38
|
`;
|
|
@@ -70,13 +70,16 @@ function buildFilters({
|
|
|
70
70
|
`;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
export default async function
|
|
73
|
+
export default async function queryTrafficSignalCodes(
|
|
74
74
|
endpoint: string,
|
|
75
75
|
options: QueryOptions = {},
|
|
76
76
|
) {
|
|
77
77
|
const { abortSignal } = options;
|
|
78
78
|
const filterStatement = buildFilters(options);
|
|
79
79
|
|
|
80
|
+
// The sorting here is a little weird. This is to handle labels which are normally of the form
|
|
81
|
+
// 'A1.3b', where the 1.3 should be sorted as a number. There is no enforcement of this format, so
|
|
82
|
+
// we try to handle cases such as 'weird1.2.3LABEL' in a way that is not too broken.
|
|
80
83
|
const query = /* sparql */ `
|
|
81
84
|
PREFIX mobiliteit: <https://data.vlaanderen.be/ns/mobiliteit#>
|
|
82
85
|
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
|
|
@@ -88,14 +91,17 @@ export default async function querySignCodes(
|
|
|
88
91
|
?label
|
|
89
92
|
WHERE {
|
|
90
93
|
?uri mobiliteit:heeftMaatregelconcept ?measure.
|
|
91
|
-
?uri a ?
|
|
94
|
+
?uri a ?trafficSignalType;
|
|
92
95
|
skos:prefLabel ?label;
|
|
93
96
|
ext:valid ${sparqlEscapeBool(true)}.
|
|
94
97
|
${filterStatement}
|
|
98
|
+
BIND(REPLACE(?label, "^(\\\\D+).*", "$1", "i") AS ?firstLetters)
|
|
99
|
+
BIND(xsd:decimal(REPLACE(?label, "^\\\\D+(\\\\d*\\\\.?\\\\d*).*", "$1", "i")) AS ?number)
|
|
100
|
+
BIND(REPLACE(?label, "^\\\\D+\\\\d*\\\\.?\\\\d*(.*)", "$1", "i") AS ?secondLetters)
|
|
95
101
|
}
|
|
96
|
-
ORDER BY ASC(?
|
|
102
|
+
ORDER BY ASC(UCASE(?firstLetters)) ASC(?number) ASC(LCASE(?secondLetters))
|
|
97
103
|
`;
|
|
98
104
|
const queryResult = await executeQuery({ endpoint, query, abortSignal });
|
|
99
105
|
const bindings = queryResult.results.bindings;
|
|
100
|
-
return
|
|
106
|
+
return TrafficSignalCodeSchema.array().parse(bindings.map(objectify));
|
|
101
107
|
}
|
|
@@ -5,9 +5,12 @@ import {
|
|
|
5
5
|
sparqlEscapeString,
|
|
6
6
|
sparqlEscapeUri,
|
|
7
7
|
} from '@lblod/ember-rdfa-editor-lblod-plugins/utils/sparql-helpers';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
TrafficSignalConcept,
|
|
10
|
+
TrafficSignalConceptSchema,
|
|
11
|
+
} from '../schemas/traffic-signal-concept';
|
|
9
12
|
import queryRoadSignCategories from './road-sign-category';
|
|
10
|
-
import {
|
|
13
|
+
import { TRAFFIC_SIGNAL_CONCEPT_TYPES } from '../constants';
|
|
11
14
|
|
|
12
15
|
type QueryOptions = {
|
|
13
16
|
imageBaseUrl?: string;
|
|
@@ -15,7 +18,7 @@ type QueryOptions = {
|
|
|
15
18
|
abortSignal?: AbortSignal;
|
|
16
19
|
};
|
|
17
20
|
|
|
18
|
-
export async function
|
|
21
|
+
export async function queryTrafficSignalConcepts(
|
|
19
22
|
endpoint: string,
|
|
20
23
|
options: QueryOptions = {},
|
|
21
24
|
) {
|
|
@@ -55,16 +58,18 @@ export async function querySignConcepts(
|
|
|
55
58
|
${measureConceptUri ? `?uri mobiliteit:heeftMaatregelconcept ${sparqlEscapeUri(measureConceptUri)}` : ''}
|
|
56
59
|
}
|
|
57
60
|
`;
|
|
58
|
-
const queryResult = await executeQuery<BindingObject<
|
|
61
|
+
const queryResult = await executeQuery<BindingObject<TrafficSignalConcept>>({
|
|
59
62
|
query,
|
|
60
63
|
endpoint,
|
|
61
64
|
abortSignal,
|
|
62
65
|
});
|
|
63
66
|
const bindings = queryResult.results.bindings;
|
|
64
|
-
const concepts =
|
|
67
|
+
const concepts = TrafficSignalConceptSchema.array().parse(
|
|
68
|
+
bindings.map(objectify),
|
|
69
|
+
);
|
|
65
70
|
const conceptsWithCategories = await Promise.all(
|
|
66
71
|
concepts.map(async (concept) => {
|
|
67
|
-
if (concept.type ===
|
|
72
|
+
if (concept.type === TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN) {
|
|
68
73
|
const categories = await queryRoadSignCategories(endpoint, {
|
|
69
74
|
roadSignConceptUri: concept.uri,
|
|
70
75
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ZONALITY_OPTIONS } from '../constants';
|
|
2
|
-
import {
|
|
2
|
+
import { TrafficSignalConceptSchema } from './traffic-signal-concept';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
|
|
5
5
|
export const MobilityMeasureConceptSchema = z.object({
|
|
@@ -8,7 +8,7 @@ export const MobilityMeasureConceptSchema = z.object({
|
|
|
8
8
|
preview: z.string(),
|
|
9
9
|
zonality: z.nativeEnum(ZONALITY_OPTIONS),
|
|
10
10
|
variableSignage: z.boolean().default(false),
|
|
11
|
-
|
|
11
|
+
trafficSignalConcepts: z.array(TrafficSignalConceptSchema).default([]),
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
export type MobilityMeasureConcept = z.infer<
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { TRAFFIC_SIGNAL_CONCEPT_TYPES, ZONALITY_OPTIONS } from '../constants';
|
|
3
3
|
import { RoadSignCategorySchema } from './road-sign-category';
|
|
4
4
|
|
|
5
|
-
export const
|
|
5
|
+
export const TrafficSignalConceptSchema = z
|
|
6
6
|
.object({
|
|
7
7
|
uri: z.string(),
|
|
8
8
|
code: z.string(),
|
|
@@ -12,16 +12,16 @@ export const SignConceptSchema = z
|
|
|
12
12
|
.and(
|
|
13
13
|
z.discriminatedUnion('type', [
|
|
14
14
|
z.object({
|
|
15
|
-
type: z.literal(
|
|
15
|
+
type: z.literal(TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN),
|
|
16
16
|
categories: z.array(RoadSignCategorySchema).default([]),
|
|
17
17
|
}),
|
|
18
18
|
z.object({
|
|
19
19
|
type: z.enum([
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_MARKING,
|
|
21
|
+
TRAFFIC_SIGNAL_CONCEPT_TYPES.TRAFFIC_LIGHT,
|
|
22
22
|
]),
|
|
23
23
|
}),
|
|
24
24
|
]),
|
|
25
25
|
);
|
|
26
26
|
|
|
27
|
-
export type
|
|
27
|
+
export type TrafficSignalConcept = z.infer<typeof TrafficSignalConceptSchema>;
|
|
@@ -2,6 +2,7 @@ import Component from '@glimmer/component';
|
|
|
2
2
|
import { SayController } from '@lblod/ember-rdfa-editor';
|
|
3
3
|
import { RoadsignRegulationPluginOptions } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin';
|
|
4
4
|
import { MobilityMeasureConcept } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept';
|
|
5
|
+
import { Select } from 'ember-power-select/components/power-select';
|
|
5
6
|
import { TaskInstance } from 'reactiveweb/ember-concurrency';
|
|
6
7
|
import { ZONALITY_OPTIONS } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/constants';
|
|
7
8
|
type Option = {
|
|
@@ -43,6 +44,7 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
43
44
|
changeZonality(value: Zonality): void;
|
|
44
45
|
handleSearch(event: InputEvent): void;
|
|
45
46
|
closeModal(): void;
|
|
47
|
+
doFirstCodeSearch(select: Select): boolean;
|
|
46
48
|
searchCodes: import("ember-concurrency").TaskForAsyncTaskFunction<unknown, (term: string) => Promise<{
|
|
47
49
|
label: string;
|
|
48
50
|
uri: string;
|
|
@@ -63,7 +65,7 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
63
65
|
label: string;
|
|
64
66
|
uri: string;
|
|
65
67
|
}[];
|
|
66
|
-
|
|
68
|
+
trafficSignalConceptTypes: ({
|
|
67
69
|
label: string;
|
|
68
70
|
uri: "https://data.vlaanderen.be/ns/mobiliteit#Verkeersbordconcept";
|
|
69
71
|
} | {
|
|
@@ -84,7 +86,7 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
84
86
|
zonality: "http://lblod.data.gift/concepts/8f9367b2-c717-4be7-8833-4c75bbb4ae1f" | "http://lblod.data.gift/concepts/c81c6b96-736a-48cf-b003-6f5cc3dbc55d" | "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
85
87
|
preview: string;
|
|
86
88
|
variableSignage: boolean;
|
|
87
|
-
|
|
89
|
+
trafficSignalConcepts: ({
|
|
88
90
|
code: string;
|
|
89
91
|
image: string;
|
|
90
92
|
uri: string;
|
|
@@ -111,7 +113,7 @@ export default class RoadsignsModal extends Component<Signature> {
|
|
|
111
113
|
zonality: "http://lblod.data.gift/concepts/8f9367b2-c717-4be7-8833-4c75bbb4ae1f" | "http://lblod.data.gift/concepts/c81c6b96-736a-48cf-b003-6f5cc3dbc55d" | "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
112
114
|
preview: string;
|
|
113
115
|
variableSignage: boolean;
|
|
114
|
-
|
|
116
|
+
trafficSignalConcepts: ({
|
|
115
117
|
code: string;
|
|
116
118
|
image: string;
|
|
117
119
|
uri: string;
|
|
@@ -3,19 +3,19 @@ export declare const ZONALITY_OPTIONS: {
|
|
|
3
3
|
readonly ZONAL: "http://lblod.data.gift/concepts/c81c6b96-736a-48cf-b003-6f5cc3dbc55d";
|
|
4
4
|
readonly NON_ZONAL: "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
5
5
|
};
|
|
6
|
-
export declare const
|
|
7
|
-
readonly
|
|
6
|
+
export declare const TRAFFIC_SIGNAL_CONCEPT_TYPES: {
|
|
7
|
+
readonly TRAFFIC_SIGNAL: "https://data.vlaanderen.be/ns/mobiliteit#Verkeerstekenconcept";
|
|
8
8
|
readonly ROAD_SIGN: "https://data.vlaanderen.be/ns/mobiliteit#Verkeersbordconcept";
|
|
9
9
|
readonly TRAFFIC_LIGHT: "https://data.vlaanderen.be/ns/mobiliteit#Verkeerslichtconcept";
|
|
10
10
|
readonly ROAD_MARKING: "https://data.vlaanderen.be/ns/mobiliteit#Wegmarkeringconcept";
|
|
11
11
|
};
|
|
12
|
-
export declare const
|
|
13
|
-
readonly
|
|
12
|
+
export declare const TRAFFIC_SIGNAL_TYPES: {
|
|
13
|
+
readonly TRAFFIC_SIGNAL: "https://data.vlaanderen.be/ns/mobiliteit#Verkeersteken";
|
|
14
14
|
readonly ROAD_SIGN: "https://data.vlaanderen.be/ns/mobiliteit#Verkeersbord";
|
|
15
15
|
readonly TRAFFIC_LIGHT: "https://data.vlaanderen.be/ns/mobiliteit#Verkeerslicht";
|
|
16
16
|
readonly ROAD_MARKING: "https://data.vlaanderen.be/ns/mobiliteit#Wegmarkering";
|
|
17
17
|
};
|
|
18
|
-
export declare const
|
|
18
|
+
export declare const TRAFFIC_SIGNAL_TYPE_MAPPING: {
|
|
19
19
|
readonly "https://data.vlaanderen.be/ns/mobiliteit#Verkeerstekenconcept": "https://data.vlaanderen.be/ns/mobiliteit#Verkeersteken";
|
|
20
20
|
readonly "https://data.vlaanderen.be/ns/mobiliteit#Verkeersbordconcept": "https://data.vlaanderen.be/ns/mobiliteit#Verkeersbord";
|
|
21
21
|
readonly "https://data.vlaanderen.be/ns/mobiliteit#Verkeerslichtconcept": "https://data.vlaanderen.be/ns/mobiliteit#Verkeerslicht";
|
package/declarations/addon/plugins/roadsign-regulation-plugin/queries/mobility-measure-concept.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ type QueryOptions<Count extends boolean = boolean> = {
|
|
|
2
2
|
imageBaseUrl?: string;
|
|
3
3
|
searchString?: string;
|
|
4
4
|
zonality?: string;
|
|
5
|
-
|
|
5
|
+
trafficSignalType?: string;
|
|
6
6
|
codes?: string[];
|
|
7
7
|
category?: string;
|
|
8
8
|
page?: number;
|
|
@@ -16,7 +16,7 @@ export declare function queryMobilityMeasures(endpoint: string, options?: Omit<Q
|
|
|
16
16
|
zonality: "http://lblod.data.gift/concepts/8f9367b2-c717-4be7-8833-4c75bbb4ae1f" | "http://lblod.data.gift/concepts/c81c6b96-736a-48cf-b003-6f5cc3dbc55d" | "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
17
17
|
preview: string;
|
|
18
18
|
variableSignage: boolean;
|
|
19
|
-
|
|
19
|
+
trafficSignalConcepts: ({
|
|
20
20
|
code: string;
|
|
21
21
|
image: string;
|
|
22
22
|
uri: string;
|
|
@@ -5,7 +5,7 @@ type QueryOptions = {
|
|
|
5
5
|
combinedWith?: string | string[];
|
|
6
6
|
abortSignal?: AbortSignal;
|
|
7
7
|
};
|
|
8
|
-
export default function
|
|
8
|
+
export default function queryTrafficSignalCodes(endpoint: string, options?: QueryOptions): Promise<{
|
|
9
9
|
label: string;
|
|
10
10
|
uri: string;
|
|
11
11
|
}[]>;
|
|
@@ -3,7 +3,7 @@ type QueryOptions = {
|
|
|
3
3
|
measureConceptUri?: string;
|
|
4
4
|
abortSignal?: AbortSignal;
|
|
5
5
|
};
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function queryTrafficSignalConcepts(endpoint: string, options?: QueryOptions): Promise<(({
|
|
7
7
|
code: string;
|
|
8
8
|
image: string;
|
|
9
9
|
uri: string;
|
package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare const MobilityMeasureConceptSchema: z.ZodObject<{
|
|
|
9
9
|
readonly NON_ZONAL: "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
10
10
|
}>;
|
|
11
11
|
variableSignage: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
-
|
|
12
|
+
trafficSignalConcepts: z.ZodDefault<z.ZodArray<z.ZodIntersection<z.ZodObject<{
|
|
13
13
|
uri: z.ZodString;
|
|
14
14
|
code: z.ZodString;
|
|
15
15
|
image: z.ZodString;
|
|
@@ -65,7 +65,7 @@ export declare const MobilityMeasureConceptSchema: z.ZodObject<{
|
|
|
65
65
|
zonality: "http://lblod.data.gift/concepts/8f9367b2-c717-4be7-8833-4c75bbb4ae1f" | "http://lblod.data.gift/concepts/c81c6b96-736a-48cf-b003-6f5cc3dbc55d" | "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
66
66
|
preview: string;
|
|
67
67
|
variableSignage: boolean;
|
|
68
|
-
|
|
68
|
+
trafficSignalConcepts: ({
|
|
69
69
|
code: string;
|
|
70
70
|
image: string;
|
|
71
71
|
uri: string;
|
|
@@ -85,7 +85,7 @@ export declare const MobilityMeasureConceptSchema: z.ZodObject<{
|
|
|
85
85
|
zonality: "http://lblod.data.gift/concepts/8f9367b2-c717-4be7-8833-4c75bbb4ae1f" | "http://lblod.data.gift/concepts/c81c6b96-736a-48cf-b003-6f5cc3dbc55d" | "http://lblod.data.gift/concepts/b651931b-923c-477c-8da9-fc7dd841fdcc";
|
|
86
86
|
preview: string;
|
|
87
87
|
variableSignage?: boolean | undefined;
|
|
88
|
-
|
|
88
|
+
trafficSignalConcepts?: ({
|
|
89
89
|
code: string;
|
|
90
90
|
image: string;
|
|
91
91
|
uri: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const TrafficSignalCodeSchema: z.ZodObject<{
|
|
3
3
|
uri: z.ZodString;
|
|
4
4
|
label: z.ZodString;
|
|
5
5
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -9,4 +9,4 @@ export declare const SignCodeSchema: z.ZodObject<{
|
|
|
9
9
|
label: string;
|
|
10
10
|
uri: string;
|
|
11
11
|
}>;
|
|
12
|
-
export type
|
|
12
|
+
export type TrafficSignalCode = z.infer<typeof TrafficSignalCodeSchema>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const TrafficSignalConceptSchema: z.ZodIntersection<z.ZodObject<{
|
|
3
3
|
uri: z.ZodString;
|
|
4
4
|
code: z.ZodString;
|
|
5
5
|
image: z.ZodString;
|
|
@@ -49,4 +49,4 @@ export declare const SignConceptSchema: z.ZodIntersection<z.ZodObject<{
|
|
|
49
49
|
}, {
|
|
50
50
|
type: "https://data.vlaanderen.be/ns/mobiliteit#Verkeerslichtconcept" | "https://data.vlaanderen.be/ns/mobiliteit#Wegmarkeringconcept";
|
|
51
51
|
}>]>>;
|
|
52
|
-
export type
|
|
52
|
+
export type TrafficSignalConcept = z.infer<typeof TrafficSignalConceptSchema>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lblod/ember-rdfa-editor-lblod-plugins",
|
|
3
|
-
"version": "32.
|
|
3
|
+
"version": "32.5.0-dev.e43d6dc46e0ca0a9cbcfb4bdd58985927f840af9",
|
|
4
4
|
"description": "Ember addon providing lblod specific plugins for the ember-rdfa-editor",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ember-addon",
|