Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
TDT4242-group15
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Vegard Murvold Sporstøl
TDT4242-group15
Commits
9bd5e066
Commit
9bd5e066
authored
4 years ago
by
Irina Kera Gundersen
Browse files
Options
Downloads
Patches
Plain Diff
Add feature to select athlete for workout
parent
ed772d42
No related branches found
Branches containing commit
No related tags found
1 merge request
!6
Uc 1
Pipeline
#113438
passed
4 years ago
Stage: test
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
frontend/www/scripts/workout.js
+375
-296
375 additions, 296 deletions
frontend/www/scripts/workout.js
frontend/www/workout.html
+36
-17
36 additions, 17 deletions
frontend/www/workout.html
with
411 additions
and
313 deletions
frontend/www/scripts/workout.js
+
375
−
296
View file @
9bd5e066
...
@@ -4,350 +4,429 @@ let deleteWorkoutButton;
...
@@ -4,350 +4,429 @@ let deleteWorkoutButton;
let
editWorkoutButton
;
let
editWorkoutButton
;
let
postCommentButton
;
let
postCommentButton
;
async
function
retrieveWorkout
(
id
)
{
async
function
retrieveWorkout
(
id
)
{
let
workoutData
=
null
;
let
workoutData
=
null
;
let
response
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/workouts/
${
id
}
/`
);
let
response
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/workouts/
${
id
}
/`
);
if
(
!
response
.
ok
)
{
if
(
!
response
.
ok
)
{
let
data
=
await
response
.
json
();
let
data
=
await
response
.
json
();
let
alert
=
createAlert
(
"
Could not retrieve workout data!
"
,
data
);
let
alert
=
createAlert
(
"
Could not retrieve workout data!
"
,
data
);
document
.
body
.
prepend
(
alert
);
document
.
body
.
prepend
(
alert
);
}
else
{
}
else
{
workoutData
=
await
response
.
json
();
workoutData
=
await
response
.
json
();
let
form
=
document
.
querySelector
(
"
#form-workout
"
);
let
form
=
document
.
querySelector
(
"
#form-workout
"
);
let
formData
=
new
FormData
(
form
);
let
formData
=
new
FormData
(
form
);
for
(
let
key
of
formData
.
keys
())
{
let
selector
=
`input[name="
${
key
}
"], textarea[name="
${
key
}
"]`
;
let
input
=
form
.
querySelector
(
selector
);
let
newVal
=
workoutData
[
key
];
if
(
key
==
"
date
"
)
{
// Creating a valid datetime-local string with the correct local time
let
date
=
new
Date
(
newVal
);
date
=
new
Date
(
date
.
getTime
()
-
(
date
.
getTimezoneOffset
()
*
60
*
1000
)).
toISOString
();
// get ISO format for local time
newVal
=
date
.
substring
(
0
,
newVal
.
length
-
1
);
// remove Z (since this is a local time, not UTC)
}
if
(
key
!=
"
files
"
)
{
input
.
value
=
newVal
;
}
}
let
input
=
form
.
querySelector
(
"
select:disabled
"
);
for
(
let
key
of
formData
.
keys
())
{
input
.
value
=
workoutData
[
"
visibility
"
];
let
selector
=
`input[name="
${
key
}
"], textarea[name="
${
key
}
"]`
;
// files
let
input
=
form
.
querySelector
(
selector
);
let
filesDiv
=
document
.
querySelector
(
"
#uploaded-files
"
);
let
newVal
=
workoutData
[
key
];
for
(
let
file
of
workoutData
.
files
)
{
if
(
key
==
"
date
"
)
{
let
a
=
document
.
createElement
(
"
a
"
);
// Creating a valid datetime-local string with the correct local time
a
.
href
=
file
.
file
;
let
date
=
new
Date
(
newVal
);
let
pathArray
=
file
.
file
.
split
(
"
/
"
);
date
=
new
Date
(
a
.
text
=
pathArray
[
pathArray
.
length
-
1
];
date
.
getTime
()
-
date
.
getTimezoneOffset
()
*
60
*
1000
a
.
className
=
"
me-2
"
;
).
toISOString
();
// get ISO format for local time
filesDiv
.
appendChild
(
a
);
newVal
=
date
.
substring
(
0
,
newVal
.
length
-
1
);
// remove Z (since this is a local time, not UTC)
}
}
if
(
key
!=
"
files
"
)
{
input
.
value
=
newVal
;
}
}
let
input
=
form
.
querySelector
(
"
select:disabled
"
);
input
.
value
=
workoutData
[
"
visibility
"
];
// files
let
filesDiv
=
document
.
querySelector
(
"
#uploaded-files
"
);
for
(
let
file
of
workoutData
.
files
)
{
let
a
=
document
.
createElement
(
"
a
"
);
a
.
href
=
file
.
file
;
let
pathArray
=
file
.
file
.
split
(
"
/
"
);
a
.
text
=
pathArray
[
pathArray
.
length
-
1
];
a
.
className
=
"
me-2
"
;
filesDiv
.
appendChild
(
a
);
}
// create exercises
// fetch exercise types
let
exerciseTypeResponse
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/exercises/`
);
let
exerciseTypes
=
await
exerciseTypeResponse
.
json
();
//TODO: This should be in its own method.
for
(
let
i
=
0
;
i
<
workoutData
.
exercise_instances
.
length
;
i
++
)
{
let
templateExercise
=
document
.
querySelector
(
"
#template-exercise
"
);
let
divExerciseContainer
=
templateExercise
.
content
.
firstElementChild
.
cloneNode
(
true
);
let
exerciseTypeLabel
=
divExerciseContainer
.
querySelector
(
"
.exercise-type
"
);
exerciseTypeLabel
.
for
=
`inputExerciseType
${
i
}
`
;
let
exerciseTypeSelect
=
divExerciseContainer
.
querySelector
(
"
select
"
);
exerciseTypeSelect
.
id
=
`inputExerciseType
${
i
}
`
;
exerciseTypeSelect
.
disabled
=
true
;
let
splitUrl
=
workoutData
.
exercise_instances
[
i
].
exercise
.
split
(
"
/
"
);
let
currentExerciseTypeId
=
splitUrl
[
splitUrl
.
length
-
2
];
let
currentExerciseType
=
""
;
// create exercises
for
(
let
j
=
0
;
j
<
exerciseTypes
.
count
;
j
++
)
{
let
option
=
document
.
createElement
(
"
option
"
);
// fetch exercise types
option
.
value
=
exerciseTypes
.
results
[
j
].
id
;
let
exerciseTypeResponse
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/exercises/`
);
if
(
currentExerciseTypeId
==
exerciseTypes
.
results
[
j
].
id
)
{
let
exerciseTypes
=
await
exerciseTypeResponse
.
json
();
currentExerciseType
=
exerciseTypes
.
results
[
j
];
//TODO: This should be in its own method.
for
(
let
i
=
0
;
i
<
workoutData
.
exercise_instances
.
length
;
i
++
)
{
let
templateExercise
=
document
.
querySelector
(
"
#template-exercise
"
);
let
divExerciseContainer
=
templateExercise
.
content
.
firstElementChild
.
cloneNode
(
true
);
let
exerciseTypeLabel
=
divExerciseContainer
.
querySelector
(
'
.exercise-type
'
);
exerciseTypeLabel
.
for
=
`inputExerciseType
${
i
}
`
;
let
exerciseTypeSelect
=
divExerciseContainer
.
querySelector
(
"
select
"
);
exerciseTypeSelect
.
id
=
`inputExerciseType
${
i
}
`
;
exerciseTypeSelect
.
disabled
=
true
;
let
splitUrl
=
workoutData
.
exercise_instances
[
i
].
exercise
.
split
(
"
/
"
);
let
currentExerciseTypeId
=
splitUrl
[
splitUrl
.
length
-
2
];
let
currentExerciseType
=
""
;
for
(
let
j
=
0
;
j
<
exerciseTypes
.
count
;
j
++
)
{
let
option
=
document
.
createElement
(
"
option
"
);
option
.
value
=
exerciseTypes
.
results
[
j
].
id
;
if
(
currentExerciseTypeId
==
exerciseTypes
.
results
[
j
].
id
)
{
currentExerciseType
=
exerciseTypes
.
results
[
j
];
}
option
.
innerText
=
exerciseTypes
.
results
[
j
].
name
;
exerciseTypeSelect
.
append
(
option
);
}
exerciseTypeSelect
.
value
=
currentExerciseType
.
id
;
let
exerciseSetLabel
=
divExerciseContainer
.
querySelector
(
'
.exercise-sets
'
);
exerciseSetLabel
.
for
=
`inputSets
${
i
}
`
;
let
exerciseSetInput
=
divExerciseContainer
.
querySelector
(
"
input[name='sets']
"
);
exerciseSetInput
.
id
=
`inputSets
${
i
}
`
;
exerciseSetInput
.
value
=
workoutData
.
exercise_instances
[
i
].
sets
;
exerciseSetInput
.
readOnly
=
true
;
let
exerciseNumberLabel
=
divExerciseContainer
.
querySelector
(
'
.exercise-number
'
);
exerciseNumberLabel
.
for
=
"
for
"
,
`inputNumber
${
i
}
`
;
exerciseNumberLabel
.
innerText
=
currentExerciseType
.
unit
;
let
exerciseNumberInput
=
divExerciseContainer
.
querySelector
(
"
input[name='number']
"
);
exerciseNumberInput
.
id
=
`inputNumber
${
i
}
`
;
exerciseNumberInput
.
value
=
workoutData
.
exercise_instances
[
i
].
number
;
exerciseNumberInput
.
readOnly
=
true
;
let
exercisesDiv
=
document
.
querySelector
(
"
#div-exercises
"
);
exercisesDiv
.
appendChild
(
divExerciseContainer
);
}
}
option
.
innerText
=
exerciseTypes
.
results
[
j
].
name
;
exerciseTypeSelect
.
append
(
option
);
}
exerciseTypeSelect
.
value
=
currentExerciseType
.
id
;
let
exerciseSetLabel
=
divExerciseContainer
.
querySelector
(
"
.exercise-sets
"
);
exerciseSetLabel
.
for
=
`inputSets
${
i
}
`
;
let
exerciseSetInput
=
divExerciseContainer
.
querySelector
(
"
input[name='sets']
"
);
exerciseSetInput
.
id
=
`inputSets
${
i
}
`
;
exerciseSetInput
.
value
=
workoutData
.
exercise_instances
[
i
].
sets
;
exerciseSetInput
.
readOnly
=
true
;
let
exerciseNumberLabel
=
divExerciseContainer
.
querySelector
(
"
.exercise-number
"
);
(
exerciseNumberLabel
.
for
=
"
for
"
),
`inputNumber
${
i
}
`
;
exerciseNumberLabel
.
innerText
=
currentExerciseType
.
unit
;
let
exerciseNumberInput
=
divExerciseContainer
.
querySelector
(
"
input[name='number']
"
);
exerciseNumberInput
.
id
=
`inputNumber
${
i
}
`
;
exerciseNumberInput
.
value
=
workoutData
.
exercise_instances
[
i
].
number
;
exerciseNumberInput
.
readOnly
=
true
;
let
exercisesDiv
=
document
.
querySelector
(
"
#div-exercises
"
);
exercisesDiv
.
appendChild
(
divExerciseContainer
);
}
}
return
workoutData
;
}
return
workoutData
;
}
}
function
handleCancelDuringWorkoutEdit
()
{
function
handleCancelDuringWorkoutEdit
()
{
location
.
reload
();
location
.
reload
();
}
function
athleteChecked
()
{
let
checkBox
=
document
.
getElementById
(
"
forAthlete
"
);
let
athletes
=
document
.
getElementById
(
"
athletes
"
);
let
myself
=
document
.
getElementById
(
"
inputOwner
"
);
if
(
checkBox
.
checked
==
true
)
{
athletes
.
style
.
display
=
"
block
"
;
myself
.
style
.
display
=
"
none
"
;
}
else
{
athletes
.
style
.
display
=
"
none
"
;
myself
.
style
.
display
=
"
block
"
;
}
}
}
function
handleEditWorkoutButtonClick
()
{
function
handleEditWorkoutButtonClick
()
{
let
addExerciseButton
=
document
.
querySelector
(
"
#btn-add-exercise
"
);
let
addExerciseButton
=
document
.
querySelector
(
"
#btn-add-exercise
"
);
let
removeExerciseButton
=
document
.
querySelector
(
"
#btn-remove-exercise
"
);
let
removeExerciseButton
=
document
.
querySelector
(
"
#btn-remove-exercise
"
);
setReadOnly
(
false
,
"
#form-workout
"
);
setReadOnly
(
false
,
"
#form-workout
"
);
document
.
querySelector
(
"
#inputOwner
"
).
readOnly
=
true
;
// owner field should still be readonly
document
.
querySelector
(
"
#inputOwner
"
).
readOnly
=
true
;
// owner field should still be readonly
editWorkoutButton
.
className
+=
"
hide
"
;
editWorkoutButton
.
className
+=
"
hide
"
;
okWorkoutButton
.
className
=
okWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
okWorkoutButton
.
className
=
okWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
cancelWorkoutButton
.
className
=
cancelWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
cancelWorkoutButton
.
className
=
cancelWorkoutButton
.
className
.
replace
(
deleteWorkoutButton
.
className
=
deleteWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
"
hide
"
,
addExerciseButton
.
className
=
addExerciseButton
.
className
.
replace
(
"
hide
"
,
""
);
""
removeExerciseButton
.
className
=
removeExerciseButton
.
className
.
replace
(
"
hide
"
,
""
);
);
deleteWorkoutButton
.
className
=
deleteWorkoutButton
.
className
.
replace
(
cancelWorkoutButton
.
addEventListener
(
"
click
"
,
handleCancelDuringWorkoutEdit
);
"
hide
"
,
""
);
addExerciseButton
.
className
=
addExerciseButton
.
className
.
replace
(
"
hide
"
,
""
);
removeExerciseButton
.
className
=
removeExerciseButton
.
className
.
replace
(
"
hide
"
,
""
);
cancelWorkoutButton
.
addEventListener
(
"
click
"
,
handleCancelDuringWorkoutEdit
);
}
}
async
function
deleteWorkout
(
id
)
{
async
function
deleteWorkout
(
id
)
{
let
response
=
await
sendRequest
(
"
DELETE
"
,
`
${
HOST
}
/api/workouts/
${
id
}
/`
);
let
response
=
await
sendRequest
(
"
DELETE
"
,
`
${
HOST
}
/api/workouts/
${
id
}
/`
);
if
(
!
response
.
ok
)
{
if
(
!
response
.
ok
)
{
let
data
=
await
response
.
json
();
let
data
=
await
response
.
json
();
let
alert
=
createAlert
(
`Could not delete workout
${
id
}
!`
,
data
);
let
alert
=
createAlert
(
`Could not delete workout
${
id
}
!`
,
data
);
document
.
body
.
prepend
(
alert
);
document
.
body
.
prepend
(
alert
);
}
else
{
}
else
{
window
.
location
.
replace
(
"
workouts.html
"
);
window
.
location
.
replace
(
"
workouts.html
"
);
}
}
}
}
async
function
updateWorkout
(
id
)
{
async
function
updateWorkout
(
id
)
{
let
submitForm
=
generateWorkoutForm
();
let
submitForm
=
generateWorkoutForm
();
let
response
=
await
sendRequest
(
"
PUT
"
,
`
${
HOST
}
/api/workouts/
${
id
}
/`
,
submitForm
,
""
);
let
response
=
await
sendRequest
(
if
(
!
response
.
ok
)
{
"
PUT
"
,
let
data
=
await
response
.
json
();
`
${
HOST
}
/api/workouts/
${
id
}
/`
,
let
alert
=
createAlert
(
"
Could not update workout!
"
,
data
);
submitForm
,
document
.
body
.
prepend
(
alert
);
""
}
else
{
);
location
.
reload
();
if
(
!
response
.
ok
)
{
}
let
data
=
await
response
.
json
();
let
alert
=
createAlert
(
"
Could not update workout!
"
,
data
);
document
.
body
.
prepend
(
alert
);
}
else
{
location
.
reload
();
}
}
}
function
generateWorkoutForm
()
{
function
generateWorkoutForm
()
{
let
form
=
document
.
querySelector
(
"
#form-workout
"
);
let
form
=
document
.
querySelector
(
"
#form-workout
"
);
let
formData
=
new
FormData
(
form
);
let
formData
=
new
FormData
(
form
);
let
submitForm
=
new
FormData
();
let
submitForm
=
new
FormData
();
submitForm
.
append
(
"
name
"
,
formData
.
get
(
'
name
'
));
submitForm
.
append
(
"
name
"
,
formData
.
get
(
"
name
"
));
let
date
=
new
Date
(
formData
.
get
(
'
date
'
)).
toISOString
();
let
date
=
new
Date
(
formData
.
get
(
"
date
"
)).
toISOString
();
submitForm
.
append
(
"
date
"
,
date
);
submitForm
.
append
(
"
date
"
,
date
);
submitForm
.
append
(
"
notes
"
,
formData
.
get
(
"
notes
"
));
submitForm
.
append
(
"
notes
"
,
formData
.
get
(
"
notes
"
));
submitForm
.
append
(
"
visibility
"
,
formData
.
get
(
"
visibility
"
));
submitForm
.
append
(
"
visibility
"
,
formData
.
get
(
"
visibility
"
));
// adding exercise instances
// adding exercise instances
let
exerciseInstances
=
[];
let
exerciseInstances
=
[];
let
exerciseInstancesTypes
=
formData
.
getAll
(
"
type
"
);
let
exerciseInstancesTypes
=
formData
.
getAll
(
"
type
"
);
let
exerciseInstancesSets
=
formData
.
getAll
(
"
sets
"
);
let
exerciseInstancesSets
=
formData
.
getAll
(
"
sets
"
);
let
exerciseInstancesNumbers
=
formData
.
getAll
(
"
number
"
);
let
exerciseInstancesNumbers
=
formData
.
getAll
(
"
number
"
);
for
(
let
i
=
0
;
i
<
exerciseInstancesTypes
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
exerciseInstancesTypes
.
length
;
i
++
)
{
exerciseInstances
.
push
({
exerciseInstances
.
push
({
exercise
:
`
${
HOST
}
/api/exercises/
${
exerciseInstancesTypes
[
i
]}
/`
,
exercise
:
`
${
HOST
}
/api/exercises/
${
exerciseInstancesTypes
[
i
]}
/`
,
number
:
exerciseInstancesNumbers
[
i
],
number
:
exerciseInstancesNumbers
[
i
],
sets
:
exerciseInstancesSets
[
i
]
sets
:
exerciseInstancesSets
[
i
]
});
});
}
}
submitForm
.
append
(
"
exercise_instances
"
,
JSON
.
stringify
(
exerciseInstances
));
submitForm
.
append
(
"
exercise_instances
"
,
JSON
.
stringify
(
exerciseInstances
));
// adding files
// adding files
for
(
let
file
of
formData
.
getAll
(
"
files
"
))
{
for
(
let
file
of
formData
.
getAll
(
"
files
"
))
{
submitForm
.
append
(
"
files
"
,
file
);
submitForm
.
append
(
"
files
"
,
file
);
}
}
return
submitForm
;
return
submitForm
;
}
}
async
function
createWorkout
()
{
async
function
createWorkout
()
{
let
submitForm
=
generateWorkoutForm
();
let
submitForm
=
generateWorkoutForm
();
let
response
=
await
sendRequest
(
"
POST
"
,
`
${
HOST
}
/api/workouts/`
,
submitForm
,
""
);
let
response
=
await
sendRequest
(
"
POST
"
,
`
${
HOST
}
/api/workouts/`
,
submitForm
,
""
);
if
(
response
.
ok
)
{
if
(
response
.
ok
)
{
window
.
location
.
replace
(
"
workouts.html
"
);
window
.
location
.
replace
(
"
workouts.html
"
);
}
else
{
}
else
{
let
data
=
await
response
.
json
();
let
data
=
await
response
.
json
();
let
alert
=
createAlert
(
"
Could not create new workout!
"
,
data
);
let
alert
=
createAlert
(
"
Could not create new workout!
"
,
data
);
document
.
body
.
prepend
(
alert
);
document
.
body
.
prepend
(
alert
);
}
}
}
}
function
handleCancelDuringWorkoutCreate
()
{
function
handleCancelDuringWorkoutCreate
()
{
window
.
location
.
replace
(
"
workouts.html
"
);
window
.
location
.
replace
(
"
workouts.html
"
);
}
}
async
function
createBlankExercise
()
{
async
function
createBlankExercise
()
{
let
form
=
document
.
querySelector
(
"
#form-workout
"
);
let
form
=
document
.
querySelector
(
"
#form-workout
"
);
let
exerciseTypeResponse
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/exercises/`
);
let
exerciseTypeResponse
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/exercises/`
);
let
exerciseTypes
=
await
exerciseTypeResponse
.
json
();
let
exerciseTypes
=
await
exerciseTypeResponse
.
json
();
let
exerciseTemplate
=
document
.
querySelector
(
"
#template-exercise
"
);
let
exerciseTemplate
=
document
.
querySelector
(
"
#template-exercise
"
);
let
divExerciseContainer
=
exerciseTemplate
.
content
.
firstElementChild
.
cloneNode
(
true
);
let
divExerciseContainer
=
exerciseTemplate
.
content
.
firstElementChild
.
cloneNode
(
let
exerciseTypeSelect
=
divExerciseContainer
.
querySelector
(
"
select
"
);
true
);
for
(
let
i
=
0
;
i
<
exerciseTypes
.
count
;
i
++
)
{
let
exerciseTypeSelect
=
divExerciseContainer
.
querySelector
(
"
select
"
);
let
option
=
document
.
createElement
(
"
option
"
);
option
.
value
=
exerciseTypes
.
results
[
i
].
id
;
for
(
let
i
=
0
;
i
<
exerciseTypes
.
count
;
i
++
)
{
option
.
innerText
=
exerciseTypes
.
results
[
i
].
name
;
let
option
=
document
.
createElement
(
"
option
"
);
exerciseTypeSelect
.
append
(
option
);
option
.
value
=
exerciseTypes
.
results
[
i
].
id
;
}
option
.
innerText
=
exerciseTypes
.
results
[
i
].
name
;
exerciseTypeSelect
.
append
(
option
);
}
let
currentExerciseType
=
exerciseTypes
.
results
[
0
];
let
currentExerciseType
=
exerciseTypes
.
results
[
0
];
exerciseTypeSelect
.
value
=
currentExerciseType
.
name
;
exerciseTypeSelect
.
value
=
currentExerciseType
.
name
;
let
divExercises
=
document
.
querySelector
(
"
#div-exercises
"
);
let
divExercises
=
document
.
querySelector
(
"
#div-exercises
"
);
divExercises
.
appendChild
(
divExerciseContainer
);
divExercises
.
appendChild
(
divExerciseContainer
);
}
}
function
removeExercise
(
event
)
{
function
removeExercise
(
event
)
{
let
divExerciseContainers
=
document
.
querySelectorAll
(
"
.div-exercise-container
"
);
let
divExerciseContainers
=
document
.
querySelectorAll
(
if
(
divExerciseContainers
&&
divExerciseContainers
.
length
>
0
)
{
"
.div-exercise-container
"
divExerciseContainers
[
divExerciseContainers
.
length
-
1
].
remove
();
);
}
if
(
divExerciseContainers
&&
divExerciseContainers
.
length
>
0
)
{
divExerciseContainers
[
divExerciseContainers
.
length
-
1
].
remove
();
}
}
}
function
addComment
(
author
,
text
,
date
,
append
)
{
function
addComment
(
author
,
text
,
date
,
append
)
{
/* Taken from https://www.bootdey.com/snippets/view/Simple-Comment-panel#css*/
/* Taken from https://www.bootdey.com/snippets/view/Simple-Comment-panel#css*/
let
commentList
=
document
.
querySelector
(
"
#comment-list
"
);
let
commentList
=
document
.
querySelector
(
"
#comment-list
"
);
let
listElement
=
document
.
createElement
(
"
li
"
);
let
listElement
=
document
.
createElement
(
"
li
"
);
listElement
.
className
=
"
media
"
;
listElement
.
className
=
"
media
"
;
let
commentBody
=
document
.
createElement
(
"
div
"
);
let
commentBody
=
document
.
createElement
(
"
div
"
);
commentBody
.
className
=
"
media-body
"
;
commentBody
.
className
=
"
media-body
"
;
let
dateSpan
=
document
.
createElement
(
"
span
"
);
let
dateSpan
=
document
.
createElement
(
"
span
"
);
dateSpan
.
className
=
"
text-muted pull-right me-1
"
;
dateSpan
.
className
=
"
text-muted pull-right me-1
"
;
let
smallText
=
document
.
createElement
(
"
small
"
);
let
smallText
=
document
.
createElement
(
"
small
"
);
smallText
.
className
=
"
text-muted
"
;
smallText
.
className
=
"
text-muted
"
;
if
(
date
!=
"
Now
"
)
{
if
(
date
!=
"
Now
"
)
{
let
localDate
=
new
Date
(
date
);
let
localDate
=
new
Date
(
date
);
smallText
.
innerText
=
localDate
.
toLocaleString
();
smallText
.
innerText
=
localDate
.
toLocaleString
();
}
else
{
}
else
{
smallText
.
innerText
=
date
;
smallText
.
innerText
=
date
;
}
}
dateSpan
.
appendChild
(
smallText
);
dateSpan
.
appendChild
(
smallText
);
commentBody
.
appendChild
(
dateSpan
);
commentBody
.
appendChild
(
dateSpan
);
let
strong
=
document
.
createElement
(
"
strong
"
);
let
strong
=
document
.
createElement
(
"
strong
"
);
strong
.
className
=
"
text-success
"
;
strong
.
className
=
"
text-success
"
;
strong
.
innerText
=
author
;
strong
.
innerText
=
author
;
commentBody
.
appendChild
(
strong
);
commentBody
.
appendChild
(
strong
);
let
p
=
document
.
createElement
(
"
p
"
);
let
p
=
document
.
createElement
(
"
p
"
);
p
.
innerHTML
=
text
;
p
.
innerHTML
=
text
;
commentBody
.
appendChild
(
strong
);
commentBody
.
appendChild
(
strong
);
commentBody
.
appendChild
(
p
);
commentBody
.
appendChild
(
p
);
listElement
.
appendChild
(
commentBody
);
listElement
.
appendChild
(
commentBody
);
if
(
append
)
{
if
(
append
)
{
commentList
.
append
(
listElement
);
commentList
.
append
(
listElement
);
}
else
{
}
else
{
commentList
.
prepend
(
listElement
);
commentList
.
prepend
(
listElement
);
}
}
}
}
async
function
createComment
(
workoutid
)
{
async
function
createComment
(
workoutid
)
{
let
commentArea
=
document
.
querySelector
(
"
#comment-area
"
);
let
commentArea
=
document
.
querySelector
(
"
#comment-area
"
);
let
content
=
commentArea
.
value
;
let
content
=
commentArea
.
value
;
let
body
=
{
workout
:
`
${
HOST
}
/api/workouts/
${
workoutid
}
/`
,
content
:
content
};
let
body
=
{
workout
:
`
${
HOST
}
/api/workouts/
${
workoutid
}
/`
,
let
response
=
await
sendRequest
(
"
POST
"
,
`
${
HOST
}
/api/comments/`
,
body
);
content
:
content
if
(
response
.
ok
)
{
};
addComment
(
sessionStorage
.
getItem
(
"
username
"
),
content
,
"
Now
"
,
false
);
}
else
{
let
response
=
await
sendRequest
(
"
POST
"
,
`
${
HOST
}
/api/comments/`
,
body
);
let
data
=
await
response
.
json
();
if
(
response
.
ok
)
{
let
alert
=
createAlert
(
"
Failed to create comment!
"
,
data
);
addComment
(
sessionStorage
.
getItem
(
"
username
"
),
content
,
"
Now
"
,
false
);
document
.
body
.
prepend
(
alert
);
}
else
{
}
let
data
=
await
response
.
json
();
let
alert
=
createAlert
(
"
Failed to create comment!
"
,
data
);
document
.
body
.
prepend
(
alert
);
}
}
}
async
function
retrieveComments
(
workoutid
)
{
async
function
retrieveComments
(
workoutid
)
{
let
response
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/comments/`
);
let
response
=
await
sendRequest
(
"
GET
"
,
`
${
HOST
}
/api/comments/`
);
if
(
!
response
.
ok
)
{
if
(
!
response
.
ok
)
{
let
data
=
await
response
.
json
();
let
data
=
await
response
.
json
();
let
alert
=
createAlert
(
"
Could not retrieve comments!
"
,
data
);
let
alert
=
createAlert
(
"
Could not retrieve comments!
"
,
data
);
document
.
body
.
prepend
(
alert
);
document
.
body
.
prepend
(
alert
);
}
else
{
}
else
{
let
data
=
await
response
.
json
();
let
data
=
await
response
.
json
();
let
comments
=
data
.
results
;
let
comments
=
data
.
results
;
for
(
let
comment
of
comments
)
{
for
(
let
comment
of
comments
)
{
let
splitArray
=
comment
.
workout
.
split
(
"
/
"
);
let
splitArray
=
comment
.
workout
.
split
(
"
/
"
);
if
(
splitArray
[
splitArray
.
length
-
2
]
==
workoutid
)
{
if
(
splitArray
[
splitArray
.
length
-
2
]
==
workoutid
)
{
addComment
(
comment
.
owner
,
comment
.
content
,
comment
.
timestamp
,
true
);
addComment
(
comment
.
owner
,
comment
.
content
,
comment
.
timestamp
,
true
);
}
}
}
}
}
}
}
}
window
.
addEventListener
(
"
DOMContentLoaded
"
,
async
()
=>
{
window
.
addEventListener
(
"
DOMContentLoaded
"
,
async
()
=>
{
cancelWorkoutButton
=
document
.
querySelector
(
"
#btn-cancel-workout
"
);
cancelWorkoutButton
=
document
.
querySelector
(
"
#btn-cancel-workout
"
);
okWorkoutButton
=
document
.
querySelector
(
"
#btn-ok-workout
"
);
okWorkoutButton
=
document
.
querySelector
(
"
#btn-ok-workout
"
);
deleteWorkoutButton
=
document
.
querySelector
(
"
#btn-delete-workout
"
);
deleteWorkoutButton
=
document
.
querySelector
(
"
#btn-delete-workout
"
);
editWorkoutButton
=
document
.
querySelector
(
"
#btn-edit-workout
"
);
editWorkoutButton
=
document
.
querySelector
(
"
#btn-edit-workout
"
);
let
postCommentButton
=
document
.
querySelector
(
"
#post-comment
"
);
let
postCommentButton
=
document
.
querySelector
(
"
#post-comment
"
);
let
divCommentRow
=
document
.
querySelector
(
"
#div-comment-row
"
);
let
divCommentRow
=
document
.
querySelector
(
"
#div-comment-row
"
);
let
buttonAddExercise
=
document
.
querySelector
(
"
#btn-add-exercise
"
);
let
buttonAddExercise
=
document
.
querySelector
(
"
#btn-add-exercise
"
);
let
buttonRemoveExercise
=
document
.
querySelector
(
"
#btn-remove-exercise
"
);
let
buttonRemoveExercise
=
document
.
querySelector
(
"
#btn-remove-exercise
"
);
buttonAddExercise
.
addEventListener
(
"
click
"
,
createBlankExercise
);
buttonAddExercise
.
addEventListener
(
"
click
"
,
createBlankExercise
);
buttonRemoveExercise
.
addEventListener
(
"
click
"
,
removeExercise
);
buttonRemoveExercise
.
addEventListener
(
"
click
"
,
removeExercise
);
const
urlParams
=
new
URLSearchParams
(
window
.
location
.
search
);
const
urlParams
=
new
URLSearchParams
(
window
.
location
.
search
);
let
currentUser
=
await
getCurrentUser
();
let
currentUser
=
await
getCurrentUser
();
if
(
urlParams
.
has
(
'
id
'
))
{
if
(
urlParams
.
has
(
"
id
"
))
{
const
id
=
urlParams
.
get
(
'
id
'
);
const
id
=
urlParams
.
get
(
"
id
"
);
let
workoutData
=
await
retrieveWorkout
(
id
);
let
workoutData
=
await
retrieveWorkout
(
id
);
await
retrieveComments
(
id
);
await
retrieveComments
(
id
);
if
(
workoutData
[
"
owner
"
]
==
currentUser
.
url
)
{
if
(
workoutData
[
"
owner
"
]
==
currentUser
.
url
)
{
editWorkoutButton
.
classList
.
remove
(
"
hide
"
);
editWorkoutButton
.
classList
.
remove
(
"
hide
"
);
editWorkoutButton
.
addEventListener
(
"
click
"
,
handleEditWorkoutButtonClick
);
editWorkoutButton
.
addEventListener
(
"
click
"
,
handleEditWorkoutButtonClick
);
deleteWorkoutButton
.
addEventListener
(
"
click
"
,
(
async
(
id
)
=>
await
deleteWorkout
(
id
)).
bind
(
undefined
,
id
));
deleteWorkoutButton
.
addEventListener
(
okWorkoutButton
.
addEventListener
(
"
click
"
,
(
async
(
id
)
=>
await
updateWorkout
(
id
)).
bind
(
undefined
,
id
));
"
click
"
,
postCommentButton
.
addEventListener
(
"
click
"
,
(
async
(
id
)
=>
await
createComment
(
id
)).
bind
(
undefined
,
id
));
(
async
id
=>
await
deleteWorkout
(
id
)).
bind
(
undefined
,
id
)
divCommentRow
.
className
=
divCommentRow
.
className
.
replace
(
"
hide
"
,
""
);
);
}
okWorkoutButton
.
addEventListener
(
}
else
{
"
click
"
,
await
createBlankExercise
();
(
async
id
=>
await
updateWorkout
(
id
)).
bind
(
undefined
,
id
)
let
ownerInput
=
document
.
querySelector
(
"
#inputOwner
"
);
);
ownerInput
.
value
=
currentUser
.
username
;
postCommentButton
.
addEventListener
(
setReadOnly
(
false
,
"
#form-workout
"
);
"
click
"
,
ownerInput
.
readOnly
=
!
ownerInput
.
readOnly
;
(
async
id
=>
await
createComment
(
id
)).
bind
(
undefined
,
id
)
);
okWorkoutButton
.
className
=
okWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
divCommentRow
.
className
=
divCommentRow
.
className
.
replace
(
"
hide
"
,
""
);
cancelWorkoutButton
.
className
=
cancelWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
buttonAddExercise
.
className
=
buttonAddExercise
.
className
.
replace
(
"
hide
"
,
""
);
buttonRemoveExercise
.
className
=
buttonRemoveExercise
.
className
.
replace
(
"
hide
"
,
""
);
okWorkoutButton
.
addEventListener
(
"
click
"
,
async
()
=>
await
createWorkout
());
cancelWorkoutButton
.
addEventListener
(
"
click
"
,
handleCancelDuringWorkoutCreate
);
divCommentRow
.
className
+=
"
hide
"
;
}
}
}
else
{
await
createBlankExercise
();
let
ownerInput
=
document
.
querySelector
(
"
#inputOwner
"
);
ownerInput
.
value
=
currentUser
.
username
;
setReadOnly
(
false
,
"
#form-workout
"
);
ownerInput
.
readOnly
=
!
ownerInput
.
readOnly
;
});
okWorkoutButton
.
className
=
okWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
\ No newline at end of file
cancelWorkoutButton
.
className
=
cancelWorkoutButton
.
className
.
replace
(
"
hide
"
,
""
);
buttonAddExercise
.
className
=
buttonAddExercise
.
className
.
replace
(
"
hide
"
,
""
);
buttonRemoveExercise
.
className
=
buttonRemoveExercise
.
className
.
replace
(
"
hide
"
,
""
);
okWorkoutButton
.
addEventListener
(
"
click
"
,
async
()
=>
await
createWorkout
()
);
cancelWorkoutButton
.
addEventListener
(
"
click
"
,
handleCancelDuringWorkoutCreate
);
divCommentRow
.
className
+=
"
hide
"
;
}
});
This diff is collapsed.
Click to expand it.
frontend/www/workout.html
+
36
−
17
View file @
9bd5e066
...
@@ -11,6 +11,14 @@
...
@@ -11,6 +11,14 @@
integrity=
"sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1"
integrity=
"sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1"
crossorigin=
"anonymous"
crossorigin=
"anonymous"
/>
/>
<script
src=
"scripts/defaults.js"
></script>
<script
src=
"scripts/scripts.js"
></script>
<script
type=
"text/javascript"
src=
"scripts/workout.js"
></script>
<script
src=
"https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
integrity=
"sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
crossorigin=
"anonymous"
></script>
<script
<script
src=
"https://kit.fontawesome.com/0ce6c392ca.js"
src=
"https://kit.fontawesome.com/0ce6c392ca.js"
...
@@ -52,15 +60,34 @@
...
@@ -52,15 +60,34 @@
</div>
</div>
<div
class=
"col-lg-6"
></div>
<div
class=
"col-lg-6"
></div>
<div
class=
"col-lg-6"
>
<div
class=
"col-lg-6"
>
<label
for=
"inputOwner"
class=
"form-label"
>
Owner
</label>
<label
for=
"forAthlete"
>
Create workout for athlete
</label>
<input
<input
id=
"forAthlete"
type=
"checkbox"
onclick=
"athleteChecked()"
/>
type=
"text"
<div
class=
"col-lg-6"
></div>
class=
"form-control"
<p>
Owner
</p>
id=
"inputOwner"
name=
"owner_username"
<div>
readonly
<select
/>
id=
"athletes"
class=
"form-select"
name=
"athletes"
style=
"display:none"
>
<option
value=
"1"
>
athlete 1
</option>
<option
value=
"2"
>
athlete 2
</option>
<option
value=
"3"
>
athlete 3
</option>
</select>
<input
type=
"text"
class=
"form-control"
id=
"inputOwner"
name=
"owner_username"
style=
"display:block"
readonly
/>
</div>
</div>
</div>
<div
class=
"col-lg-6"
></div>
<div
class=
"col-lg-6"
>
<div
class=
"col-lg-6"
>
<label
for=
"inputVisibility"
class=
"form-label"
>
Visibility
</label>
<label
for=
"inputVisibility"
class=
"form-label"
>
Visibility
</label>
<select
<select
...
@@ -74,6 +101,7 @@
...
@@ -74,6 +101,7 @@
<option
value=
"PR"
>
Private
</option>
<option
value=
"PR"
>
Private
</option>
</select>
</select>
</div>
</div>
<div
class=
"col-lg-6"
></div>
<div
class=
"col-lg-6"
>
<div
class=
"col-lg-6"
>
<label
for=
"inputNotes"
class=
"form-label"
>
Notes
</label>
<label
for=
"inputNotes"
class=
"form-label"
>
Notes
</label>
<textarea
<textarea
...
@@ -197,14 +225,5 @@
...
@@ -197,14 +225,5 @@
<div
class=
"col-lg-6"
></div>
<div
class=
"col-lg-6"
></div>
</div>
</div>
</template>
</template>
<script
src=
"scripts/defaults.js"
></script>
<script
src=
"scripts/scripts.js"
></script>
<script
src=
"scripts/workout.js"
></script>
<script
src=
"https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
integrity=
"sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
crossorigin=
"anonymous"
></script>
</body>
</body>
</html>
</html>
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment