152 lines
4.3 KiB
HTML
152 lines
4.3 KiB
HTML
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
|
|
|
|
<input type="hidden" id="awardTarget" value="" />
|
|
<div class="modal fade" id="awardModal" tabindex="-1" role="dialog" aria-labelledby="awardModalTitle" aria-hidden="true">
|
|
<div class="modal-dialog modal-dialog-scrollable modal-dialog-centered" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Give Award</h5>
|
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
<span aria-hidden="true"><i class="far fa-times"></i></span>
|
|
</button>
|
|
</div>
|
|
<div id="awardModalBody" class="modal-body">
|
|
<form v-if="loaded" id="sex" class="pt-3 pb-0">
|
|
<div class="card-columns awards-wrapper">
|
|
<div v-for="(award, index) in awards" :key="index">
|
|
<input type="radio" :id="index" :value="index" v-model="picked" :disabled="award.owned < 1">
|
|
<label class="card" :for="index" :class="{ disabled: award.owned < 1 }">
|
|
<i :class="award.icon+' '+award.color"></i><br />
|
|
<span class="d-block pt-2" style="font-weight: bold; font-size: 14px;">[[ award.title ]]</span>
|
|
<span class="text-muted">[[ award.owned ]] owned</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div v-if="picked !== null">
|
|
<div class="award-desc p-3">
|
|
<i style="font-size: 35px;" :class="pickedAward.icon+' '+pickedAward.color"></i>
|
|
<div style="margin-left: 15px;">
|
|
<strong>[[ pickedAward.title ]] Award</strong><br />
|
|
<span class="text-muted">[[ pickedAward.description ]]</span>
|
|
</div>
|
|
</div>
|
|
<label for="note" class="pt-4">Note (optional):</label>
|
|
<textarea id="note" name="note" v-model="note" class="form-control" placeholder="Note to include in award notification"></textarea>
|
|
</div>
|
|
</form>
|
|
<div v-else-if="error" class="p-5 text-center">
|
|
<h4>Failed to fetch awards</h4>
|
|
<button class="btn btn-primary">Retry</button>
|
|
</div>
|
|
<div v-else class="p-5 text-center">
|
|
<h4>Loading...</h4>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-link text-muted" data-dismiss="modal">Cancel</button>
|
|
<button v-if="pending" class="btn btn-warning" type="button" disabled>
|
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
|
Gifting...
|
|
</button>
|
|
<button v-else type="submit" class="btn btn-warning" id="awardButton" @click="submit" :disabled="pickedAward === null">Give Award</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<style>
|
|
.awards-wrapper input[type="radio"] {
|
|
display: none;
|
|
}
|
|
|
|
.awards-wrapper label {
|
|
cursor: pointer;
|
|
padding: 15px;
|
|
text-align: center;
|
|
text-transform: none!important;
|
|
}
|
|
|
|
.awards-wrapper label i {
|
|
font-size: 45px;
|
|
}
|
|
|
|
.awards-wrapper label.disabled {
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.awards-wrapper label:hover {
|
|
/*background-color: rgba(173, 226, 255, 0.7)!important;*/
|
|
background-color: var(--primary)!important;
|
|
background-opacity: 0.4;
|
|
}
|
|
|
|
.awards-wrapper input[type="radio"]:checked+label {
|
|
/*background-color: rgba(173, 226, 255, 0.9)!important;*/
|
|
background-color: var(--primary)!important;
|
|
background-opacity: 0.9;
|
|
}
|
|
|
|
.award-desc {
|
|
border-radius: 5px;
|
|
background-color: rgba(221, 221, 221, 0.23);
|
|
display: flex;
|
|
}
|
|
</style>
|
|
|
|
<script>
|
|
new Vue({
|
|
el: "#awardModal",
|
|
delimiters: ['[[', ']]'],
|
|
data: {
|
|
loaded: false,
|
|
error: false,
|
|
pending: false,
|
|
awards: [],
|
|
picked: null,
|
|
note: ""
|
|
},
|
|
computed: {
|
|
pickedAward: function() {
|
|
if (this.picked !== null) {
|
|
return this.awards[this.picked];
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
async submit() {
|
|
this.pending = true;
|
|
|
|
const target = document.getElementById("awardTarget").value;
|
|
|
|
const f = new FormData();
|
|
f.append("formkey", formkey());
|
|
f.append("kind", this.pickedAward.kind || "");
|
|
f.append("note", this.note)
|
|
|
|
let response = await fetch(target, {
|
|
method: "PUT",
|
|
body: f
|
|
});
|
|
|
|
if (response.ok) {
|
|
location.reload();
|
|
} else {
|
|
this.pending = false;
|
|
let s = await response.json();
|
|
alert(s.error);
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
fetch('/awards')
|
|
.then(response => response.json())
|
|
.then(json => {
|
|
this.awards = json;
|
|
});
|
|
|
|
this.loaded = true;
|
|
}
|
|
})
|
|
</script> |