@usssa/component-library 1.0.0-beta.5 → 1.0.0-beta.7

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 (49) hide show
  1. package/README.md +4 -4
  2. package/package.json +5 -3
  3. package/src/assets/VS.svg +5 -0
  4. package/src/assets/fonts/CorneroRegular.woff +0 -0
  5. package/src/assets/fonts/CorneroRegular.woff2 +0 -0
  6. package/src/components/core/UAccordionSelect.vue +237 -0
  7. package/src/components/core/UAvatar.vue +34 -2
  8. package/src/components/core/UBannerStd.vue +11 -11
  9. package/src/components/core/UBracket.vue +1651 -0
  10. package/src/components/core/UBtnIcon.vue +46 -2
  11. package/src/components/core/UBtnStd.vue +1 -2
  12. package/src/components/core/UChip.vue +49 -9
  13. package/src/components/core/UDate.vue +41 -24
  14. package/src/components/core/UDialogStd.vue +41 -26
  15. package/src/components/core/UDrawer/UDrawer.vue +473 -0
  16. package/src/components/core/UDrawer/UDrawerMenuItem.vue +124 -0
  17. package/src/components/core/UEventCard.vue +430 -0
  18. package/src/components/core/UExpansionStd.vue +274 -0
  19. package/src/components/core/UExpansionTableStd.vue +307 -0
  20. package/src/components/core/UFilter.vue +99 -0
  21. package/src/components/core/UGameObject.vue +478 -0
  22. package/src/components/core/UInputAddressLookup.vue +153 -119
  23. package/src/components/core/UInputPhoneStd.vue +1 -0
  24. package/src/components/core/UInputTextStd.vue +22 -3
  25. package/src/components/core/UInputTypeaheadAdvanceSearch.vue +8 -0
  26. package/src/components/core/UMenuDropdown.vue +2 -0
  27. package/src/components/core/UMenuDropdownAdvancedSearch.vue +27 -14
  28. package/src/components/core/UMenuItem.vue +70 -2
  29. package/src/components/core/UMenuSearch.vue +6 -2
  30. package/src/components/core/UModal.vue +660 -0
  31. package/src/components/core/UMultiSelectStd.vue +271 -28
  32. package/src/components/core/UPagination.vue +30 -11
  33. package/src/components/core/URadioStd.vue +5 -3
  34. package/src/components/core/USelectStd.vue +80 -22
  35. package/src/components/core/UStepper/UProgress.vue +157 -0
  36. package/src/components/core/UStepper/UStepper.vue +214 -0
  37. package/src/components/core/UTable/UTable.vue +1458 -176
  38. package/src/components/core/UTableStd.vue +723 -262
  39. package/src/components/core/UToolbar/UToolbar.vue +30 -14
  40. package/src/components/core/UTypeahead.vue +87 -27
  41. package/src/components/core/UUploader.vue +287 -65
  42. package/src/components/index.js +22 -5
  43. package/src/composables/useNotify.js +2 -2
  44. package/src/css/app.sass +48 -25
  45. package/src/css/quasar.variables.sass +102 -72
  46. package/src/css/vars/colors.variables.sass +0 -14
  47. package/src/utils/bracket.json +352 -0
  48. package/src/utils/data.ts +41 -8
  49. package/src/components/core/UDrawer.vue +0 -321
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Component Library v1.0.0-alpha.150
1
+ # Component Library v1.0.0-alpha.238
2
2
 
3
- **This library provides custom UI components for USSSA applications.**
3
+ **This library provides custom UI components for USSSA applications**
4
4
 
5
5
  ## Installation
6
6
 
@@ -25,11 +25,11 @@ yarn dev
25
25
 
26
26
  ## Usage in other local projects
27
27
 
28
- 1. Clone the component-library repo and install dependencies
28
+ 1. Clone the component-library repo and install dependencies.
29
29
  2. In component-library directory run `yarn link`
30
30
  3. In Nuxt or Quasar project directory run `yarn link @usssa/component-library`
31
31
 
32
32
  When done:
33
33
 
34
- 1. In Nuxt or Quasar project directory run `yarn unlink @usssa/component-library`
34
+ 1. In Nuxt or Quasar project directory run to unlink `yarn unlink @usssa/component-library`
35
35
  2. In component-library directory run `yarn unlink`
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@usssa/component-library",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.7",
4
4
  "description": "A Quasar component library project",
5
5
  "productName": "Quasar component library App",
6
- "author": "Troy Moreland <troy.moreland@usssa.com>",
6
+ "author": "Engineering Team <engineering@usssa.com>",
7
7
  "main": "src/components/index.js",
8
8
  "files": [
9
9
  "src/assets",
@@ -39,9 +39,11 @@
39
39
  "@usssa/core-client": "^0.0.19",
40
40
  "algoliasearch": "4",
41
41
  "flag-icons": "^7.2.3",
42
+ "heic2any": "^0.0.4",
42
43
  "quasar": "^2.16.0",
43
44
  "vue": "^3.4.18",
44
- "vue-router": "^4.0.12"
45
+ "vue-router": "^4.0.12",
46
+ "d3": "^7.9.0"
45
47
  },
46
48
  "devDependencies": {
47
49
  "@quasar/app-vite": "^1.9.0",
@@ -0,0 +1,5 @@
1
+ <svg width="46" height="32" viewBox="0 0 46 32" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M11.8001 0H45.4001L34.2001 32H0.600098L11.8001 0Z" fill="#CB2A3D"/>
3
+ <path d="M15.1951 16.8368L16.1599 10.3384H12.1279L10.3999 22.1538H15.2671L23.9647 10.3384H19.9327L15.1951 16.8368Z" fill="white"/>
4
+ <path d="M27.432 15.0645L28.1088 13.2922H35.7552L36.9072 10.3384H27.2304C26.6256 10.3384 26.064 10.5255 25.5456 10.8996C25.0272 11.2639 24.6528 11.7365 24.4224 12.3175L23.2272 15.4338C23.1504 15.6208 23.112 15.8178 23.112 16.0245C23.112 16.4184 23.2512 16.7531 23.5296 17.0288C23.808 17.2947 24.1152 17.4276 24.4512 17.4276H30.6864L29.9952 19.1999H21.7584L20.6064 22.1538H30.6C31.2048 22.1538 31.7664 21.9716 32.2848 21.6073C32.8032 21.243 33.1776 20.7704 33.408 20.1895L34.6032 17.0731C34.6704 16.8959 34.704 16.7138 34.704 16.5267C34.704 16.1328 34.5648 15.7931 34.2864 15.5076C34.0176 15.2122 33.7104 15.0645 33.3648 15.0645H27.432Z" fill="white"/>
5
+ </svg>
@@ -0,0 +1,237 @@
1
+ <script setup>
2
+ import { nextTick, ref, watch } from 'vue'
3
+ import UTooltip from './UTooltip.vue'
4
+
5
+ const emit = defineEmits(['onItemClick'])
6
+
7
+ const props = defineProps({
8
+ data: { type: Array, default: () => [] },
9
+ dataTestId: {
10
+ type: String,
11
+ default: 'accordion-select',
12
+ },
13
+ multiple: { type: Boolean, default: false },
14
+ title: { type: String, default: 'Select Division' },
15
+ })
16
+
17
+ const activeLineStyles = ref({})
18
+ const selectedRows = ref({})
19
+ const showTooltipFor = ref({})
20
+
21
+ //Tooltip handling
22
+ const checkEllipsis = (sectionIndex, rowIndex, el) => {
23
+ if (!el) return
24
+ setTimeout(() => {
25
+ const isEllipsed = el.scrollWidth > el.clientWidth
26
+ if (!showTooltipFor.value[sectionIndex]) {
27
+ showTooltipFor.value[sectionIndex] = {}
28
+ }
29
+ showTooltipFor.value[sectionIndex][rowIndex] = isEllipsed
30
+ }, 50)
31
+ }
32
+
33
+ //Selection handling
34
+ const isSelected = (sectionIndex, rowIndex) =>
35
+ selectedRows.value[sectionIndex]?.includes(rowIndex)
36
+
37
+ const selectItem = (sectionIndex, rowIndex, item) => {
38
+ if (item.disabled) return
39
+
40
+ let isSelected = false
41
+ if (props.multiple) {
42
+ if (!selectedRows.value[sectionIndex]) {
43
+ selectedRows.value[sectionIndex] = []
44
+ }
45
+ const idx = selectedRows.value[sectionIndex].indexOf(rowIndex)
46
+ if (idx > -1) {
47
+ selectedRows.value[sectionIndex].splice(idx, 1)
48
+ isSelected = false
49
+ } else {
50
+ selectedRows.value[sectionIndex].push(rowIndex)
51
+ isSelected = true
52
+ }
53
+
54
+ selectedRows.value[sectionIndex].sort((a, b) => a - b)
55
+ updateActiveLine(sectionIndex)
56
+ } else {
57
+ const alreadySelected =
58
+ selectedRows.value[sectionIndex]?.[0] === rowIndex &&
59
+ Object.keys(selectedRows.value).length === 1
60
+
61
+ if (alreadySelected) {
62
+ selectedRows.value = {}
63
+ activeLineStyles.value = {}
64
+ isSelected = false
65
+ } else {
66
+ selectedRows.value = { [sectionIndex]: [rowIndex] }
67
+ activeLineStyles.value = {}
68
+ updateActiveLine(sectionIndex)
69
+ isSelected = true
70
+ }
71
+ }
72
+
73
+ emit('onItemClick', { sectionIndex, item, selected: isSelected })
74
+ }
75
+
76
+ //Active line handling
77
+ const updateActiveLine = (sectionIndex) => {
78
+ nextTick(() => {
79
+ const container = document.querySelector(`[data-section="${sectionIndex}"]`)
80
+ const allRows = [...(container?.querySelectorAll('.row-item') || [])]
81
+
82
+ const selectedIndexes = selectedRows.value[sectionIndex] || []
83
+ const groups = []
84
+ let currentGroup = []
85
+
86
+ selectedIndexes.forEach((idx, i) => {
87
+ if (i === 0 || idx === selectedIndexes[i - 1] + 1) {
88
+ currentGroup.push(idx)
89
+ } else {
90
+ groups.push(currentGroup)
91
+ currentGroup = [idx]
92
+ }
93
+ })
94
+ if (currentGroup.length) groups.push(currentGroup)
95
+
96
+ activeLineStyles.value[sectionIndex] = groups.map((group) => {
97
+ const firstEl = allRows[group[0]]
98
+ const lastEl = allRows[group[group.length - 1]]
99
+ const top = firstEl.offsetTop
100
+ const height = lastEl.offsetTop + lastEl.offsetHeight - top
101
+ return { top: `${top}px`, height: `${height}px` }
102
+ })
103
+ })
104
+ }
105
+
106
+ //Reset when switching to single select
107
+ watch(
108
+ () => props.multiple,
109
+ (value) => {
110
+ if (!value) {
111
+ selectedRows.value = {}
112
+ activeLineStyles.value = {}
113
+ showTooltipFor.value = {}
114
+ }
115
+ }
116
+ )
117
+ </script>
118
+
119
+ <template>
120
+ <div class="u-accordion-select" :dataTestId="dataTestId">
121
+ <div class="q-pa-xs">
122
+ <span class="text-heading-xxs text-dark" tabindex="0">{{ title }}</span>
123
+ </div>
124
+
125
+ <q-expansion-item
126
+ v-bind="$attrs"
127
+ v-for="(item, sectionIndex) in data"
128
+ header-class="q-px-xxs accordion-header text-caption-md"
129
+ :caption="item.caption"
130
+ dataTestId="division-item"
131
+ :disable="item.disabled"
132
+ :key="sectionIndex"
133
+ :label="item.title"
134
+ switch-toggle-side
135
+ >
136
+ <div class="content-with-line q-mx-sm" :data-section="sectionIndex">
137
+ <template
138
+ v-for="styleObj in activeLineStyles[sectionIndex] || []"
139
+ :key="styleObj.index"
140
+ >
141
+ <div class="active-line" :style="styleObj" />
142
+ </template>
143
+
144
+ <div
145
+ v-for="(row, rowIndex) in item?.children"
146
+ :class="[
147
+ 'row-item q-py-xs',
148
+ row.disabled ? 'disabled' : '',
149
+ isSelected(sectionIndex, rowIndex) ? 'active' : '',
150
+ ]"
151
+ dataTestId="division-child"
152
+ :key="rowIndex"
153
+ role="option"
154
+ :tabindex="row.disabled ? -1 : 0"
155
+ @click="selectItem(sectionIndex, rowIndex, row)"
156
+ @keydown.enter.prevent="selectItem(sectionIndex, rowIndex, row)"
157
+ >
158
+ <span
159
+ class="text-body-sm row-text ellipsis"
160
+ dataTestId="child-item"
161
+ :ref="(el) => checkEllipsis(sectionIndex, rowIndex, el)"
162
+ >
163
+ {{ row.title }}
164
+ <UTooltip
165
+ v-if="showTooltipFor[sectionIndex]?.[rowIndex] && row?.title"
166
+ :description="row?.title"
167
+ />
168
+ </span>
169
+ </div>
170
+ </div>
171
+ </q-expansion-item>
172
+ </div>
173
+ </template>
174
+
175
+ <style lang="sass">
176
+ .u-accordion-select
177
+ border: 1.5px solid $neutral-4
178
+ border-radius: $xs
179
+ padding: $xxs
180
+
181
+ .accordion-header
182
+ .q-item__section--avatar
183
+ min-width: 0px
184
+ .q-item__section--side
185
+ padding-right: $xxs
186
+ border-radius: $xxs
187
+ .q-item__label
188
+ word-break: break-word
189
+
190
+ .q-expansion-item__toggle-icon
191
+ font-size: $ba
192
+ .q-expansion-item--expanded .q-expansion-item__toggle-icon
193
+ line-height: 4.5
194
+
195
+ .content-with-line
196
+ position: relative
197
+ padding-left: $sm
198
+
199
+ &::before
200
+ content: ''
201
+ position: absolute
202
+ top: 0
203
+ bottom: 2px
204
+ left: 0
205
+ width: 2px
206
+ background-color: $neutral-4
207
+
208
+ .active-line
209
+ position: absolute
210
+ left: 0
211
+ width: 2px
212
+ background-color: $primary
213
+ z-index: 1
214
+ border-radius: $xs
215
+
216
+ .row-text
217
+ flex: 1 1 auto
218
+ word-wrap: break-word
219
+ min-width: 0px
220
+ overflow: hidden
221
+ white-space: nowrap
222
+ text-overflow: ellipsis
223
+
224
+ .row-item
225
+ border: 0px
226
+ cursor: pointer
227
+ position: relative
228
+ display: flex
229
+ align-items: center
230
+ &:hover:not(.disabled)
231
+ .row-text
232
+ color: $primary
233
+ .row-item.disabled
234
+ opacity: 0.5
235
+ cursor: not-allowed
236
+ pointer-events: none
237
+ </style>
@@ -23,9 +23,13 @@ const props = defineProps({
23
23
  type: String,
24
24
  },
25
25
  indicatorColor: {
26
- type: String,
26
+ type: [Function, String, Object],
27
27
  default: 'neutral-4',
28
28
  },
29
+ indicatorIcon: {
30
+ type: [Function, String, Object],
31
+ default: '',
32
+ },
29
33
  name: {
30
34
  type: String,
31
35
  required: true,
@@ -111,13 +115,17 @@ const handleClick = () => {
111
115
  {{ initials }}
112
116
  </span>
113
117
  <UBadgeStd
114
- v-if="showIndicator"
118
+ v-if="!indicatorIcon && showIndicator && indicatorColor"
115
119
  :class="`indicator`"
116
120
  :color="indicatorColor"
117
121
  size="xs"
118
122
  tabindex="-1"
119
123
  type="indicator"
120
124
  />
125
+ <div v-if="showIndicator && indicatorIcon" class="indicator-icon">
126
+ <q-icon :class="`${indicatorIcon}`" :color="indicatorColor" />
127
+ </div>
128
+
121
129
  <slot name="item" />
122
130
  </q-avatar>
123
131
  </template>
@@ -140,6 +148,9 @@ const handleClick = () => {
140
148
  width: $xs
141
149
  height: $xs
142
150
 
151
+ .q-icon
152
+ font-size: $xs
153
+
143
154
  .q-avatar__content .name
144
155
  line-height: $xs !important
145
156
 
@@ -151,6 +162,9 @@ const handleClick = () => {
151
162
  width: $xs
152
163
  height: $xs
153
164
 
165
+ .q-icon
166
+ font-size: $sm
167
+
154
168
  &.size-lg
155
169
  width: $md
156
170
  height: $md
@@ -159,6 +173,9 @@ const handleClick = () => {
159
173
  width: $sm
160
174
  height: $sm
161
175
 
176
+ .q-icon
177
+ font-size: $sm
178
+
162
179
  &.size-xl
163
180
  width: $lg
164
181
  height: $lg
@@ -167,6 +184,21 @@ const handleClick = () => {
167
184
  width: $ba
168
185
  height: $ba
169
186
 
187
+ .q-icon
188
+ font-size: $ba
189
+
190
+ .indicator-icon
191
+ position: absolute
192
+ bottom: -$xxs
193
+ right: -$xxs
194
+ width: $sm
195
+ height: $sm
196
+ border-radius: 50%
197
+ background: $neutral-1
198
+ display: flex
199
+ justify-content: center
200
+ align-items: center
201
+
170
202
  .indicator
171
203
  position: absolute
172
204
  bottom: 0
@@ -97,19 +97,19 @@ const handleSecondaryActionClick = () => {
97
97
  <template v-slot:action>
98
98
  <div :class="['row', $screen.isMobile ? 'full-width q-mt-ba' : '']">
99
99
  <u-btn-std
100
- v-if="primaryActionLabel"
100
+ v-if="secondaryActionLabel"
101
101
  :color="type"
102
- :label="primaryActionLabel"
102
+ :label="secondaryActionLabel"
103
103
  :outline="true"
104
104
  size="md"
105
- @onClick="handlePrimaryActionClick"
105
+ @onClick="handleSecondaryActionClick"
106
106
  />
107
107
  <u-btn-std
108
- v-if="secondaryActionLabel"
108
+ v-if="primaryActionLabel"
109
109
  :color="type"
110
- :label="secondaryActionLabel"
110
+ :label="primaryActionLabel"
111
111
  size="md"
112
- @onClick="handleSecondaryActionClick"
112
+ @onClick="handlePrimaryActionClick"
113
113
  />
114
114
  </div>
115
115
  </template>
@@ -149,31 +149,31 @@ const handleSecondaryActionClick = () => {
149
149
  background: $green-1 !important
150
150
  color: $green-7 !important
151
151
  &.bordered
152
- border: 1.5px solid $green-7
152
+ border: 0.094rem solid $green-7
153
153
 
154
154
  .u-banner-info
155
155
  background: $purple-1 !important
156
156
  color: $info !important
157
157
  &.bordered
158
- border: 1.5px solid $purple-7
158
+ border: 0.094rem solid $purple-7
159
159
 
160
160
  .u-banner-warning
161
161
  background: $orange-1 !important
162
162
  color: $orange-7 !important
163
163
  &.bordered
164
- border: 1.5px solid $orange-7
164
+ border: 0.094rem solid $orange-7
165
165
 
166
166
  .u-banner-accent
167
167
  background: $red-1 !important
168
168
  color: $red-7 !important
169
169
  &.bordered
170
- border: 1.5px solid $red-7
170
+ border: 0.094rem solid $red-7
171
171
 
172
172
  .u-banner-primary
173
173
  background: $blue-1 !important
174
174
  color: $primary !important
175
175
  &.bordered
176
- border: 1.5px solid $primary
176
+ border: 0.094rem solid $primary
177
177
 
178
178
  .no-padding-label
179
179
  .q-banner__content