@@ -13,7 +13,7 @@ <h1>Create Event</h1>
1313
1414< div class ="container y-4 ">
1515 < div class ="y-4 border rounded p-4 ">
16- < form method ="{{ method }} " action ="{{ url_for(action) }} " class ="row g-3 align-items-center " >
16+ < form method ="{{ method }} " action ="{{ url_for(action) }} " class ="row g-3 align-items-center needs-validation " novalidate >
1717
1818 {% with messages = get_flashed_messages() %}
1919 {% if messages %}
@@ -29,36 +29,49 @@ <h1>Create Event</h1>
2929 < div class ="form-floating col-md-6 offset-md-3 ">
3030 < input type ="text " name ="name " id ="name " class ="form-control " placeholder ="Event Name " required >
3131 < label for ="name "> Event Name</ label >
32+ < div class ="invalid-feedback "> Please provide a name</ div >
33+ < div class ="valid-feedback "> Looks good!</ div >
3234 </ div >
3335
3436 <!-- description -->
3537 < div class ="form-floating col-12 ">
3638 < textarea name ="description " id ="description " class ="form-control " placeholder ="Event Description " style ="height: 10rem; " required > </ textarea >
3739 < label for ="description "> Event Description (Markdown)</ label >
40+ < div class ="invalid-feedback "> Please provide a description</ div >
41+ < div class ="valid-feedback "> Looks good!</ div >
3842 </ div >
3943
4044 <!-- location -->
4145 <!-- TODO: maybe update location url automatically?-->
46+ <!-- known issue with bootstrap (https://github.com/twbs/bootstrap/pull/34527#pullrequestreview-830171528) means form-floating needs to be a div when using input-groups -->
4247 < div class ="input-group col-12 ">
4348 < div class ="input-group-text ">
4449 < i class ="ph-bold ph-map-pin "> </ i >
4550 </ div >
46- < div class ="form-floating ">
51+
52+ < fieldset class ="form-floating ">
4753 < input type ="text " name ="location " id ="location " class ="form-control " placeholder ="Event Location " required >
4854 < label for ="location "> Event Location</ label >
49- </ div >
50- < div class ="form-floating ">
51- < input type ="text " name ="location_url " id ="location_url " class ="form-control " placeholder ="https://example.com/ ">
55+ </ fieldset >
56+ < div class ="invalid-feedback " style ="position: absolute; top: 70%; "> Please provide a location</ div >
57+ < div class ="valid-feedback " style ="position: absolute; top: 70%; "> Looks good!</ div >
58+
59+ < fieldset class ="form-floating ">
60+ < input type ="text " name ="location_url " id ="location_url " class ="form-control last-border " placeholder ="https://example.com/ " pattern ="^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?$ ">
5261 < label for ="location_url "> Location URL</ label >
53- </ div >
62+ </ fieldset >
63+ < div class ="invalid-feedback " style ="position: absolute; top: 70%; left: 52%; "> Must be a URL</ div >
64+ < div class ="valid-feedback " style ="position: absolute; top: 70%; left: 52%; "> Looks good!</ div >
65+ <!-- zero-width space to add padding -->
66+ < div class ="valid-feedback invalid-feedback "> </ div >
5467 </ div >
5568
5669 <!-- draft -->
5770 < div class ="col-md-4 ">
5871 <!-- same height calculation as form-floating to stay same size -->
5972 < div class ="input-group " style ="height: calc(3.5rem + calc(var(--bs-border-width) * 2)); ">
6073 < div class ="input-group-text ">
61- < input type ="checkbox " name ="draft " id ="draft " class ="form-check-input ">
74+ < input type ="checkbox " name ="draft " id ="draft " class ="form-check-input no-validate-checkbox ">
6275 </ div >
6376 < label for ="draft " class ="form-control d-flex align-items-center "> Draft</ label >
6477 </ div >
@@ -71,49 +84,59 @@ <h1>Create Event</h1>
7184 < div class ="input-group-text ">
7285 < i class ="ph-bold ph-phosphor-logo " id ="icon-preview "> </ i >
7386 </ div >
74- < div class ="form-floating ">
75- < input type ="text " name ="icon " id ="icon " class ="form-control " placeholder ="ph-calendar ">
87+ < fieldset class ="form-floating ">
88+ < input type ="text " name ="icon " id ="icon " class ="form-control last-border " placeholder ="ph-calendar ">
7689 < label for ="icon "> Event Phosphor Icon</ label >
77- </ div >
90+ </ fieldset >
91+ < div class ="invalid-feedback "> Please provide a valid < a href ="https://phosphoricons.com/ " target ="_blank "> Phosphor Icon</ a > name or one of: {{ ", ".join(icons) }}</ div >
92+ < div class ="valid-feedback "> Looks good!</ div >
7893 </ div >
7994 </ div >
8095
8196 <!-- colour -->
8297 < div class ="col-md-4 ">
8398 < div class ="input-group ">
8499 < div class ="input-group-text ">
85- < input type ="color " name ="color_colour " id ="color_colour " class ="form-control form-control-color ">
100+ < input type ="color " name ="color_colour " id ="color_colour " class ="form-control form-control-color no-validate no-validate-colour ">
86101 </ div >
87102 < div class ="input-group-text "> #</ div >
88- < div class ="form-floating ">
89- < input type ="text " name ="text_colour " id ="text_colour " class ="form-control " placeholder ="#000000 ">
103+ < fieldset class ="form-floating ">
104+ < input type ="text " name ="text_colour " id ="text_colour " class ="form-control last-border " placeholder ="#000000 ">
90105 < label for ="text_colour "> Event Color</ label >
91- </ div >
106+ </ fieldset >
107+ < div class ="invalid-feedback "> Please provide a valid hex color code or one of: {{ ", ".join(colors) }}</ div >
108+ < div class ="valid-feedback "> Looks good!</ div >
92109 </ div >
93110 </ div >
94111
95112 <!-- start -->
96113 < div class ="form-floating col-md-4 ">
97114 < input type ="datetime-local " name ="start_time " id ="start_time " class ="form-control " required >
98115 < label for ="start_time "> Start Time</ label >
116+ < div class ="invalid-feedback "> Please provide a start time</ div >
117+ < div class ="valid-feedback "> Looks good!</ div >
99118 </ div >
100119
101120 <!-- end -->
102121 < div class ="form-floating col-md-4 ">
103122 < input type ="datetime-local " name ="end_time " id ="end_time " class ="form-control ">
104123 < label for ="end_time "> End Time</ label >
124+ < div class ="invalid-feedback "> Endtime must be after start time and match the duration</ div >
125+ < div class ="valid-feedback "> Looks good!</ div >
105126 </ div >
106127
107128 <!-- duration -->
108129 < div class ="form-floating col-md-4 ">
109- < input type ="text " name ="duration " id ="duration " class ="form-control " pattern ="^ \d{2}:(?:[01]\d|2[0-3]):[0-5]\d$ " placeholder ="DD:HH:MM ">
130+ < input type ="text " name ="duration " id ="duration " class ="form-control " pattern ="\d{2}:(?:[01]\d|2[0-3]):[0-5]\d " placeholder ="DD:HH:MM ">
110131 < label for ="duration "> Duration (DD:HH:MM)</ label >
132+ < div class ="invalid-feedback "> Please provide a duration in the format DD:HH:MM</ div >
133+ < div class ="valid-feedback "> Looks good!</ div >
111134 </ div >
112135
113136 <!-- tags -->
114137 <!-- badge and created tags? -->
115138 < div class ="form-floating col-md-8 offset-md-2 ">
116- < input type ="text " name ="tags " id ="tags " class ="form-control " placeholder ="tag1,tag2,tag3 ">
139+ < input type ="text " name ="tags " id ="tags " class ="form-control no-validate " placeholder ="tag1,tag2,tag3 ">
117140 < label for ="tags "> Tags</ label >
118141 </ div >
119142
0 commit comments