Files
term_portal/express/public/javascripts/consultancy.js
T
2022-12-07 04:43:36 +01:00

441 lines
12 KiB
JavaScript

/* global $, handleDomainsClickForConsultancy, inputFieldsChecker, currentPagePath, axios, nthParent, tooltipListWOL, tooltipTriggerList */
/*
author: Miha Stele, 2022
*/
/** selectedID -> ID of the selected Entry */
let selectedID = -1
// consultancy FORM
let offsetMain
function adjustOffsetBy() {
offsetMain = document.querySelector('#offset-main')
const fixedTopSection = document.querySelector('#fixed-top-section')
const referenceHeight = fixedTopSection.offsetHeight
const offsetHeader = document.getElementsByClassName('offset-header')
const offsetHeaderPadding = document.getElementById('offset-padding')
// const adminNavMobile = document.getElementsByClassName('admin-nav')
const headerPadding = document.getElementById('header-padding')
if (document.body.clientWidth < 1200) {
if (offsetHeaderPadding !== null) offsetMain.style.paddingTop = `0px`
} else {
for (let i = 0; i < offsetHeader.length; i++) {
offsetHeader[i].style.paddingTop = `${referenceHeight}px`
}
if (headerPadding !== null) {
const headerPaddingHeight = headerPadding.offsetHeight
offsetMain.style.paddingTop = `${headerPaddingHeight}px`
}
if (offsetHeaderPadding !== null) {
const offsetHeaderHeight = offsetHeaderPadding.offsetHeight
offsetMain.style.paddingTop = `${referenceHeight + offsetHeaderHeight}px`
}
}
}
function event2SelectedId(e) {
return nthParent(e.currentTarget, 4).id.substring(3)
}
window.addEventListener('load', () => {
adjustOffsetBy()
const ce = {}
window.adminElements = ce
/* copy source admin.js in case of refactoring */
if (currentPagePath === '/svetovanje/vprasanje/admin/uporabniki') {
offsetMain.addEventListener('click', handleDomainsClickForConsultancy)
ce.name = document.getElementById('name-input')
if (ce.name) {
ce.name.addEventListener('input', inputFieldsChecker)
}
ce.inputAreaEl = document.getElementById('area-input')
if (ce.inputAreaEl) {
ce.inputAreaEl.addEventListener('input', inputFieldsChecker)
}
}
})
window.addEventListener('resize', () => {
adjustOffsetBy()
// mobileMoveContent()
})
try {
document.querySelector('#consultancy-form').addEventListener('submit', e => {
e.preventDefault()
// window.location.replace('/svetovanje/iskanje')
})
} catch (e) {}
try {
const splitedHref = window.location.href.split('/')
document.querySelectorAll('.edit-button').forEach(e => {
e.addEventListener('click', () => {
window.location.replace(
`/svetovanje/vprasanje/admin/urejanje/${nthParent(e, 4).id.slice(
3
)}?sentFrom=${splitedHref[splitedHref.length - 1]}`
)
})
})
} catch (e) {}
// share.pug
try {
// In your Javascript (external .js resource or <script> tag)
$(document).ready(function () {
$('.share-search-consultants').select2({
dropdownParent: $('#consultancyModalShare')
})
})
} catch (e) {}
// assign.pug
try {
// In your Javascript (external .js resource or <script> tag)
$(document).ready(function () {
$('.assign-search-consultants').select2({
dropdownParent: $('#consultancyModalAssign')
})
})
} catch (e) {}
const summernote = $('.summernote')
if (summernote) {
summernote.summernote({
placeholder: 'Na kratko opišite zasnovo in namen slovarja.',
height: 300,
minheight: 150,
toolbar: [
['style', ['style', 'bold', 'italic', 'underline']],
['font', ['superscript', 'subscript']],
['link', ['linkDialogShow']],
['para', ['ul', 'ol']],
['table', ['table']],
['insert', ['picture']]
],
styleTags: ['p', 'h3', 'h4']
})
}
/*
mixin shareResultsItem(userId, name)
.share-results-item(id=userId)
.row
.col-11
p.mb-0.navigation-text-color.mb0 #{ name }
.col-1
.d-flex.justify-content-end
button.delete-shared-cons.bg-transparent.no-border
img(src="/images/trash-2.svg")
hr.mt-1.mb-1
*/
function buildSharedAuthorListItem(id, name) {
const root = document.createElement('div')
root.className = 'share-results-item'
root.id = id
const row = document.createElement('div')
row.className = 'row'
root.appendChild(row)
const hr = document.createElement('hr')
hr.className = 'mt-1 mb-1'
root.appendChild(hr)
const col11 = document.createElement('div')
col11.className = 'col-11'
row.appendChild(col11)
const col1 = document.createElement('div')
col1.className = 'col-1'
row.appendChild(col1)
const nameEl = document.createElement('p')
nameEl.className = 'mb-0 navigation-text-color mb0'
nameEl.textContent = name
col11.appendChild(nameEl)
const aligner = document.createElement('div')
aligner.className = 'd-flex justify-content-end'
col1.appendChild(aligner)
const btn = document.createElement('btn')
btn.className = 'delete-shared-cons bg-transparent no-border'
aligner.appendChild(btn)
const img = document.createElement('img')
img.src = '/images/trash-2.svg'
btn.appendChild(img)
btn.addEventListener('click', e => {
const element = nthParent(e.currentTarget, 4)
axios
.delete('/api/v1/consultancy/delete-consultant-author', {
data: {
question_id: selectedID,
user_id: element.id
}
})
.then(() => {
element.remove()
})
})
root.appendChild(row)
return root
}
const assignModalBtns = document.querySelectorAll('.consultancy-modal-assign')
// assign button logic NOTE you can only have assignBtn when you have
// assign buttons (one or more) that trigger the assign modal (assignModalBtns)
// otherwise they're useless
if (assignModalBtns.length > 0) {
// let modalQuestionBatteryId = -1
assignModalBtns.forEach(assignButton => {
assignButton.addEventListener('click', e => {
$('#consultancyModalAssign').modal('toggle')
selectedID = parseInt(event2SelectedId(e))
})
})
const assignBtn = document.querySelector('#assign-btn')
if (assignBtn) {
assignBtn.addEventListener('click', e => {
// TODO, assign the question to the in progress section if you are consultancy admin or portal admin
const userId = document.querySelector('#assign-sel').value
if (userId !== 'NONE_SELECTED_PLACEHOLDER') {
axios
.put('/api/v1/consultancy/assign', {
question_id: selectedID,
user_id: document.querySelector('#assign-sel').value
})
.then(() => {
window.location.href += ''
})
} else {
console.log('Please select different username')
}
})
}
}
const shareButtons = document.querySelectorAll('.consultancy-modal-share')
if (shareButtons.length > 0) {
document.querySelector('#add-shared-author').addEventListener('click', () => {
axios
.post('/api/v1/consultancy/add-non-moderator', {
question_id: selectedID,
user_id: document.querySelector('#share-sel').value
})
.then(e => {
const sel = document.querySelector('#share-sel')
document
.querySelector('.share-results-container')
.appendChild(
buildSharedAuthorListItem(
selectedID,
sel.options[sel.selectedIndex].text
)
)
})
})
document.querySelector('#close-shared').addEventListener('click', () => {
window.location.href += ''
})
shareButtons.forEach(assignButton => {
assignButton.addEventListener('click', e => {
selectedID = parseInt(event2SelectedId(e))
axios
.get(`/api/v1/consultancy/get-shared-authors?id=${selectedID}`)
.then(res => {
const rootCont = document.querySelector('.share-results-container')
rootCont.innerHTML = ''
const authors = res.data
authors.forEach(author => {
rootCont.appendChild(
buildSharedAuthorListItem(
author.user_id,
`${author.first_name} ${author.last_name} (${author.username})`
)
)
})
})
$('#consultancyModalShare').modal('toggle')
})
})
}
const rejectButtons = document.querySelectorAll('.reject-item')
if (rejectButtons.length > 0) {
rejectButtons.forEach(rejectButton => {
rejectButton.addEventListener('click', e => {
selectedID = parseInt(event2SelectedId(e))
// $('#alert-modal').modal('toggle')
axios
.put('/api/v1/consultancy/reject', {
question_id: selectedID
})
.then(() => {
window.location.href += ''
})
})
})
}
const deleteButtons = document.querySelectorAll('.delete-item')
if (deleteButtons.length > 0) {
document.querySelector('#del-btn').addEventListener('click', e => {
axios
.delete('/api/v1/consultancy/delete', {
data: { id: selectedID }
})
.then(() => {
window.location.href += ''
})
})
deleteButtons.forEach(assignButton => {
assignButton.addEventListener('click', e => {
selectedID = parseInt(event2SelectedId(e))
$('#deleteModal').modal('toggle')
})
})
}
const reviewBtns = document.querySelectorAll('.review-btn')
if (reviewBtns.length > 0) {
reviewBtns.forEach(reviewBtn => {
reviewBtn.addEventListener('click', e => {
selectedID = parseInt(event2SelectedId(e))
axios
.put('/api/v1/consultancy/review', {
question_id: selectedID
})
.then(() => {
window.location.href += ''
})
})
})
}
const publishBtns = document.querySelectorAll('.publish-btn')
if (publishBtns.length > 0) {
publishBtns.forEach(publishBtn => {
publishBtn.addEventListener('click', e => {
selectedID = parseInt(event2SelectedId(e))
const answerAuthorsWithComma =
document.getElementById('moderatorName').innerText +
',' +
(nthParent(
e.currentTarget,
3
).childNodes[0].childNodes[0].childNodes[4].getAttribute(
'data-tooltip-content'
) ?? ',')
axios
.put('/api/v1/consultancy/publish', {
question_id: selectedID,
answer_authors: answerAuthorsWithComma.slice(0, -1)
})
.then(() => {
window.location.href += ''
})
})
})
}
// Share authors boilerplate code
/// // SUBMIT FUNCTIONS
const createAnswerForm = document.querySelector('#create-consultancy-question')
if (createAnswerForm) {
async function onCreateAnswerSubmit(event) {
event.preventDefault()
if (createAnswerForm && !createAnswerForm.checkValidity()) {
event.stopPropagation()
createAnswerForm.classList.add('was-validated')
return
}
const payload = Object.fromEntries(new FormData(event.target))
const res = await axios.post(event.target.action, payload)
// const data = res.data
// console.log(data)
if (res.status === 201) {
window.location.href = '/svetovanje'
}
}
createAnswerForm.addEventListener('submit', onCreateAnswerSubmit)
}
const insertConsultantForm = document.querySelector('#insert-consultant')
if (insertConsultantForm) {
insertConsultantForm.addEventListener('submit', e => {
e.preventDefault()
const url = e.currentTarget.action
const username = document.querySelector('#username').value
const domains = document.querySelector('#domains').value
axios
.post(url, {
username: username,
domains: domains
})
.then(result => {
console.log(result)
window.location.href = '/svetovanje/vprasanje/admin/uporabniki'
})
})
}
try {
if (tooltipTriggerList.length > 0) {
// initialize tooltips
tooltipListWOL('author-list-tooltip') // ADD for tooltip debug in the end -> [0].show()
}
} catch (e) {
console.log(e)
}
/*
if (tooltipList) {
console.log(tooltipList)
tooltipList.forEach(ptl => {
console.log(ptl)
})
}
*/
// focus required field section
$(document).ready(() => {
const focused = $('#description')
if (focused) {
focused.focus()
}
})