@mapcreator/sdk 0.0.8 → 0.0.9

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 (123) hide show
  1. package/dist/{HighlightManager.d.ts → esm/HighlightManager.d.ts} +2 -2
  2. package/dist/esm/HighlightManager.js +203 -0
  3. package/dist/{MCMap.d.ts → esm/MCMap.d.ts} +1 -1
  4. package/dist/esm/MCMap.js +254 -0
  5. package/dist/{PopupManager.d.ts → esm/PopupManager.d.ts} +4 -4
  6. package/dist/esm/PopupManager.js +297 -0
  7. package/dist/{Registry.d.ts → esm/Registry.d.ts} +3 -3
  8. package/dist/esm/Registry.js +74 -0
  9. package/dist/{adornments → esm/adornments}/categoricalLegend.d.ts +1 -1
  10. package/dist/esm/adornments/categoricalLegend.js +141 -0
  11. package/dist/{adornments → esm/adornments}/connectedLegend.d.ts +2 -2
  12. package/dist/esm/adornments/connectedLegend.js +393 -0
  13. package/dist/{adornments → esm/adornments}/customAdornment.d.ts +1 -1
  14. package/dist/esm/adornments/customAdornment.js +29 -0
  15. package/dist/{adornments → esm/adornments}/heading.d.ts +1 -1
  16. package/dist/esm/adornments/heading.js +71 -0
  17. package/dist/esm/adornments/insetMap.d.ts +3 -0
  18. package/dist/esm/adornments/insetMap.js +351 -0
  19. package/dist/{adornments → esm/adornments}/manualLegend.d.ts +1 -1
  20. package/dist/esm/adornments/manualLegend.js +15 -0
  21. package/dist/esm/adornments/northArrow.d.ts +3 -0
  22. package/dist/esm/adornments/northArrow.js +24 -0
  23. package/dist/esm/adornments/scalebar.d.ts +3 -0
  24. package/dist/esm/adornments/scalebar.js +176 -0
  25. package/dist/{constants → esm/constants}/index.d.ts +2 -2
  26. package/dist/esm/constants/index.js +53 -0
  27. package/dist/esm/controls/controls.js +7 -0
  28. package/dist/{controls → esm/controls}/fullscreenControls.d.ts +1 -1
  29. package/dist/esm/controls/fullscreenControls.js +29 -0
  30. package/dist/{controls → esm/controls}/geocoderControl.d.ts +1 -1
  31. package/dist/esm/controls/geocoderControl.js +202 -0
  32. package/dist/{controls → esm/controls}/geolocationControls.d.ts +1 -1
  33. package/dist/esm/controls/geolocationControls.js +65 -0
  34. package/dist/esm/controls/refreshMapControls.d.ts +3 -0
  35. package/dist/esm/controls/refreshMapControls.js +26 -0
  36. package/dist/esm/controls/webControls.d.ts +4 -0
  37. package/dist/esm/controls/webControls.js +40 -0
  38. package/dist/{controls → esm/controls}/zoomControls.d.ts +1 -1
  39. package/dist/esm/controls/zoomControls.js +23 -0
  40. package/dist/esm/i18n.js +21 -0
  41. package/dist/esm/index.d.ts +5 -0
  42. package/dist/esm/index.js +5 -0
  43. package/dist/esm/locales/da_DK/strings.json +7 -0
  44. package/dist/esm/locales/de_DE/strings.json +7 -0
  45. package/dist/esm/locales/en_GB/strings.json +7 -0
  46. package/dist/esm/locales/es_ES/strings.json +7 -0
  47. package/dist/esm/locales/fr_FR/strings.json +7 -0
  48. package/dist/esm/locales/it_IT/strings.json +7 -0
  49. package/dist/esm/locales/nl_NL/strings.json +7 -0
  50. package/dist/esm/models/area.d.ts +5 -0
  51. package/dist/esm/models/area.js +165 -0
  52. package/dist/esm/models/circle.d.ts +5 -0
  53. package/dist/esm/models/circle.js +110 -0
  54. package/dist/esm/models/dot.d.ts +3 -0
  55. package/dist/esm/models/dot.js +42 -0
  56. package/dist/esm/models/line.d.ts +4 -0
  57. package/dist/esm/models/line.js +117 -0
  58. package/dist/esm/models/marker.d.ts +5 -0
  59. package/dist/esm/models/marker.js +179 -0
  60. package/dist/esm/models/polygon.d.ts +5 -0
  61. package/dist/esm/models/polygon.js +80 -0
  62. package/dist/{renderAdornments.d.ts → esm/renderAdornments.d.ts} +3 -3
  63. package/dist/esm/renderAdornments.js +129 -0
  64. package/dist/esm/types/geometry.js +1 -0
  65. package/dist/{types → esm/types}/index.d.ts +1 -1
  66. package/dist/esm/types/index.js +1 -0
  67. package/dist/esm/types/jobObject.js +1 -0
  68. package/dist/{types → esm/types}/mapstyle.d.ts +6 -2
  69. package/dist/esm/types/mapstyle.js +1 -0
  70. package/dist/esm/utils/browser.js +6 -0
  71. package/dist/{utils → esm/utils}/choropleth.d.ts +3 -3
  72. package/dist/esm/utils/choropleth.js +110 -0
  73. package/dist/esm/utils/fullscreen.js +40 -0
  74. package/dist/{utils → esm/utils}/geolocation.d.ts +1 -1
  75. package/dist/esm/utils/geolocation.js +93 -0
  76. package/dist/{utils → esm/utils}/graphhopper.d.ts +1 -1
  77. package/dist/esm/utils/graphhopper.js +41 -0
  78. package/dist/{utils → esm/utils}/helpers.d.ts +2 -2
  79. package/dist/esm/utils/helpers.js +116 -0
  80. package/dist/{utils → esm/utils}/language.d.ts +1 -1
  81. package/dist/esm/utils/language.js +170 -0
  82. package/dist/{utils → esm/utils}/models.d.ts +4 -4
  83. package/dist/esm/utils/models.js +103 -0
  84. package/dist/{utils → esm/utils}/overlays.d.ts +1 -1
  85. package/dist/esm/utils/overlays.js +87 -0
  86. package/dist/esm/utils/scalebar.js +52 -0
  87. package/dist/{utils → esm/utils}/svgHelpers.d.ts +4 -3
  88. package/dist/esm/utils/svgHelpers.js +1512 -0
  89. package/dist/{utils → esm/utils}/template.d.ts +2 -2
  90. package/dist/esm/utils/template.js +120 -0
  91. package/dist/{utils → esm/utils}/youtube.d.ts +1 -1
  92. package/dist/esm/utils/youtube.js +64 -0
  93. package/dist/favicon-32x32.png +0 -0
  94. package/dist/mapcreator-sdk.umd.cjs +3 -3
  95. package/dist/report.html +4950 -0
  96. package/package.json +7 -7
  97. package/dist/adornments/insetMap.d.ts +0 -3
  98. package/dist/adornments/northArrow.d.ts +0 -3
  99. package/dist/adornments/scalebar.d.ts +0 -3
  100. package/dist/controls/refreshMapControls.d.ts +0 -3
  101. package/dist/controls/webControls.d.ts +0 -4
  102. package/dist/index.d.ts +0 -3
  103. package/dist/locales/da_DK/strings.json.d.ts +0 -10
  104. package/dist/locales/de_DE/strings.json.d.ts +0 -10
  105. package/dist/locales/en_GB/strings.json.d.ts +0 -10
  106. package/dist/locales/es_ES/strings.json.d.ts +0 -10
  107. package/dist/locales/fr_FR/strings.json.d.ts +0 -10
  108. package/dist/locales/it_IT/strings.json.d.ts +0 -10
  109. package/dist/locales/nl_NL/strings.json.d.ts +0 -10
  110. package/dist/mapcreator-sdk.js +0 -39590
  111. package/dist/models/area.d.ts +0 -5
  112. package/dist/models/circle.d.ts +0 -5
  113. package/dist/models/dot.d.ts +0 -3
  114. package/dist/models/line.d.ts +0 -4
  115. package/dist/models/marker.d.ts +0 -5
  116. package/dist/models/polygon.d.ts +0 -5
  117. /package/dist/{controls → esm/controls}/controls.d.ts +0 -0
  118. /package/dist/{i18n.d.ts → esm/i18n.d.ts} +0 -0
  119. /package/dist/{types → esm/types}/geometry.d.ts +0 -0
  120. /package/dist/{types → esm/types}/jobObject.d.ts +0 -0
  121. /package/dist/{utils → esm/utils}/browser.d.ts +0 -0
  122. /package/dist/{utils → esm/utils}/fullscreen.d.ts +0 -0
  123. /package/dist/{utils → esm/utils}/scalebar.d.ts +0 -0
@@ -1,5 +1,5 @@
1
- import { Mode } from '../types';
2
- import { JobObjectDataBindings, PopupMedia } from '../types/jobObject';
1
+ import type { Mode } from '@/types';
2
+ import type { JobObjectDataBindings, PopupMedia } from '@/types/jobObject';
3
3
  export declare function buildTemplate(template: string | undefined, popupMedia: PopupMedia | undefined, bindings: JobObjectDataBindings, mode: Mode): string;
4
4
  export declare const closeButtonHtml: string;
5
5
  export declare const cycleButtonsHtml: string;
@@ -0,0 +1,120 @@
1
+ import prevButtonIcon from '@/images/popup-previous.svg?raw';
2
+ import closeButtonIcon from '@/images/popup-close.svg?raw';
3
+ import nextButtonIcon from '@/images/popup-next.svg?raw';
4
+ import alertIcon from '@/images/alert-triangle.svg?raw';
5
+ import { t } from '@/i18n';
6
+ import { getEmbedUrlFromYoutubeUrl } from '@/utils/youtube';
7
+ import { bindingToString, getYoutubeVideoId, resolveBinding } from '@/utils/helpers';
8
+ export function buildTemplate(template, popupMedia, bindings, mode) {
9
+ let mediaHtml;
10
+ if (popupMedia?.type === 'video') {
11
+ mediaHtml =
12
+ mode === 'preview'
13
+ ? getYoutubePlaceholder(popupMedia.src, bindings)
14
+ : `
15
+ <div class="youtube-container">
16
+ <iframe
17
+ src="${getEmbedUrlFromYoutubeUrl(popupMedia, bindings)}"
18
+ width="100%" height="300" style="border: none" allowfullscreen>
19
+ </iframe>
20
+ </div>
21
+ `;
22
+ }
23
+ else if (popupMedia?.type === 'image') {
24
+ const src = resolveBinding(popupMedia.src, bindings);
25
+ const alt = resolveBinding(popupMedia.alt, bindings);
26
+ const fillClass = popupMedia.fill ? 'fill' : '';
27
+ mediaHtml = `
28
+ <div class="image-container ${fillClass}">
29
+ <img src="${src}" alt="${alt}" />
30
+ </div>
31
+ `;
32
+ }
33
+ mediaHtml = mediaHtml ? `<div class="media-content">${mediaHtml}</div>` : '';
34
+ const textHtml = template
35
+ ? `<div class="text-content">${parseTemplate(template, bindings)}</div>`
36
+ : '';
37
+ return `
38
+ <div class="popup-scroll-wrapper">
39
+ <div class="mc-popup">
40
+ ${mediaHtml}
41
+ ${textHtml}
42
+ </div>
43
+ </div>
44
+ `;
45
+ }
46
+ export const closeButtonHtml = `
47
+ <button class="mc-popup-button close">
48
+ ${closeButtonIcon}
49
+ </button>
50
+ `;
51
+ export const cycleButtonsHtml = `
52
+ <div class="cycle-buttons">
53
+ <button class="mc-popup-button prev">
54
+ ${prevButtonIcon}
55
+ </button>
56
+ <button class="mc-popup-button next">
57
+ ${nextButtonIcon}
58
+ </button>
59
+ </div>
60
+ `;
61
+ /**
62
+ * @todo Use DOM
63
+ */
64
+ function parseTemplate(template, bindings) {
65
+ // Copied from https://gitlab.com/mapcreator/mapcreator/-/blob/master/src/utils/template.ts#L11
66
+ if (!template) {
67
+ return '';
68
+ }
69
+ const reAnchors = />\$(.+?)</gi;
70
+ const reMentionSpan = /<span\s+class="mention"\s+data-mention-id="[^"]*">(.*?)<\/span>/gim;
71
+ const reAttributes = /(\S+?)\s*=\s*"\$([^"]+?)"/g;
72
+ const reMentionYoutube = /youtube\.com\/embed\/\$([^"'<>\\]+)/gi;
73
+ // Remove image placeholder
74
+ template = template.replace(/placeholder="[^"]+"/, '');
75
+ template = template.replace(/onerror="[^"]+"/, '');
76
+ // Replace youtube mention
77
+ template = template.replace(reMentionYoutube, (match, name) => {
78
+ const string = bindingToString(bindings[name]);
79
+ return string ? `youtube.com/embed/${getYoutubeVideoId(string)}?` : '';
80
+ });
81
+ // Replace all generically bound attributes
82
+ template = template.replace(reAttributes, (match, attr, name) => {
83
+ const string = bindingToString(bindings[name]);
84
+ if (['src', 'href'].includes(attr) && !string) {
85
+ return '';
86
+ }
87
+ if (['src', 'href'].includes(attr)) {
88
+ // Skip normalization for known protocols
89
+ if (/^(mailto:|tel:|ftp:|data:|http:\/\/|https:\/\/)/i.test(string)) {
90
+ return ` ${attr}="${string}"`;
91
+ }
92
+ return ` ${attr}="${normalizeUrl(string)}"`;
93
+ }
94
+ return ` ${attr}="${string}"`;
95
+ });
96
+ // Replace $foo with the correct value
97
+ template = template.replace(reAnchors, (match, name) => `>${bindingToString(bindings[name])}<`);
98
+ // Remove mention anchors <span class=\"mention\" data-mention-id=\"mc-type\">$mc-type</span>
99
+ template = template.replace(reMentionSpan, (_, name) => name);
100
+ return template;
101
+ }
102
+ function normalizeUrl(url) {
103
+ if (!/^https?:\/\//i.test(url)) {
104
+ return `https://${url}`;
105
+ }
106
+ return url;
107
+ }
108
+ function getYoutubePlaceholder(url, bindings) {
109
+ const id = getYoutubeVideoId(resolveBinding(url, bindings));
110
+ const thumbnailUrl = `https://img.youtube.com/vi/${id}/hqdefault.jpg`;
111
+ return `
112
+ <div class="youtube-placeholder">
113
+ <img src="${thumbnailUrl}" />
114
+ <div class="popup-alert">
115
+ <div class="alert-icon">${alertIcon}</div>
116
+ <div>${t('videoAlert')}</div>
117
+ </div>
118
+ </div>
119
+ `;
120
+ }
@@ -1,4 +1,4 @@
1
- import { PopupMedia, JobObjectDataBindings } from '../types/jobObject';
1
+ import type { PopupMedia, JobObjectDataBindings } from '@/types/jobObject';
2
2
  export declare function getEmbedUrlFromYoutubeUrl(popupmedia: Extract<PopupMedia, {
3
3
  type: 'video';
4
4
  }>, bindings: JobObjectDataBindings): string;
@@ -0,0 +1,64 @@
1
+ import { resolveBinding } from '@/utils/helpers';
2
+ export function getEmbedUrlFromYoutubeUrl(popupmedia, bindings) {
3
+ const { allowFullscreen, loop } = popupmedia;
4
+ const src = resolveBinding(popupmedia.src, bindings);
5
+ let embedUrl;
6
+ const idMatch = src.match(/(?:youtube\.com\/(?:watch\?.*v=|embed\/|v\/)|youtu\.be\/)([-\w]{11})/);
7
+ const id = idMatch?.[1];
8
+ if (id) {
9
+ embedUrl = `https://www.youtube.com/embed/${id}`;
10
+ }
11
+ else {
12
+ embedUrl = src;
13
+ }
14
+ const params = [];
15
+ if (!allowFullscreen) {
16
+ params.push('fs=0');
17
+ }
18
+ if (loop && id) {
19
+ params.push(`loop=1&playlist=${id}`);
20
+ }
21
+ embedUrl = convertYouTubeTimeParam(embedUrl);
22
+ embedUrl = stripSiParam(embedUrl);
23
+ if (params.length) {
24
+ const separator = embedUrl.includes('?') ? '&' : '?';
25
+ embedUrl += `${separator}${params.join('&')}`;
26
+ }
27
+ return embedUrl;
28
+ }
29
+ function stripSiParam(url) {
30
+ return url.replace(/([?&])si=[^&]+(&)?/, (_, sep, tail) => {
31
+ if (sep === '?' && !tail) {
32
+ return '';
33
+ }
34
+ if (sep === '?' && tail) {
35
+ return '?';
36
+ }
37
+ return tail ? '&' : '';
38
+ });
39
+ }
40
+ function convertYouTubeTimeParam(url) {
41
+ const urlObj = new URL(url);
42
+ const t = urlObj.searchParams.get('t');
43
+ if (!t) {
44
+ return url;
45
+ }
46
+ let seconds = 0;
47
+ const timeRegex = /^((\d+)m)?((\d+)s)?$/;
48
+ if (/^\d+$/.test(t)) {
49
+ seconds = parseInt(t, 10);
50
+ }
51
+ else {
52
+ const match = t.match(timeRegex);
53
+ if (match) {
54
+ const minutes = parseInt(match[2] || '0', 10);
55
+ const secs = parseInt(match[4] || '0', 10);
56
+ seconds = minutes * 60 + secs;
57
+ }
58
+ }
59
+ if (seconds > 0) {
60
+ urlObj.searchParams.delete('t');
61
+ urlObj.searchParams.set('start', String(seconds));
62
+ }
63
+ return urlObj.toString();
64
+ }
Binary file