@worksafevictoria/wcl7.5 1.6.0 → 1.7.0

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 (29) hide show
  1. package/package.json +3 -2
  2. package/src/components/Common/CardGridItem/card-grid-item-icon.vue +15 -19
  3. package/src/components/Global/AppFooter/styles.scss +3 -0
  4. package/src/components/Global/DirectoryFilters/index.vue +3 -0
  5. package/src/components/Paragraphs/Chart/Constants.js +479 -479
  6. package/src/components/Paragraphs/Directory/{Records/HSCP → HSCP/Records/SingleRecord}/index.stories.js +4 -3
  7. package/src/components/Paragraphs/Directory/HSCP/Records/SingleRecord/index.vue +321 -0
  8. package/src/components/Paragraphs/Directory/HSCP/Records/index.stories.js +19 -0
  9. package/src/components/Paragraphs/Directory/HSCP/Records/index.vue +345 -0
  10. package/src/components/Paragraphs/Directory/HSCP/Records/pagination.vue +179 -0
  11. package/src/components/Paragraphs/Directory/Records/CJ/index.vue +1 -1
  12. package/src/components/Paragraphs/Directory/Records/ISP/index.vue +1 -1
  13. package/src/components/Paragraphs/Directory/Records/PRS/index.stories.js +34 -0
  14. package/src/components/Paragraphs/Directory/Records/PRS/index.vue +5 -1
  15. package/src/components/Paragraphs/Directory/Records/index.storieshide.js +47 -0
  16. package/src/components/Paragraphs/Directory/Records/index.vue +18 -35
  17. package/src/components/Paragraphs/Directory/{Records/styles.scss → styles.scss} +4 -3
  18. package/src/components/Paragraphs/Map/Constants.js +4790 -0
  19. package/src/components/Paragraphs/Map/index.mdx +29 -0
  20. package/src/components/Paragraphs/Map/index.stories.js +15 -0
  21. package/src/components/Paragraphs/Map/index.vue +295 -0
  22. package/src/components/Paragraphs/Map/postcode_location.json +3543 -0
  23. package/src/components/SubComponents/Breadcrumb/index.vue +4 -0
  24. package/src/components/SubComponents/FormInstance/components/renderer/index.vue +23 -7
  25. package/src/components/SubComponents/FormInstance/models/overrides/file.js +7 -2
  26. package/src/components/SubComponents/Search/index.vue +7 -2
  27. package/src/index.js +4 -0
  28. package/src/mock/course-provider.js +273 -0
  29. package/src/components/Paragraphs/Directory/Records/HSCP/index.vue +0 -334
@@ -0,0 +1,29 @@
1
+ import { Canvas, Meta } from '@storybook/blocks';
2
+
3
+ import * as GeoStories from './index.stories';
4
+
5
+ <Meta of={GeoStories} />
6
+
7
+ # Map
8
+
9
+ Map support links
10
+
11
+ - [vue3-google-map](https://vue3-google-map.com/ 'Documentation') (package documentation)
12
+ - [Google-maps](https://developers.google.com/maps/documentation/javascript 'Google maps') (customisation documentation)
13
+
14
+ <Canvas of={GeoStories.Default} />
15
+
16
+ ## Map filters
17
+
18
+ Filtering options. These are passed to 'directory-filters' component.
19
+
20
+ ```tsx
21
+ ;[
22
+ { record_id: 'DEATH_DATE', name: 'Year', date: true }, // Primary
23
+ { record_id: 'GENDER', name: 'Gender' }, // Secondary
24
+ { record_id: 'AGE_RANGE', name: 'Age range' },
25
+ { record_id: 'CATEGORY', name: 'Category' },
26
+ { record_id: 'INDUSTRY', name: 'Industry' },
27
+ { record_id: 'SIZE_', name: 'Size of Organisation' },
28
+ ]
29
+ ```
@@ -0,0 +1,15 @@
1
+ import GeoChart from './index.vue'
2
+ import { filterFields, statsData } from './Constants'
3
+ export default {
4
+ title: 'Paragraphs/Map',
5
+ component: GeoChart,
6
+ }
7
+ export const Default = {
8
+ args: {
9
+ filterFields: filterFields,
10
+ statsData: statsData,
11
+ },
12
+ parameters: {
13
+ deepControls: { enabled: true },
14
+ },
15
+ }
@@ -0,0 +1,295 @@
1
+ <template>
2
+ <container>
3
+ <row>
4
+ <column class="pb-5">
5
+ <single-taxonomy
6
+ v-for="(t, i) in computedPropFilters"
7
+ :key="i"
8
+ :ref="`${t.record_id}`"
9
+ :data="t"
10
+ :results="filteredList.length"
11
+ :loading="isFiltering"
12
+ class="wcl-directory-filters__filterButton"
13
+ @onFilter="onFilter"
14
+ />
15
+ <filter-button
16
+ v-if="!hideReset"
17
+ :is-reset="true"
18
+ class="wcl-directory-filters__filterButton"
19
+ @clicked="reset"
20
+ />
21
+ </column>
22
+ </row>
23
+ <row>
24
+ <column>
25
+ <div>
26
+ <GoogleMap
27
+ api-key="AIzaSyD76GAmQQ6DuxKWf-aLXPZ9pwdz4nOvs2c"
28
+ :style="`width: 100%; height: ${mapHeight}`"
29
+ :center="center"
30
+ :zoom="zoom"
31
+ :zoom-control="true"
32
+ :mapTypeControl="false"
33
+ :streetViewControl="false"
34
+ :fullscreenControl="true"
35
+ >
36
+ <!-- <CustomControl
37
+ position="TOP_CENTER"
38
+ class="mt-4"
39
+ style="background-color: rgba(0, 0, 0, 0.2); border-radius: 5px"
40
+ ><row>
41
+ <column class="py-2 px-3">
42
+ <single-taxonomy
43
+ v-for="(t, i) in computedPropFilters"
44
+ :key="i"
45
+ :ref="`${t.record_id}`"
46
+ :data="t"
47
+ :results="filteredList.length"
48
+ :loading="isFiltering"
49
+ class="wcl-directory-filters__filterButton"
50
+ @onFilter="onFilter"
51
+ />
52
+ <filter-button
53
+ v-if="!hideReset"
54
+ :is-reset="true"
55
+ class="wcl-directory-filters__filterButton"
56
+ @clicked="reset"
57
+ />
58
+ </column>
59
+ </row>
60
+ </CustomControl> -->
61
+ <!-- <MarkerCluster> -->
62
+ <Marker
63
+ v-for="(location, i) in postcodes"
64
+ :options="{
65
+ position: location.center,
66
+ label: `${location.deaths}`,
67
+ title: `${location.deaths} ${location.deaths > 1 ? 'deaths' : 'death'}`,
68
+ }"
69
+ :key="i"
70
+ />
71
+ <!-- </MarkerCluster> -->
72
+ </GoogleMap>
73
+ </div>
74
+ </column>
75
+ </row>
76
+ </container>
77
+ </template>
78
+
79
+ <script>
80
+ import postcode from './postcode_location.json'
81
+ import {
82
+ GoogleMap,
83
+ Marker,
84
+ MarkerCluster,
85
+ Circle,
86
+ CustomControl,
87
+ InfoWindow,
88
+ } from 'vue3-google-map'
89
+ import Container from '../../Containers/Container/index.vue'
90
+ import Column from '../../Containers/Column/index.vue'
91
+ import Row from '../../Containers/Row/index.vue'
92
+ import FilterButton from '../../Common/FilterButton/index.vue' // Reset
93
+ import SingleTaxonomy from '../../Global/DirectoryFilters/SingleTaxonomy/index.vue'
94
+ import { BFormGroup, BFormSelect, BButton } from 'bootstrap-vue-next'
95
+
96
+ export default {
97
+ name: 'GeoChart',
98
+ components: {
99
+ Row,
100
+ Column,
101
+ Container,
102
+ FilterButton,
103
+ SingleTaxonomy,
104
+ BFormGroup,
105
+ BFormSelect,
106
+ GoogleMap,
107
+ Marker,
108
+ MarkerCluster,
109
+ Circle,
110
+ CustomControl,
111
+ InfoWindow,
112
+ BButton,
113
+ },
114
+ props: {
115
+ statsData: { type: Array, default: () => [] },
116
+ filterFields: { type: Array, default: () => [] },
117
+ chart: { type: Object, default: () => {} },
118
+ },
119
+ data() {
120
+ return {
121
+ postcode,
122
+ zoom: 7,
123
+ mapHeight: '700px',
124
+ center: { lat: -36.5, lng: 145.3 },
125
+ hideReset: true,
126
+ isFiltering: false,
127
+ filters: {
128
+ taxonomies: [],
129
+ selected: {},
130
+ availableBundles: [],
131
+ },
132
+ }
133
+ },
134
+ mounted() {
135
+ this.resize()
136
+ window.onresize = () => {
137
+ this.resize()
138
+ }
139
+ },
140
+ computed: {
141
+ graphOptions: function () {
142
+ return this.filterFields.slice(1).map((field) => {
143
+ if (!this.graphSelected) {
144
+ this.graphSelected = field.record_id
145
+ }
146
+ return { value: field.record_id, text: field.name }
147
+ })
148
+ },
149
+ computedPropFilters: function () {
150
+ let fields = this.filterFields.map((field) => {
151
+ let terms = null
152
+ if (field.date) {
153
+ terms = this.statsData
154
+ .map((item) => item[field.record_id].split('/')[2]) // Date field get year
155
+ .filter((value, index, self) => self.indexOf(value) === index)
156
+ .map((value) => {
157
+ return { tid: value, name: value, preselected: false }
158
+ })
159
+ .sort((a, b) => a.name.localeCompare(b.name))
160
+ } else {
161
+ terms = this.statsData
162
+ .map((item) => item[field.record_id])
163
+ .filter((value, index, self) => self.indexOf(value) === index)
164
+ .map((value) => {
165
+ return { tid: value, name: value, preselected: false }
166
+ })
167
+ .sort((a, b) => a.name.localeCompare(b.name))
168
+ }
169
+ return {
170
+ name: field.name,
171
+ record_id: field.record_id,
172
+ terms,
173
+ }
174
+ })
175
+ return fields
176
+ },
177
+ filteredList: function () {
178
+ let filterKeys = Object.keys(this.filters.selected).map((key) => key)
179
+ let list = this.statsData.filter((element) => {
180
+ let include = true
181
+ for (var i = 0, n = filterKeys.length; i < n; ++i) {
182
+ if (this.filters.selected[filterKeys[i]].length > 0) {
183
+ let filterType = this.filterFields.find(
184
+ (item) => item.record_id === filterKeys[i],
185
+ )
186
+ if (filterType.date) {
187
+ // Filter by year
188
+ if (
189
+ this.filters.selected[filterKeys[i]].indexOf(
190
+ element[filterKeys[i]].split('/')[2],
191
+ ) === -1
192
+ ) {
193
+ include = false
194
+ }
195
+ } else {
196
+ if (
197
+ this.filters.selected[filterKeys[i]].indexOf(
198
+ element[filterKeys[i]],
199
+ ) === -1
200
+ ) {
201
+ include = false
202
+ }
203
+ }
204
+ }
205
+ }
206
+ if (include) {
207
+ return element
208
+ }
209
+ })
210
+ return list
211
+ },
212
+ postcodes: function () {
213
+ if (this.filteredList.length > 1) {
214
+ let location = {}
215
+ this.filteredList.forEach((item) => {
216
+ if (location[item.POSTCODE]) {
217
+ location[item.POSTCODE].deaths++
218
+ } else {
219
+ let pc = this.postcode.find((obj) => obj.postcode == item.POSTCODE)
220
+ if (pc) {
221
+ location[item.POSTCODE] = {
222
+ center: { lat: pc.lat, lng: pc.long },
223
+ deaths: 1,
224
+ }
225
+ } else {
226
+ console.log('🚀 ~ item.POSTCODE:', item.POSTCODE)
227
+ }
228
+ }
229
+ })
230
+ return location
231
+ }
232
+ },
233
+ },
234
+ methods: {
235
+ resize() {
236
+ if (window.innerWidth > 980) {
237
+ this.zoom = 7
238
+ this.mapHeight = '700px'
239
+ } else if (window.innerWidth <= 980) {
240
+ this.zoom = 6
241
+ this.mapHeight = '500px'
242
+ }
243
+ },
244
+ onFilter(filters) {
245
+ this.hideReset = false
246
+ const allFiltersUnselected = Object.values(this.$refs).every(
247
+ (taxonomy) => {
248
+ return Object.values(taxonomy[0].selectedFilters).every(
249
+ (filter) => filter.filter((item) => !item.preselected).length === 0,
250
+ )
251
+ },
252
+ )
253
+ if (allFiltersUnselected) {
254
+ this.hideReset = true
255
+ }
256
+ Object.keys(filters).forEach((filter) => {
257
+ this.filters.selected[filter] = filters[filter].map((obj) => obj.tid)
258
+ })
259
+ },
260
+ reset() {
261
+ this.hideReset = true
262
+ Object.keys(this.$refs).forEach((key) => {
263
+ this.$refs[key][0].reset()
264
+ })
265
+ this.filters.selected = {}
266
+ },
267
+ noData() {
268
+ return [
269
+ [
270
+ { label: 'Results', type: 'string' },
271
+ { label: 'Results', type: 'number' },
272
+ { role: 'style', type: 'string' },
273
+ { role: 'annotation', type: 'string' },
274
+ ],
275
+ ['', 0, null, 'No results found'],
276
+ ]
277
+ },
278
+ },
279
+ }
280
+ </script>
281
+
282
+ <style lang="scss" scoped>
283
+ @import '../../../includes/scss/all';
284
+
285
+ .wcl-directory-filters {
286
+ &__filterButton {
287
+ display: inline-block;
288
+ padding-right: 16px;
289
+ line-height: 3;
290
+ &:last-child {
291
+ padding-right: 0px;
292
+ }
293
+ }
294
+ }
295
+ </style>