@dcrackel/hematournamentui 1.0.241 → 1.0.243

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dcrackel/hematournamentui",
3
3
  "private": false,
4
- "version": "1.0.241",
4
+ "version": "1.0.243",
5
5
  "type": "module",
6
6
  "main": "dist/HemaTournamentUI-lib.umd.js",
7
7
  "module": "dist/HemaTournamentUI-lib.es.js",
@@ -28,7 +28,7 @@
28
28
  "@fontsource/fira-code": "^5.0.18",
29
29
  "@fontsource/inter": "^5.0.19",
30
30
  "@fontsource/roboto-mono": "^5.0.18",
31
- "@storybook/icons": "^1.2.9",
31
+ "@storybook/icons": "^1.2.10",
32
32
  "@tiptap/extension-bold": "^2.1.13",
33
33
  "@tiptap/extension-highlight": "^2.1.13",
34
34
  "@tiptap/extension-text-align": "^2.1.13",
@@ -52,17 +52,17 @@
52
52
  },
53
53
  "devDependencies": {
54
54
  "@chromatic-com/storybook": "^1.6.1",
55
- "@storybook/addon-actions": "^8.2.6",
56
- "@storybook/addon-docs": "^8.2.6",
57
- "@storybook/addon-essentials": "^8.2.6",
58
- "@storybook/addon-interactions": "^8.2.6",
59
- "@storybook/addon-links": "^8.2.6",
60
- "@storybook/addon-mdx-gfm": "^8.2.6",
61
- "@storybook/blocks": "^8.2.6",
62
- "@storybook/react": "^8.2.6",
63
- "@storybook/test": "^8.2.6",
64
- "@storybook/vue3": "^8.2.6",
65
- "@storybook/vue3-vite": "^8.2.6",
55
+ "@storybook/addon-actions": "^8.2.7",
56
+ "@storybook/addon-docs": "^8.2.7",
57
+ "@storybook/addon-essentials": "^8.2.7",
58
+ "@storybook/addon-interactions": "^8.2.7",
59
+ "@storybook/addon-links": "^8.2.7",
60
+ "@storybook/addon-mdx-gfm": "^8.2.7",
61
+ "@storybook/blocks": "^8.2.7",
62
+ "@storybook/react": "^8.2.7",
63
+ "@storybook/test": "^8.2.7",
64
+ "@storybook/vue3": "^8.2.7",
65
+ "@storybook/vue3-vite": "^8.2.7",
66
66
  "@vitejs/plugin-vue": "^5.0.0",
67
67
  "@vitest/coverage-v8": "^1.1.0",
68
68
  "@vue/cli-plugin-babel": "^5.0.8",
@@ -71,7 +71,7 @@
71
71
  "eslint": "^8.56.0",
72
72
  "eslint-plugin-storybook": "^0.8.0",
73
73
  "eslint-plugin-vue": "^9.20.1",
74
- "storybook": "^8.2.6",
74
+ "storybook": "^8.2.7",
75
75
  "storybook-vue3-router": "^5.0.0",
76
76
  "tailwindcss": "^3.4.3",
77
77
  "vite": "^5.0.10",
Binary file
@@ -1,19 +1,19 @@
1
1
  const mockTournaments = [
2
2
  {
3
- "TournamentId": 3,
4
- "Name": "Fetchfecht",
5
- "StartDate": "2024-05-05",
6
- "EndDate": "2024-05-09",
7
- "Description": "Cats and Swords, fence then play with adorable cats",
8
- "ClubId": 1,
3
+ "TournamentId": 19,
4
+ "Name": "Sword Quench",
5
+ "StartDate": "2024-08-02",
6
+ "EndDate": "2024-08-02",
7
+ "Description": "<p>This is a test</p>",
8
+ "ClubId": 10,
9
9
  "AddressId": 1,
10
10
  "Visibility": "Open",
11
11
  "HostedOnM2": true,
12
- "PrimaryContactId": null,
13
- "CreatedByPersonId": null,
12
+ "PrimaryContactId": 75,
13
+ "CreatedByPersonId": 1,
14
14
  "Club": {
15
- "ClubId": 1,
16
- "Name": "Acme Fencing Club"
15
+ "ClubId": 10,
16
+ "Name": "Columbus United Fencing Club"
17
17
  },
18
18
  "Address": {
19
19
  "Name": "Test Location",
@@ -23,33 +23,39 @@ const mockTournaments = [
23
23
  "Zip": 43015,
24
24
  "Coordinates": "40.2828592,-83.1118049"
25
25
  },
26
- "PrimaryContact": null,
27
- "CreatedByPerson": null,
28
- "SocialMedia": [
29
- {
30
- "Link": "http://second-link.com",
31
- "Label": null
32
- },
33
- {
34
- "Link": "https://thisisatest.com",
35
- "Label": null
36
- }
37
- ],
26
+ "PrimaryContact": {
27
+ "PersonId": 75,
28
+ "DisplayName": "William Handford",
29
+ "Pronouns": "He/Him",
30
+ "FirstName": "William",
31
+ "LastName": "Handford",
32
+ "Birthday": null,
33
+ "ClubId": 10,
34
+ "HemaRatingsId": 8966,
35
+ "ShowData": true,
36
+ "AccessLevel": "User"
37
+ },
38
+ "CreatedByPerson": {
39
+ "PersonId": 1,
40
+ "DisplayName": "Dwain Crackel",
41
+ "Pronouns": "He/Him",
42
+ "FirstName": "Dwain",
43
+ "LastName": "Crackel",
44
+ "Birthday": "1980-07-16",
45
+ "ClubId": 10,
46
+ "HemaRatingsId": 8962,
47
+ "ShowData": true,
48
+ "AccessLevel": "User"
49
+ },
50
+ "SocialMedia": [],
38
51
  "Images": [
39
52
  {
40
- "ImageId": 1,
41
- "URL": "https://i.ytimg.com/vi/ieQglgIMfao/maxresdefault.jpg",
42
- "AltText": "This is alt text"
53
+ "ImageId": 28,
54
+ "URL": "http://localhost/uploads/t-b3e00ebf.png",
55
+ "AltText": "Sword Quench image"
43
56
  }
44
57
  ],
45
- "Tag": [
46
- {
47
- "TagName": "Saber"
48
- },
49
- {
50
- "TagName": "Longsword"
51
- }
52
- ]
58
+ "Tag": []
53
59
  },
54
60
  {
55
61
  "TournamentId": 4,
@@ -1,47 +1,37 @@
1
1
  import AddDisplayModal from './AddDisplayModal.vue';
2
- import getAllStaffByTournamentId from "../../../../mocks/getAllStaffByTournamentId.js";
3
- import getEventByTournamentId from "../../../../mocks/getEventByTournamentId.js";
4
2
 
5
3
  export default {
6
4
  title: 'Molecules/Modals/AddDisplayModal',
7
5
  component: AddDisplayModal,
8
6
  tags: ['autodocs'],
9
7
  args: {
10
- displayType: "ScoreBoard",
11
- displayName: "Ring 1",
12
- assignedTo: { text: "Dave Smith", link: "1" },
13
- assignedToEvent: { text: "Cats and things", link: "1" },
14
- staffDropDown: getAllStaffByTournamentId,
15
- eventDropDown: getEventByTournamentId
8
+ show: true,
9
+ clubs: [{ id: 1, name: 'Club 1' }, { id: 2, name: 'Club 2' }],
10
+ userClub: { id: 1, name: 'Club 1' },
11
+ isAdmin: true
16
12
  },
17
13
  argTypes: {
18
- displayType: { control: { type: 'text' } },
19
- displayName: { control: { type: 'text' } },
20
- assignedTo: { control: { type: 'object' } },
21
- assignedToEvent: { control: { type: 'object' } },
22
- staffDropDown: { control: { type: 'array' } },
23
- eventDropDown: { control: { type: 'array' } },
14
+ show: { control: { type: 'boolean' } },
15
+ clubs: { control: { type: 'array' } },
16
+ userClub: { control: { type: 'object' } },
17
+ isAdmin: { control: { type: 'boolean' } }
24
18
  },
25
19
  };
26
20
 
27
21
  export const Default = {
28
22
  args: {
29
- displayType: "ScoreBoard",
30
- displayName: "Ring 1",
31
- assignedTo: { text: "Dave Smith", link: "1" },
32
- assignedToEvent: { text: "Cats and things", link: "1" },
33
- staffDropDown: getAllStaffByTournamentId,
34
- eventDropDown: getEventByTournamentId
23
+ show: true,
24
+ clubs: [{ id: 1, name: 'Club 1' }, { id: 2, name: 'Club 2' }],
25
+ userClub: { id: 1, name: 'Club 1' },
26
+ isAdmin: true
35
27
  },
36
28
  };
37
29
 
38
30
  export const WithInitialCount = {
39
31
  args: {
40
- displayType: "FlightBoard",
41
- displayName: "FlightBoard 1",
42
- assignedTo: { text: "Jenny Jones", link: "2" },
43
- assignedToEvent: { text: "Cats and things", link: "1" },
44
- staffDropDown: getAllStaffByTournamentId,
45
- eventDropDown: getEventByTournamentId
32
+ show: true,
33
+ clubs: [{ id: 1, name: 'Club 1' }, { id: 2, name: 'Club 2' }],
34
+ userClub: { id: 2, name: 'Club 2' },
35
+ isAdmin: false
46
36
  },
47
37
  };
@@ -33,15 +33,18 @@ export default {
33
33
  },
34
34
  clubs: {
35
35
  type: Array,
36
- required: true
36
+ required: true,
37
+ default: () => []
37
38
  },
38
39
  userClub: {
39
40
  type: Object,
40
- required: true
41
+ required: true,
42
+ default: () => ({})
41
43
  },
42
44
  isAdmin: {
43
45
  type: Boolean,
44
- required: true
46
+ required: true,
47
+ default: false
45
48
  }
46
49
  },
47
50
  methods: {
@@ -0,0 +1,28 @@
1
+ import LoadingModal from './LoadingModal.vue';
2
+
3
+ export default {
4
+ title: 'Molecules/Modals/LoadingModal',
5
+ component: LoadingModal,
6
+ tags: ['autodocs'],
7
+ args: {
8
+ show: true,
9
+ headerText: "Loading...",
10
+ animatedGif: "https://media.giphy.com/media/sSgvbe1m3n93G/giphy.gif", // Replace with the actual gif URL
11
+ loadingText: "Please wait while we load the data."
12
+ },
13
+ argTypes: {
14
+ show: { control: { type: 'boolean' } },
15
+ headerText: { control: { type: 'text' } },
16
+ animatedGif: { control: { type: 'text' } },
17
+ loadingText: { control: { type: 'text' } }
18
+ },
19
+ };
20
+
21
+ export const Default = {
22
+ args: {
23
+ show: true,
24
+ headerText: "Loading...",
25
+ animatedGif: "https://media.giphy.com/media/sSgvbe1m3n93G/giphy.gif", // Replace with the actual gif URL
26
+ loadingText: "Please wait while we load the data."
27
+ },
28
+ };
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <transition
3
+ enter-active-class="transition-opacity duration-500"
4
+ enter-class="opacity-0"
5
+ enter-to-class="opacity-100"
6
+ leave-active-class="transition-opacity duration-500"
7
+ leave-class="opacity-100"
8
+ leave-to-class="opacity-0"
9
+ >
10
+ <div v-if="show" class="fixed inset-0 bg-secondary bg-opacity-75 flex items-center justify-center z-50">
11
+ <div class="w-1/3 min-w-[30rem] bg-loadingModalBG rounded-lg shadow-lg pb-6 px-2 text-center py-4">
12
+ <div class="text-lg font-semibold mt-2">{{ headerText }}</div>
13
+ <img :src="loadedImageGif" alt="Loading" class="my-4 mx-auto w-52" />
14
+ <div class="text-sm">{{ loadingText }}</div>
15
+ </div>
16
+ </div>
17
+ </transition>
18
+ </template>
19
+
20
+ <script>
21
+ import loadingImage from '../../../../assets/loading.gif';
22
+
23
+ export default {
24
+ name: "LoadingModal",
25
+ props: {
26
+ show: {
27
+ type: Boolean,
28
+ default: true
29
+ },
30
+ headerText: {
31
+ type: String,
32
+ required: true
33
+ },
34
+ loadingText: {
35
+ type: String,
36
+ required: true
37
+ }
38
+ },
39
+ data() {
40
+ return {
41
+ loadedImageGif: loadingImage
42
+ };
43
+ }
44
+ };
45
+ </script>
@@ -1,6 +1,7 @@
1
1
  import AddTournamentPageOne from './AddTournamentPageOne.vue';
2
2
  import mockLocation from '../../../../../mocks/locationMock.js';
3
3
  import mockPersons from '../../../../../mocks/personsMock.js';
4
+ import mockTournaments from '../../../../../mocks/tournamentMock.js';
4
5
 
5
6
  export default {
6
7
  title: 'Templates/TournamentManagement/AddTournament/PageOne',
@@ -46,3 +47,15 @@ export const Default = {
46
47
  imageServer: 'http://localhost/uploads/'
47
48
  }
48
49
  };
50
+
51
+ export const ExistingTournament = {
52
+ args: {
53
+ existingTournament: mockTournaments[0],
54
+ locations: mockLocation,
55
+
56
+ addNewText: "Add New Location",
57
+ uploadImageName: 'Storybook-test',
58
+ uploadServer: 'http://localhost/uploads/',
59
+ imageServer: 'http://localhost/uploads/'
60
+ }
61
+ };
@@ -46,7 +46,10 @@
46
46
  <div class="flex flex-col pb-4">
47
47
  <BaseText :color="'primaryHighlight'" :invalid="false" :size="'sm'" :text="'Primary Contact'"
48
48
  :weight="'normal'" class="mb-1" data-testid="text-primary-contact"/>
49
- <FindPerson :addBorder="true" :persons="persons" addNewText="Add New Person"/>
49
+ <FindPerson :addBorder="true"
50
+ :persons="persons" addNewText="Add New Person"
51
+ @new-person-submitted="handleNewPerson"
52
+ @person-selected="handleAddExistingPerson"/>
50
53
  </div>
51
54
  <div class="flex flex-col pb-4">
52
55
  <BaseText :color="'primaryHighlight'" :invalid="validation.visibility" :size="'sm'"
@@ -74,10 +77,12 @@ import BaseButton from "../../../../Molecules/Buttons/BaseButton/BaseButton.vue"
74
77
  import FindLocation from "../../../../Organisms/ComplexInputs/FindLocation/FindLocation.vue";
75
78
  import FindPerson from "../../../../Organisms/ComplexInputs/FindPerson/FindPerson.vue";
76
79
  import TitledInput from "../../../../Molecules/CombinationInputs/TitledInput/TitledInput.vue";
80
+ import FindOrAddPerson from "../../../../Organisms/ComplexInputs/FindOrAddPerson/FindOrAddPerson.vue";
77
81
 
78
82
  export default {
79
83
  name: 'AddTournamentPageOne',
80
84
  components: {
85
+ FindOrAddPerson,
81
86
  TitledInput,
82
87
  FindPerson,
83
88
  FindLocation,
@@ -91,6 +96,10 @@ export default {
91
96
  BaseButton
92
97
  },
93
98
  props: {
99
+ existingTournament: {
100
+ type: Object,
101
+ required: false
102
+ },
94
103
  locations: Array,
95
104
  persons: Array,
96
105
  urlToImage: {
@@ -116,11 +125,15 @@ export default {
116
125
  name: '',
117
126
  imageLink: '',
118
127
  addressId: 0,
128
+ primaryContactId: 0,
129
+ clubId: 0,
119
130
  startDate: '',
120
131
  totalDays: 1,
132
+ hostedOnM2: true,
121
133
  description: '',
122
134
  visibility: '',
123
- externalLinks: Array
135
+ externalLinks: Array,
136
+ tags: Array
124
137
  },
125
138
  validation: {
126
139
  name: false,
@@ -172,7 +185,15 @@ export default {
172
185
  handleNewImageUrl(url) {
173
186
  this.tournament.imageLink = url;
174
187
  this.$emit('update:image', url);
175
- }
188
+ },
189
+ handleNewPerson(person) {
190
+ this.tournament.primaryContactId = person.PersonId;
191
+ this.$emit('add:primaryContact', person);
192
+ },
193
+ handleAddExistingPerson(person) {
194
+ this.tournament.primaryContactId = person.PersonId;
195
+ this.$emit('add:existingPrimaryContact', person);
196
+ },
176
197
  },
177
198
  computed: {
178
199
  areAnyFieldsAreLeftInvalid() {
@@ -8,7 +8,7 @@
8
8
  :weight="'normal'" class="mb-1 ml-1" data-testid="text-cover-image"/>
9
9
  <div class="w-full flex justify-center">
10
10
  <div class="w-3/4">
11
- <ImageCropper :url="tournamentImage" :imageName="`t-${localTournament.TournamentId}`" @update:url="handleUpdateUrl"/>
11
+ <ImageCropper :urlToImage="tournamentImage" :imageName="`${localTournament.TournamentId}`" @update:url="handleUpdateUrl"/>
12
12
  </div>
13
13
  </div>
14
14
  </div>
@@ -31,6 +31,8 @@
31
31
  <TextBoxEditor :initialContent="localTournament.Description" :invalid="validation.description"
32
32
  @update:editorContent="handleEditorUpdate"/>
33
33
  </div>
34
+
35
+ <section class="flex flex-col">
34
36
  <div class="flex flex-row justify-center mb-3">
35
37
  <div class="flex flex-col w-1/2 mr-1">
36
38
  <BaseText :color="'quinary'" :invalid="validation.startDate" :size="'sm'" :text="'Start Date'"
@@ -43,6 +45,22 @@
43
45
  <BaseInput :addBorder="true" :placeholder="totalDays" @update:value="handleTotalDays"/>
44
46
  </div>
45
47
  </div>
48
+ <div class="flex flex-col pb-4">
49
+ <BaseText :color="'primaryHighlight'" :invalid="false" :size="'sm'" :text="'Primary Contact'"
50
+ :weight="'normal'" class="mb-1" data-testid="text-primary-contact"/>
51
+ <FindPerson :addBorder="true"
52
+ :persons="persons" addNewText="Add New Person"
53
+ @new-person-submitted="handleNewPerson"
54
+ @person-selected="handleAddExistingPerson"/>
55
+ </div>
56
+ <div class="flex flex-col pb-4">
57
+ <BaseText :color="'primaryHighlight'" :invalid="validation.visibility" :size="'sm'"
58
+ :text="'Tournament Visibility'" :weight="'normal'" class="mb-2" data-testid="text-visibility"/>
59
+ <BaseRadioGroup :invalid="validation.visibility" :items="visibilityItems"
60
+ @update:value="value => tournament.visibility = value"/>
61
+ </div>
62
+ </section>
63
+
46
64
  <div class="flex flex-row justify-center my-10">
47
65
  <BaseButton class="w-1/2 ml-1" color="neutral" label="Cancel" size="sm" type="primary" @click="handleCancel"/>
48
66
  <BaseButton class="w-1/2 mr-1 transition-all duration-300 ease-in-out" color="neutral" :label="saveButtonLabel" selected=selected size="sm" type="primary"
@@ -63,9 +81,13 @@ import TextBoxEditor from "../../../../Organisms/ComplexInputs/TextBoxEditor/Tex
63
81
  import FindLocation from "../../../../Organisms/ComplexInputs/FindLocation/FindLocation.vue";
64
82
  import DatePicker from "../../../../Organisms/ComplexInputs/DatePicker/DatePicker.vue";
65
83
  import EditEventsTopMenu from "../../../Menus/EditEventsTopMenu/EditEventsTopMenu.vue";
84
+ import FindPerson from "../../../../Organisms/ComplexInputs/FindPerson/FindPerson.vue";
85
+ import BaseRadioGroup from "../../../../Atoms/RadioGroup/BaseRadioGroup.vue";
66
86
 
67
87
  export default {
68
88
  components: {
89
+ BaseRadioGroup,
90
+ FindPerson,
69
91
  EditEventsTopMenu,
70
92
  DatePicker,
71
93
  FindLocation,
@@ -89,6 +111,18 @@ export default {
89
111
  saveButtonLabel: {
90
112
  type: String,
91
113
  default: 'Save'
114
+ },
115
+ uploadImageName: {
116
+ type: String,
117
+ default: 'default-image'
118
+ },
119
+ uploadServer: {
120
+ type: String,
121
+ default: 'http://localhost/uploads/'
122
+ },
123
+ imageServer: {
124
+ type: String,
125
+ default: 'http://localhost/uploads/'
92
126
  }
93
127
  },
94
128
  emits: ['tab:menu-click', 'manageEvent', 'editEvent', 'addEvent', 'image:upload'],
@@ -109,7 +143,12 @@ export default {
109
143
  {id: 'Basic', label: 'Basic', color: 'primaryHighlight'},
110
144
  {id: 'Details', label: 'Details', color: 'primaryHighlight'},
111
145
  {id: 'Events', label: 'Events', color: 'primaryHighlight'},
112
- ]
146
+ ],
147
+ visibilityItems: [
148
+ {label: 'Open', value: 'open', description: 'Viewable To Everyone'},
149
+ {label: 'Club', value: 'club', description: 'Viewable Only to Members of Your Club'},
150
+ {label: 'Private', value: 'private', description: 'Only Viewable by you'},
151
+ ],
113
152
  }
114
153
  },
115
154
  computed: {
@@ -83,6 +83,7 @@ module.exports = {
83
83
  eventBoxRed: '#f7efef',
84
84
  poolSetup: '#F6FAFD',
85
85
  poolBox: '#f7f8fb',
86
+ loadingModalBG: '#fcfcfc',
86
87
  pink: '#D88DB7',
87
88
  red: '#C74444',
88
89
  blue: '#375085',