@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.
Files changed (22) hide show
  1. package/.changeset/unlucky-camels-fail.md +5 -0
  2. package/CHANGELOG.md +6 -0
  3. package/addon/components/roadsign-regulation-plugin/roadsigns-modal.gts +35 -16
  4. package/addon/components/roadsign-regulation-plugin/roadsigns-table.gts +10 -7
  5. package/addon/plugins/roadsign-regulation-plugin/actions/insert-measure.ts +14 -12
  6. package/addon/plugins/roadsign-regulation-plugin/constants.ts +12 -9
  7. package/addon/plugins/roadsign-regulation-plugin/queries/mobility-measure-concept.ts +17 -11
  8. package/addon/plugins/roadsign-regulation-plugin/queries/{sign-codes.ts → traffic-signal-codes.ts} +14 -8
  9. package/addon/plugins/roadsign-regulation-plugin/queries/{sign-concept.ts → traffic-signal-concept.ts} +11 -6
  10. package/addon/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept.ts +2 -2
  11. package/addon/plugins/roadsign-regulation-plugin/schemas/traffic-signal-code.ts +8 -0
  12. package/addon/plugins/roadsign-regulation-plugin/schemas/{sign-concept.ts → traffic-signal-concept.ts} +6 -6
  13. package/declarations/addon/components/roadsign-regulation-plugin/roadsigns-modal.d.ts +5 -3
  14. package/declarations/addon/plugins/roadsign-regulation-plugin/constants.d.ts +5 -5
  15. package/declarations/addon/plugins/roadsign-regulation-plugin/queries/mobility-measure-concept.d.ts +2 -2
  16. package/declarations/addon/plugins/roadsign-regulation-plugin/queries/{sign-codes.d.ts → traffic-signal-codes.d.ts} +1 -1
  17. package/declarations/addon/plugins/roadsign-regulation-plugin/queries/{sign-concept.d.ts → traffic-signal-concept.d.ts} +1 -1
  18. package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/mobility-measure-concept.d.ts +3 -3
  19. package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/{sign-code.d.ts → traffic-signal-code.d.ts} +2 -2
  20. package/declarations/addon/plugins/roadsign-regulation-plugin/schemas/{sign-concept.d.ts → traffic-signal-concept.d.ts} +2 -2
  21. package/package.json +1 -1
  22. package/addon/plugins/roadsign-regulation-plugin/schemas/sign-code.ts +0 -8
@@ -0,0 +1,5 @@
1
+ ---
2
+ '@lblod/ember-rdfa-editor-lblod-plugins': patch
3
+ ---
4
+
5
+ Improve sorting of label filters on 'insert traffic measure' modal
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 querySignCodes from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/queries/sign-codes';
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 from 'ember-power-select/components/power-select';
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
- SIGN_CONCEPT_TYPES,
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
- (this.signConceptTypes.map((type) => type.uri) as string[]).includes(
108
- option.uri,
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 querySignCodes(this.endpoint, {
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 signs: string[] = [selectedCode.uri];
191
+ let combinedWith: string[] = [selectedCode.uri];
178
192
  if (this.selectedCodeCombination) {
179
- signs = [...signs, ...this.selectedCodeCombination.map((s) => s.uri)];
193
+ combinedWith = [
194
+ ...combinedWith,
195
+ ...this.selectedCodeCombination.map((s) => s.uri),
196
+ ];
180
197
  }
181
- return querySignCodes(this.endpoint, {
182
- combinedWith: signs,
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
- signConceptTypes = [
215
+ trafficSignalConceptTypes = [
199
216
  {
200
217
  label: 'Verkeersborden',
201
- uri: SIGN_CONCEPT_TYPES.ROAD_SIGN,
218
+ uri: TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_SIGN,
202
219
  },
203
220
  {
204
221
  label: 'Wegmarkeringen',
205
- uri: SIGN_CONCEPT_TYPES.ROAD_MARKING,
222
+ uri: TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_MARKING,
206
223
  },
207
224
  {
208
225
  label: 'Verkeerslichten',
209
- uri: SIGN_CONCEPT_TYPES.TRAFFIC_LIGHT,
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.signConceptTypes,
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 { SIGN_CONCEPT_TYPES } from '@lblod/ember-rdfa-editor-lblod-plugins/plugins/roadsign-regulation-plugin/constants';
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 signConcept of measureConcept.signConcepts) {
48
- if (signConcept.type === SIGN_CONCEPT_TYPES.ROAD_SIGN) {
49
- const categoryLabels = signConcept.categories.map((cat) => cat.label);
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 measureConcept.signConcepts as |signConcept|}}
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={{signConcept.image}}
103
+ src={{signalConcept.image}}
101
104
  alt={{t
102
105
  'editor-plugins.roadsign-regulation.table.content.image.alt'
103
- code=signConcept.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 { SignConcept } from '../schemas/sign-concept';
26
+ import { TrafficSignalConcept } from '../schemas/traffic-signal-concept';
27
27
  import {
28
28
  ROAD_SIGN_CATEGORIES,
29
- SIGN_CONCEPT_TYPES,
30
- SIGN_TYPE_MAPPING,
31
- SIGN_TYPES,
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.signConcepts.map((signConcept) =>
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: SignConcept) {
194
+ function determineSignLabel(signConcept: TrafficSignalConcept) {
195
195
  switch (signConcept.type) {
196
- case SIGN_CONCEPT_TYPES.TRAFFIC_LIGHT:
196
+ case TRAFFIC_SIGNAL_CONCEPT_TYPES.TRAFFIC_LIGHT:
197
197
  return 'Verkeerslicht';
198
- case SIGN_CONCEPT_TYPES.ROAD_MARKING:
198
+ case TRAFFIC_SIGNAL_CONCEPT_TYPES.ROAD_MARKING:
199
199
  return 'Wegmarkering';
200
- case SIGN_CONCEPT_TYPES.ROAD_SIGN:
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: SignConcept, schema: Schema) {
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(SIGN_TYPES.TRAFFIC_SIGN),
224
+ object: sayDataFactory.namedNode(TRAFFIC_SIGNAL_TYPES.TRAFFIC_SIGNAL),
225
225
  },
226
226
  {
227
227
  predicate: RDF('type').full,
228
- object: sayDataFactory.namedNode(SIGN_TYPE_MAPPING[signConcept.type]),
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 SIGN_CONCEPT_TYPES = {
12
- TRAFFIC_SIGN: MOBILITEIT('Verkeerstekenconcept').full,
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 SIGN_TYPES = {
19
- TRAFFIC_SIGN: MOBILITEIT('Verkeersteken').full,
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 SIGN_TYPE_MAPPING = {
26
- [SIGN_CONCEPT_TYPES.TRAFFIC_SIGN]: SIGN_TYPES.TRAFFIC_SIGN,
27
- [SIGN_CONCEPT_TYPES.ROAD_SIGN]: SIGN_TYPES.ROAD_SIGN,
28
- [SIGN_CONCEPT_TYPES.TRAFFIC_LIGHT]: SIGN_TYPES.TRAFFIC_LIGHT,
29
- [SIGN_CONCEPT_TYPES.ROAD_MARKING]: SIGN_TYPES.ROAD_MARKING,
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 { querySignConcepts } from './sign-concept';
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
- signType?: string;
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, signType, codes, category, searchString } = options;
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 (signType) {
43
- filters.push(`FILTER(?signType = ${sparqlEscapeUri(signType)})`);
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 ?signType;
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 signConcepts = await querySignConcepts(endpoint, {
143
- measureConceptUri: concept.uri,
144
- imageBaseUrl,
145
- });
145
+ const trafficSignalConcepts = await queryTrafficSignalConcepts(
146
+ endpoint,
147
+ {
148
+ measureConceptUri: concept.uri,
149
+ imageBaseUrl,
150
+ },
151
+ );
146
152
  return {
147
153
  ...concept,
148
- signConcepts,
154
+ trafficSignalConcepts,
149
155
  };
150
156
  }),
151
157
  );
@@ -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 { SignCodeSchema } from '../schemas/sign-code';
8
+ import { TrafficSignalCodeSchema } from '../schemas/traffic-signal-code';
9
9
 
10
- const DEFAULT_SIGN_TYPES = [
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 = DEFAULT_SIGN_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 ?signType {
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 querySignCodes(
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 ?signType;
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(?label)
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 SignCodeSchema.array().parse(bindings.map(objectify));
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 { SignConcept, SignConceptSchema } from '../schemas/sign-concept';
8
+ import {
9
+ TrafficSignalConcept,
10
+ TrafficSignalConceptSchema,
11
+ } from '../schemas/traffic-signal-concept';
9
12
  import queryRoadSignCategories from './road-sign-category';
10
- import { SIGN_CONCEPT_TYPES } from '../constants';
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 querySignConcepts(
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<SignConcept>>({
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 = SignConceptSchema.array().parse(bindings.map(objectify));
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 === SIGN_CONCEPT_TYPES.ROAD_SIGN) {
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 { SignConceptSchema } from './sign-concept';
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
- signConcepts: z.array(SignConceptSchema).default([]),
11
+ trafficSignalConcepts: z.array(TrafficSignalConceptSchema).default([]),
12
12
  });
13
13
 
14
14
  export type MobilityMeasureConcept = z.infer<
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+
3
+ export const TrafficSignalCodeSchema = z.object({
4
+ uri: z.string(),
5
+ label: z.string(),
6
+ });
7
+
8
+ export type TrafficSignalCode = z.infer<typeof TrafficSignalCodeSchema>;
@@ -1,8 +1,8 @@
1
1
  import { z } from 'zod';
2
- import { SIGN_CONCEPT_TYPES, ZONALITY_OPTIONS } from '../constants';
2
+ import { TRAFFIC_SIGNAL_CONCEPT_TYPES, ZONALITY_OPTIONS } from '../constants';
3
3
  import { RoadSignCategorySchema } from './road-sign-category';
4
4
 
5
- export const SignConceptSchema = z
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(SIGN_CONCEPT_TYPES.ROAD_SIGN),
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
- SIGN_CONCEPT_TYPES.ROAD_MARKING,
21
- SIGN_CONCEPT_TYPES.TRAFFIC_LIGHT,
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 SignConcept = z.infer<typeof SignConceptSchema>;
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
- signConceptTypes: ({
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
- signConcepts: ({
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
- signConcepts: ({
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 SIGN_CONCEPT_TYPES: {
7
- readonly TRAFFIC_SIGN: "https://data.vlaanderen.be/ns/mobiliteit#Verkeerstekenconcept";
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 SIGN_TYPES: {
13
- readonly TRAFFIC_SIGN: "https://data.vlaanderen.be/ns/mobiliteit#Verkeersteken";
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 SIGN_TYPE_MAPPING: {
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";
@@ -2,7 +2,7 @@ type QueryOptions<Count extends boolean = boolean> = {
2
2
  imageBaseUrl?: string;
3
3
  searchString?: string;
4
4
  zonality?: string;
5
- signType?: string;
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
- signConcepts: ({
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 querySignCodes(endpoint: string, options?: QueryOptions): Promise<{
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 querySignConcepts(endpoint: string, options?: QueryOptions): Promise<(({
6
+ export declare function queryTrafficSignalConcepts(endpoint: string, options?: QueryOptions): Promise<(({
7
7
  code: string;
8
8
  image: string;
9
9
  uri: string;
@@ -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
- signConcepts: z.ZodDefault<z.ZodArray<z.ZodIntersection<z.ZodObject<{
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
- signConcepts: ({
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
- signConcepts?: ({
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 SignCodeSchema: z.ZodObject<{
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 SignCode = z.infer<typeof SignCodeSchema>;
12
+ export type TrafficSignalCode = z.infer<typeof TrafficSignalCodeSchema>;
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export declare const SignConceptSchema: z.ZodIntersection<z.ZodObject<{
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 SignConcept = z.infer<typeof SignConceptSchema>;
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.4.1",
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",
@@ -1,8 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- export const SignCodeSchema = z.object({
4
- uri: z.string(),
5
- label: z.string(),
6
- });
7
-
8
- export type SignCode = z.infer<typeof SignCodeSchema>;