datastake-daf 0.6.778 → 0.6.780

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 (25) hide show
  1. package/dist/components/index.js +403 -355
  2. package/dist/pages/index.js +2120 -235
  3. package/dist/utils/index.js +13 -0
  4. package/package.json +1 -1
  5. package/src/@daf/core/components/Dashboard/Map/ChainIcon/Markers/StakeholderMarker.js +9 -76
  6. package/src/@daf/core/components/Dashboard/Map/ChainIcon/index.js +116 -8
  7. package/src/@daf/core/components/Dashboard/Map/ChainIcon/utils.js +73 -17
  8. package/src/@daf/core/components/Dashboard/Map/helper.js +1 -0
  9. package/src/@daf/core/components/Dashboard/Map/hook.js +64 -29
  10. package/src/@daf/core/components/Dashboard/Map/style.js +20 -5
  11. package/src/@daf/pages/Summary/Activities/PlantingCycle/components/AssociatedInformation/config.js +4 -2
  12. package/src/@daf/pages/Summary/Activities/PlantingCycle/components/AssociatedInformation/index.jsx +1 -0
  13. package/src/@daf/pages/Summary/Activities/PlantingCycle/components/PlantingLocations/index.jsx +60 -4
  14. package/src/@daf/pages/View/hooks/useCallToGetData.js +73 -0
  15. package/src/@daf/pages/View/hooks/usePrepareForm.js +86 -0
  16. package/src/@daf/pages/View/hooks/useSubmitSubject.js +40 -0
  17. package/src/@daf/pages/View/hooks/useViewActions.js +83 -0
  18. package/src/@daf/pages/View/hooks/useViewPermissions.js +75 -0
  19. package/src/@daf/pages/View/hooks/useViewUrlParams.js +93 -0
  20. package/src/@daf/pages/View/index.jsx +286 -0
  21. package/src/@daf/utils/object.js +3 -1
  22. package/src/pages.js +4 -1
  23. package/src/utils.js +1 -1
  24. package/dist/style/datastake/mapbox-gl.css +0 -330
  25. package/src/@daf/hooks/useViewFormUrlParams.js +0 -84
@@ -0,0 +1,286 @@
1
+ import React, { useMemo, useState } from 'react'
2
+ import { useViewUrlParams } from './hooks/useViewUrlParams.js'
3
+ import { usePrepareForm } from './hooks/usePrepareForm.js'
4
+ import { useViewPermissions } from './hooks/useViewPermissions.js'
5
+ import { useSubmitSubject } from './hooks/useSubmitSubject.js'
6
+ import { useCallToGetData } from './hooks/useCallToGetData.js'
7
+ import { useViewActions } from './hooks/useViewActions.js'
8
+
9
+ import { groupSubsections } from '../../../@daf/core/components/ViewForm/helper.js'
10
+ import Loading from '../../../@daf/core/components/Loading/index.jsx'
11
+ import Header from '../../../@daf/core/components/Header/index.jsx'
12
+ import Multiselect from '../../../@daf/core/components/Select/MultiSelect/index.jsx'
13
+ import ViewFormNavigation from '../../../@daf/core/components/ViewForm/navigation.jsx'
14
+ import ViewForm from '../../../@daf/core/components/ViewForm/content.jsx'
15
+ import Records from '../../../@daf/core/components/ViewForm/components/Records/index.jsx'
16
+
17
+ const View = ({
18
+ push,
19
+ getRedirectLink,
20
+ allData,
21
+ ajaxForms,
22
+ changeAjaxForms,
23
+ t,
24
+ namespaceConfiguaration,
25
+ params,
26
+ pathname,
27
+ search,
28
+ searchParams,
29
+ setSearchParams,
30
+ mode="app",
31
+ APP,
32
+ viewConfig,
33
+ partners,
34
+ setSelectedPartners,
35
+ user,
36
+ serviceMap,
37
+ actionMap,
38
+ goBack,
39
+ breadcrumbs,
40
+ theme,
41
+ buttonActions,
42
+ generatePath,
43
+ getApiBaseUrl,
44
+ getAppHeader,
45
+ // ADD CALLBACK TO GET THE CURRENT NAMESPACE CONFIG
46
+ }) => {
47
+ const getNamespaceConfig = (namespace) => namespaceConfiguaration[namespace];
48
+ const [openRecordsModal, setOpenRecordsModal] = useState(false);
49
+
50
+ // HANDLES THE URL PARAMS FOR THE VIEW PAGE
51
+ const {
52
+ namespace,
53
+ id,
54
+ group,
55
+ subsection,
56
+ source,
57
+ setSource,
58
+ sourceUrl,
59
+ version,
60
+ setVersion,
61
+ versionUrl,
62
+ goBackFromSource,
63
+ getEditLink,
64
+ match,
65
+ } = useViewUrlParams({
66
+ params,
67
+ push,
68
+ pathname,
69
+ search,
70
+ searchParams,
71
+ setSearchParams,
72
+ });
73
+
74
+ const namespaceConfig = useMemo(() => getNamespaceConfig(namespace), [namespace]);
75
+
76
+ // PREPARES THE FORM FOR THE VIEW PAGE
77
+ const {
78
+ form,
79
+ data,
80
+ groups,
81
+ linkingForms,
82
+ loading,
83
+ setLoading,
84
+ notFound,
85
+ } = usePrepareForm({
86
+ namespaceConfig,
87
+ allData,
88
+ id,
89
+ namespace,
90
+ t,
91
+ mode,
92
+ APP,
93
+ viewConfig,
94
+ });
95
+
96
+ const { canEdit, isSupported } = useViewPermissions({
97
+ data,
98
+ id,
99
+ namespace,
100
+ user,
101
+ push,
102
+ getRedirectLink,
103
+ namespaceConfig: namespaceConfiguaration,
104
+ APP,
105
+ viewConfig,
106
+ });
107
+
108
+ const groupForm = useMemo(() => {
109
+ const gF = form[group] || {};
110
+ if (subsection) {
111
+ const sectionForms = groupSubsections(gF);
112
+ if (sectionForms[subsection]) {
113
+ return sectionForms[subsection];
114
+ }
115
+ }
116
+ return gF;
117
+ }, [form, group, subsection]);
118
+
119
+ const { submitSubject, isDisabled, submitLoading, isPublished } = useSubmitSubject({
120
+ namespace,
121
+ data,
122
+ serviceMap,
123
+ });
124
+
125
+ const { pageActions, extraPageActions } = useViewActions({
126
+ namespace,
127
+ data,
128
+ isSupported,
129
+ canEdit,
130
+ versionUrl,
131
+ sourceUrl,
132
+ getEditLink,
133
+ submitSubject,
134
+ isDisabled,
135
+ setOpenRecordsModal,
136
+ goBackFromSource,
137
+ push,
138
+ getRedirectLink,
139
+ t,
140
+ viewConfig,
141
+ buttonActions,
142
+ });
143
+
144
+ const action = useMemo(() => actionMap[namespaceConfig?.action], [namespaceConfig?.action]);
145
+
146
+ const namespaceGet = {
147
+ [namespace]: () => {
148
+ return action({
149
+ namespace: namespaceConfig.namespace,
150
+ module: APP,
151
+ view: namespaceConfig.view,
152
+ ...(namespaceConfig.scope && { scope: namespaceConfig.scope }),
153
+ datastakeId: id,
154
+ version,
155
+ source,
156
+ })
157
+ }
158
+ }
159
+
160
+ useCallToGetData({
161
+ namespaceConfig,
162
+ namespace,
163
+ allData,
164
+ id,
165
+ isSupported,
166
+ namespaceGet,
167
+ source,
168
+ version,
169
+ user,
170
+ setLoading,
171
+ })
172
+
173
+ const extraLinking = useMemo(() => {
174
+ return null;
175
+ }, [namespace, match, data]);
176
+
177
+ const sourceOptions = useMemo(() => {
178
+ return partners.map((partner) => {
179
+ const isOwnData = partner.id === user?.company?.id;
180
+
181
+ return {
182
+ label: partner.nickName,
183
+ value: partner.id,
184
+ avatar: isOwnData ? <span>OWN</span> : undefined,
185
+ background: isOwnData ? theme.colorPrimary7 : undefined,
186
+ color: isOwnData ? "white" : undefined,
187
+ };
188
+ });
189
+ }, [partners, user]);
190
+
191
+ const actionButtons = useMemo(() => {
192
+ return groupForm?.template === "linkingSubjects"
193
+ ? pageActions.filter((v) => v.key !== "edit")
194
+ : pageActions;
195
+ }, [groupForm, pageActions]);
196
+
197
+ if(!isSupported || notFound || loading) {
198
+ return <Loading />
199
+ }
200
+
201
+ return (
202
+ <>
203
+ <div className={"daf-view-form"}>
204
+ <Header
205
+ title={data?.name || ""}
206
+ breadcrumbs={breadcrumbs}
207
+ goBackTo={goBack}
208
+ actionButtons={actionButtons}
209
+ extraButtons={extraPageActions}
210
+ addedHeaderFirst
211
+ addedHeader={
212
+ <div className="flex flex-row gap-4" style={{ marginRight: 8 }}>
213
+ <Multiselect
214
+ options={[...sourceOptions]}
215
+ isAvatarGroup
216
+ selectionType="checkbox"
217
+ key={partners?.length}
218
+ canUnselectLast={false}
219
+ onChange={(selected) => {
220
+ setSelectedPartners((prev) => ({
221
+ ...prev,
222
+ partners: selected,
223
+ loading: false,
224
+ }));
225
+ }}
226
+ dropDownWidth={200}
227
+ defaultSelected={(partners || []).map((p) => p.id) || []}
228
+ />
229
+ </div>
230
+ }
231
+ />
232
+ <div className="view-content">
233
+ <ViewFormNavigation
234
+ mod={APP}
235
+ data={data}
236
+ match={match}
237
+ form={form}
238
+ group={group}
239
+ subsection={subsection}
240
+ search={search}
241
+ goTo={push}
242
+ getRedirectLink={getRedirectLink}
243
+ generatePath={generatePath}
244
+ params={params}
245
+ />
246
+ {groupForm.template ? (<></>) : (
247
+ <ViewForm
248
+ form={groupForm}
249
+ data={data || {}}
250
+ groupConfig={groups || {}}
251
+ linkingData={(data || {}).linking || {}}
252
+ linkingForms={linkingForms || {}}
253
+ ajaxOptions={[]}
254
+ extraLinking={extraLinking}
255
+ t={t}
256
+ app={APP}
257
+ ajaxForms={ajaxForms}
258
+ language={user?.language}
259
+ changeAjaxForms={changeAjaxForms}
260
+ getApiBaseUrl={getApiBaseUrl}
261
+ getAppHeader={getAppHeader}
262
+ user={user}
263
+ />
264
+ )}
265
+ </div>
266
+ </div>
267
+ {openRecordsModal && (
268
+ <Records
269
+ open={openRecordsModal}
270
+ onClose={() => setOpenRecordsModal(false)}
271
+ t={t}
272
+ sourceOptions={[]}
273
+ versionOptions={[]}
274
+ id={params?.id}
275
+ subject={namespace}
276
+ onSubmit={(values) => {
277
+ setSource(values?.source);
278
+ setVersion(values?.version);
279
+ }}
280
+ />
281
+ )}
282
+ </>
283
+ )
284
+ }
285
+
286
+ export default View
@@ -61,4 +61,6 @@ export const removeKeysFromObject = (obj = {}, keys = []) => {
61
61
  }
62
62
  }
63
63
  return result;
64
- }
64
+ }
65
+
66
+ export const hasKeyInObject = (obj, key) => Object.keys(obj || {}).includes(key);
package/src/pages.js CHANGED
@@ -19,4 +19,7 @@ export { default as TablePage } from './@daf/pages/TablePage/index.jsx';
19
19
  export { default as OperatorSummary } from './@daf/pages/Summary/Operator/index.jsx';
20
20
  export { default as RestorationActivitySummary } from './@daf/pages/Summary/Activities/Restoration/index.jsx';
21
21
  export { default as PlantingCycleSummary } from './@daf/pages/Summary/Activities/PlantingCycle/index.jsx';
22
- export { default as MineSummary } from './@daf/pages/Summary/Minesite/index.jsx';
22
+ export { default as MineSummary } from './@daf/pages/Summary/Minesite/index.jsx';
23
+
24
+ // View
25
+ export { default as View } from './@daf/pages/View/index.jsx';
package/src/utils.js CHANGED
@@ -27,7 +27,7 @@ export { default as locales } from './constants/locales/index.js';
27
27
 
28
28
  export { getTagColor } from "./@daf/utils/productTag.js";
29
29
 
30
- export { convertUndefinedToNull } from './@daf/utils/object'
30
+ export { convertUndefinedToNull, hasKeyInObject, removeKeysFromObject } from './@daf/utils/object'
31
31
 
32
32
  export { default as ErrorFormat, formatErrors } from './helpers/ErrorFormater'
33
33
 
@@ -1,330 +0,0 @@
1
- /* Isolated Mapbox GL CSS - Scoped to prevent Leaflet conflicts */
2
-
3
- /* Mapbox GL Core Styles - Scoped with .mapbox-gl-scope */
4
- .mapbox-gl-scope .mapboxgl-map {
5
- font: 12px/20px Helvetica Neue, Arial, Helvetica, sans-serif;
6
- overflow: hidden;
7
- position: relative;
8
- -webkit-tap-highlight-color: rgb(0 0 0/0);
9
- }
10
-
11
- .mapbox-gl-scope .mapboxgl-canvas {
12
- left: 0;
13
- position: absolute;
14
- top: 0;
15
- }
16
-
17
- .mapbox-gl-scope .mapboxgl-map:-webkit-full-screen {
18
- height: 100%;
19
- width: 100%;
20
- }
21
-
22
- .mapbox-gl-scope .mapboxgl-canary {
23
- background-color: salmon;
24
- }
25
-
26
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-interactive,
27
- .mapbox-gl-scope .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass {
28
- cursor: grab;
29
- -webkit-user-select: none;
30
- user-select: none;
31
- }
32
-
33
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer {
34
- cursor: pointer;
35
- }
36
-
37
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-interactive:active,
38
- .mapbox-gl-scope .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active {
39
- cursor: grabbing;
40
- }
41
-
42
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,
43
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas {
44
- touch-action: pan-x pan-y;
45
- }
46
-
47
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-drag-pan,
48
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas {
49
- touch-action: pinch-zoom;
50
- }
51
-
52
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,
53
- .mapbox-gl-scope .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas {
54
- touch-action: none;
55
- }
56
-
57
- /* Control positioning */
58
- .mapbox-gl-scope .mapboxgl-ctrl-bottom,
59
- .mapbox-gl-scope .mapboxgl-ctrl-bottom-left,
60
- .mapbox-gl-scope .mapboxgl-ctrl-bottom-right,
61
- .mapbox-gl-scope .mapboxgl-ctrl-left,
62
- .mapbox-gl-scope .mapboxgl-ctrl-right,
63
- .mapbox-gl-scope .mapboxgl-ctrl-top,
64
- .mapbox-gl-scope .mapboxgl-ctrl-top-left,
65
- .mapbox-gl-scope .mapboxgl-ctrl-top-right {
66
- pointer-events: none;
67
- position: absolute;
68
- z-index: 2;
69
- }
70
-
71
- .mapbox-gl-scope .mapboxgl-ctrl-top-left {
72
- left: 0;
73
- top: 0;
74
- }
75
-
76
- .mapbox-gl-scope .mapboxgl-ctrl-top {
77
- left: 50%;
78
- top: 0;
79
- transform: translateX(-50%);
80
- }
81
-
82
- .mapbox-gl-scope .mapboxgl-ctrl-top-right {
83
- right: 0;
84
- top: 0;
85
- }
86
-
87
- .mapbox-gl-scope .mapboxgl-ctrl-right {
88
- right: 0;
89
- top: 50%;
90
- transform: translateY(-50%);
91
- }
92
-
93
- .mapbox-gl-scope .mapboxgl-ctrl-bottom-right {
94
- bottom: 0;
95
- right: 0;
96
- }
97
-
98
- .mapbox-gl-scope .mapboxgl-ctrl-bottom {
99
- bottom: 0;
100
- left: 50%;
101
- transform: translateX(-50%);
102
- }
103
-
104
- .mapbox-gl-scope .mapboxgl-ctrl-bottom-left {
105
- bottom: 0;
106
- left: 0;
107
- }
108
-
109
- .mapbox-gl-scope .mapboxgl-ctrl-left {
110
- left: 0;
111
- top: 50%;
112
- transform: translateY(-50%);
113
- }
114
-
115
- .mapbox-gl-scope .mapboxgl-ctrl {
116
- clear: both;
117
- pointer-events: auto;
118
- transform: translate(0);
119
- }
120
-
121
- .mapbox-gl-scope .mapboxgl-ctrl-top-left .mapboxgl-ctrl {
122
- float: left;
123
- margin: 10px 0 0 10px;
124
- }
125
-
126
- .mapbox-gl-scope .mapboxgl-ctrl-top .mapboxgl-ctrl {
127
- float: left;
128
- margin: 10px 0;
129
- }
130
-
131
- .mapbox-gl-scope .mapboxgl-ctrl-top-right .mapboxgl-ctrl {
132
- float: right;
133
- margin: 10px 10px 0 0;
134
- }
135
-
136
- .mapbox-gl-scope .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl,
137
- .mapbox-gl-scope .mapboxgl-ctrl-right .mapboxgl-ctrl {
138
- float: right;
139
- margin: 0 10px 10px 0;
140
- }
141
-
142
- .mapbox-gl-scope .mapboxgl-ctrl-bottom .mapboxgl-ctrl {
143
- float: left;
144
- margin: 10px 0;
145
- }
146
-
147
- .mapbox-gl-scope .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl,
148
- .mapbox-gl-scope .mapboxgl-ctrl-left .mapboxgl-ctrl {
149
- float: left;
150
- margin: 0 0 10px 10px;
151
- }
152
-
153
- /* Control group styling */
154
- .mapbox-gl-scope .mapboxgl-ctrl-group {
155
- background: #fff;
156
- border-radius: 4px;
157
- }
158
-
159
- .mapbox-gl-scope .mapboxgl-ctrl-group:not(:empty) {
160
- box-shadow: 0 0 0 2px #0000001a;
161
- }
162
-
163
- .mapbox-gl-scope .mapboxgl-ctrl-group button {
164
- background-color: initial;
165
- border: 0;
166
- box-sizing: border-box;
167
- cursor: pointer;
168
- display: block;
169
- height: 29px;
170
- outline: none;
171
- overflow: hidden;
172
- padding: 0;
173
- width: 29px;
174
- }
175
-
176
- .mapbox-gl-scope .mapboxgl-ctrl-group button+button {
177
- border-top: 1px solid #ddd;
178
- }
179
-
180
- .mapbox-gl-scope .mapboxgl-ctrl button .mapboxgl-ctrl-icon {
181
- background-position: 50%;
182
- background-repeat: no-repeat;
183
- display: block;
184
- height: 100%;
185
- width: 100%;
186
- }
187
-
188
- .mapbox-gl-scope .mapboxgl-ctrl-attrib-button:focus,
189
- .mapbox-gl-scope .mapboxgl-ctrl-group button:focus {
190
- box-shadow: 0 0 2px 2px #0096ff;
191
- }
192
-
193
- .mapbox-gl-scope .mapboxgl-ctrl button:disabled {
194
- cursor: not-allowed;
195
- }
196
-
197
- .mapbox-gl-scope .mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon {
198
- opacity: .25;
199
- }
200
-
201
- .mapbox-gl-scope .mapboxgl-ctrl-group button:first-child {
202
- border-radius: 4px 4px 0 0;
203
- }
204
-
205
- .mapbox-gl-scope .mapboxgl-ctrl-group button:last-child {
206
- border-radius: 0 0 4px 4px;
207
- }
208
-
209
- .mapbox-gl-scope .mapboxgl-ctrl-group button:only-child {
210
- border-radius: inherit;
211
- }
212
-
213
- .mapbox-gl-scope .mapboxgl-ctrl button:not(:disabled):hover {
214
- background-color: #0000000d;
215
- }
216
-
217
- /* Marker styles */
218
- .mapbox-gl-scope .mapboxgl-marker {
219
- position: absolute;
220
- z-index: 1;
221
- }
222
-
223
- .mapbox-gl-scope .mapboxgl-marker svg {
224
- display: block;
225
- }
226
-
227
- /* Popup styles */
228
- .mapbox-gl-scope .mapboxgl-popup {
229
- position: absolute;
230
- text-align: center;
231
- margin-bottom: 20px;
232
- }
233
-
234
- .mapbox-gl-scope .mapboxgl-popup-content-wrapper {
235
- padding: 1px;
236
- text-align: left;
237
- border-radius: 12px;
238
- }
239
-
240
- .mapbox-gl-scope .mapboxgl-popup-content {
241
- margin: 13px 24px 13px 20px;
242
- line-height: 1.3;
243
- font-size: 13px;
244
- min-height: 1px;
245
- }
246
-
247
- .mapbox-gl-scope .mapboxgl-popup-content p {
248
- margin: 17px 0;
249
- }
250
-
251
- .mapbox-gl-scope .mapboxgl-popup-tip-container {
252
- width: 40px;
253
- height: 20px;
254
- position: absolute;
255
- left: 50%;
256
- margin-top: -1px;
257
- margin-left: -20px;
258
- overflow: hidden;
259
- pointer-events: none;
260
- }
261
-
262
- .mapbox-gl-scope .mapboxgl-popup-tip {
263
- width: 17px;
264
- height: 17px;
265
- padding: 1px;
266
- margin: -10px auto 0;
267
- pointer-events: auto;
268
- -webkit-transform: rotate(45deg);
269
- -moz-transform: rotate(45deg);
270
- -ms-transform: rotate(45deg);
271
- transform: rotate(45deg);
272
- }
273
-
274
- .mapbox-gl-scope .mapboxgl-popup-content-wrapper,
275
- .mapbox-gl-scope .mapboxgl-popup-tip {
276
- background: white;
277
- color: #333;
278
- box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);
279
- }
280
-
281
- .mapbox-gl-scope .mapboxgl-popup-close-button {
282
- position: absolute;
283
- top: 0;
284
- right: 0;
285
- border: none;
286
- text-align: center;
287
- width: 24px;
288
- height: 24px;
289
- font: 16px/24px Tahoma, Verdana, sans-serif;
290
- color: #757575;
291
- text-decoration: none;
292
- background: transparent;
293
- }
294
-
295
- .mapbox-gl-scope .mapboxgl-popup-close-button:hover,
296
- .mapbox-gl-scope .mapboxgl-popup-close-button:focus {
297
- color: #585858;
298
- }
299
-
300
- /* Attribution */
301
- .mapbox-gl-scope .mapboxgl-ctrl-attribution {
302
- background: #fff;
303
- background: rgba(255, 255, 255, 0.8);
304
- margin: 0;
305
- }
306
-
307
- .mapbox-gl-scope .mapboxgl-ctrl-attribution,
308
- .mapbox-gl-scope .mapboxgl-ctrl-scale-line {
309
- padding: 0 5px;
310
- color: #333;
311
- line-height: 1.4;
312
- }
313
-
314
- .mapbox-gl-scope .mapboxgl-ctrl-attribution a {
315
- text-decoration: none;
316
- }
317
-
318
- .mapbox-gl-scope .mapboxgl-ctrl-attribution a:hover,
319
- .mapbox-gl-scope .mapboxgl-ctrl-attribution a:focus {
320
- text-decoration: underline;
321
- }
322
-
323
- /* Hide attribution by default */
324
- .mapbox-gl-scope .mapboxgl-ctrl-attribution {
325
- display: none !important;
326
- }
327
-
328
- .mapbox-gl-scope .mapboxgl-ctrl-logo {
329
- display: none !important;
330
- }