function showDocumentUploadDialog(target = null, append_to_url = null, after_upload = null) { let file = null const cmsg = new CMessageBox({ title: tr("document_uploading_in_general"), body: ` ${tr("limits")}
`, buttons: [tr('close')], callbacks: [Function.noop], unique_name: "doc_upload_dialog", }) cmsg.getNode().find('.ovk-diag-body').attr('style', "padding:15px;") cmsg.getNode().attr('style', "width: 400px;") cmsg.getNode().find('#upload_btn').on('change', (e) => { file = e.target.files[0] const name = file.name const format = name.split(".")[name.split(".").length - 1] if(window.openvk.docs_allowed.indexOf(format.toLowerCase()) == -1) { makeError(tr("error_file_invalid_format")) return } if(file.size > window.openvk.docs_max * 1024 * 1024) { makeError(tr("error_file_too_big")) return } cmsg.close() const cmsg_2 = new CMessageBox({ title: tr("document_uploading_in_general"), body: `

${tr("info_name")}


${tr("tags")}


`, buttons: [tr('upload_button'), tr('cancel')], callbacks: [async () => { const fd = new FormData fd.append("name", u(`input[name="doc_name"]`).nodes[0].value) fd.append("tags", u(`input[name="doc_tags"]`).nodes[0].value) fd.append("folder", u(`input[name="doc_access"]:checked`).nodes[0].value) fd.append("owner_hidden", u(`input[name="doc_owner"]`).nodes[0].checked ? "on" : "off") fd.append("blob", file) fd.append("ajax", 1) fd.append("hash", window.router.csrf) const endpoint_url = `/docs/upload` + (!isNaN(append_to_url) ? "?gid="+append_to_url : '') const fetcher = await fetch(endpoint_url, { method: 'POST', body: fd, }) const json = await fetcher.json() if(json.success) { if(target != "search") { window.router.route(location.href) } else { if(after_upload) after_upload() } } else { fastError(escapeHtml(json.flash.message)) } }, Function.noop], }) cmsg_2.getNode().find('.ovk-diag-body').attr('style', "padding:15px;") cmsg_2.getNode().attr('style', "width: 400px;") }) } u(document).on("drop", "#_document_upload_frame", (e) => { e.dataTransfer.dropEffect = 'move'; e.preventDefault() u(`#_document_upload_frame #upload_btn`).nodes[0].files = e.dataTransfer.files u("#_document_upload_frame #upload_btn").trigger("change") }) u(document).on('click', '.docMainItem #edit_icon', async (e) => { e.preventDefault() if(u("#ajloader").hasClass("shown")) { return } const target = u(e.target).closest("#edit_icon") const item = target.closest('.docMainItem') const id = item.nodes[0].dataset.id CMessageBox.toggleLoader() const docs = await window.OVKAPI.call('docs.getById', {docs: id, return_tags: 1}) const doc = docs[0] if(!doc) { fastError("(") CMessageBox.toggleLoader() return } const cmsg_2 = new CMessageBox({ unique_name: "document_edit_modal", title: tr("document_editing_in_general"), body: `

${tr("info_name")}


${tr("tags")}


`, buttons: [tr('save'), tr('cancel')], callbacks: [async () => { const params = { owner_id: id.split('_')[0], doc_id: id.split('_')[1], title: u(`input[name='doc_name']`).nodes[0].value, tags: u(`input[name='doc_tags']`).nodes[0].value, folder_id: u(`input[name="doc_access"]:checked`).nodes[0].value, owner_hidden: u(`input[name="doc_owner"]`).nodes[0].checked ? 1 : 0, } const edit = await window.OVKAPI.call('docs.edit', params) if(edit == 1) { item.find('.doc_content .doc_name').html(escapeHtml(params.title)) item.find('.doc_content .doc_tags').html(escapeHtml(params.tags)) } }, Function.noop], }) cmsg_2.getNode().find('.ovk-diag-body').attr('style', "padding:15px;") cmsg_2.getNode().attr('style', "width: 400px;") CMessageBox.toggleLoader() }) u(document).on('click', '#upload_entry_point', (e) => { showDocumentUploadDialog(null, Number(e.target.dataset.gid)) }) u(document).on('change', "#docs_page_wrapper select[name='docs_sort']", (e) => { const new_url = new URL(location.href) new_url.searchParams.set('order', e.target.value) window.router.route(new_url.href) }) u(document).on('click', '.docMainItem #remove_icon', async (e) => { e.preventDefault() const target = u(e.target).closest("#remove_icon") const item = target.closest('.docMainItem') const context = item.attr('data-context') const id = item.nodes[0].dataset.id.split("_") target.addClass('lagged') const res = await window.OVKAPI.call('docs.delete', {owner_id: id[0], doc_id: id[1]}) target.removeClass('lagged') if(res == 1) { target.attr('id', 'mark_icon') if(context == "page") { target.html('✓') window.router.route('/docs') } } }) u(document).on('click', '.docMainItem #add_icon', async (e) => { e.preventDefault() const target = u(e.target).closest("#add_icon") const item = target.closest('.docMainItem') const id = item.nodes[0].dataset.id.split("_") const context = item.attr('data-context') target.addClass('lagged') try { const res = await window.OVKAPI.call('docs.add', {owner_id: id[0], doc_id: id[1], access_key: id[2]}) } catch(e) { makeError(tr("error_file_adding_copied")) target.removeClass('lagged') return } target.removeClass('lagged') target.attr('id', 'mark_icon') if(context == "page") { target.html('✓') } }) u(document).on('click', '.docMainItem #report_icon', (e) => { e.preventDefault() const target = u(e.target).closest("#report_icon") const item = target.closest('.docMainItem') const id = item.nodes[0].dataset.id.split("_") MessageBox(tr("report_question"), ` ${tr("going_to_report_doc")}
${tr("report_question_text")}

${tr("report_reason")}: `, [tr("confirm_m"), tr("cancel")], [(function() { res = document.querySelector("#uReportMsgInput").value; xhr = new XMLHttpRequest(); xhr.open("GET", "/report/" + id[1] + "?reason=" + res + "&type=doc", true); xhr.onload = (function() { if(xhr.responseText.indexOf("reason") === -1) MessageBox(tr("error"), tr("error_sending_report"), ["OK"], [Function.noop]); else MessageBox(tr("action_successfully"), tr("will_be_watched"), ["OK"], [Function.noop]); }); xhr.send(null) }), Function.noop]) }) u(document).on("click", ".docListViewItem a.viewerOpener, a.docGalleryItem", async (e) => { e.preventDefault() if(e.target.closest('.doc_volume_action')) { return } if(window.openvk.current_id == 0) { return } const target = u(e.target) const link = target.closest('a') if(target.closest(".embeddable").length > 0) { target.closest(".embeddable").toggleClass("playing") return } CMessageBox.toggleLoader() const url = link.nodes[0].href const request = await fetch(url) const body_html = await request.text() const parser = new DOMParser const body = parser.parseFromString(body_html, "text/html") const preview = body.querySelector('.photo-page-wrapper-photo') const details = body.querySelector('.ovk-photo-details') u(preview.querySelector('img')).attr('id', 'ovk-photo-img') const photo_viewer = new CMessageBox({ title: '', custom_template: u(`
${tr("document")}
${tr("close")}
${preview.innerHTML}
${details.innerHTML}
`) }) photo_viewer.getNode().find("#ovk-photo-close").on("click", function(e) { photo_viewer.close() }); CMessageBox.toggleLoader() }) // ctx > "wall" and maybe "messages" in future // source > "user" || "club" > source_arg async function __docAttachment(form, ctx = "wall", source = "user", source_arg = 0) { const per_page = 10 const msg = new CMessageBox({ title: tr('select_doc'), custom_template: u(`
${tr("select_doc")} ${source != "user" ? `${tr("go_to_my_documents")}`: ""} ${tr("upload_button")}
${tr("close")}
`), }) msg.getNode().find(".ovk-photo-view").attr('style', 'width: 400px;min-height:90vh;') msg.getNode().find('.ovk-diag-body').attr('style', 'height:335px;padding:0px;') docs_reciever = new class { ctx = "my" ctx_id = 0 stat = { page: 0, pagesCount: 0, count: 0, } clean() { this.stat = { page: 0, pagesCount: 0, count: 0, } u('#gif_loader, #_attachment_insert #show_more').remove() u("#_attachment_insert .docsInsert").html("") } async page(page = 1, perPage = 10) { u('#_attachment_insert').append(`
`) const fd = new FormData fd.append("context", "list") fd.append("hash", window.router.csrf) let url = `/docs${source == "club" ? source_arg : ""}?picker=1&p=${page}` if(this.query) { fd.append("context", "search") fd.append("ctx_query", this.query) } const req = await fetch(url, { method: "POST", body: fd }) const res = await req.text() const dom = new DOMParser const pre = dom.parseFromString(res, "text/html") const pagesCount = Number(pre.querySelector("input[name='pagesCount']").value) const count = Number(pre.querySelector("input[name='count']").value) if(count < 1) { u('#_attachment_insert .docsInsert').append(`
  ${tr("no_documents")}.
`) } pre.querySelectorAll("._content").forEach(doc => { const res = u(`${doc.outerHTML}`) const id = res.attr("data-attachmentdata") res.find(".docMainItem").attr("style", "width: 85%;") res.append(`
${this.isDocAttached(id) ? tr("detach") : tr("attach")}
`) u('#_attachment_insert .docsInsert').append(res) }) this.stat.page = page this.stat.pagesCount = pagesCount this.stat.count = count u('#gif_loader').remove() this.showMore() } async search(query_string) { this.clean() if(query_string == "") this.query = null else this.query = query_string await this.page(1) } showMore() { if(this.stat.page < this.stat.pagesCount) { u('#_attachment_insert').append(`
${tr('show_more')}
`) } } maxAttachmentsCheck() { if(u(form).find(`.upload-item`).length > window.openvk.max_attachments) { makeError(tr('too_many_attachments'), 'Red', 10000, 1) return true } return false } attach(dataset, button) { if(this.isDocAttached(dataset.attachmentdata)) { (form.find(`.upload-item[data-type='doc'][data-id='${dataset.attachmentdata}']`)).remove() button.html(tr('attach')) } else { const _url = dataset.attachmentdata.split("_") button.html(tr('detach')) form.find('.post-vertical').append(`
`) } } isDocAttached(attachmentdata) { return (form.find(`.upload-item[data-type='doc'][data-id='${attachmentdata}']`)).length > 0 } } msg.getNode().find("#ovk-photo-close").on("click", function(e) { msg.close() }) msg.getNode().on("click", "#__attach_doc", async (ev) => { if(docs_reciever.maxAttachmentsCheck() == true) { return } const target = u(ev.target).closest('._content') const button = target.find('#__attach_doc') const dataset = target.nodes[0].dataset docs_reciever.attach(dataset, button) }) msg.getNode().on("click", "#show_more", async (ev) => { const target = u(ev.target).closest('#show_more') target.addClass('lagged') await docs_reciever.page(docs_reciever.stat.page + 1) target.remove() }) msg.getNode().on("click", "#_doc_picker_go_to_my", async (e) => { msg.close() await __docAttachment(form, "wall") }) msg.getNode().on("click", "#_doc_picker_upload", async (e) => { showDocumentUploadDialog("search", source_arg >= 0 ? NaN : Math.abs(source_arg), () => { docs_reciever.clean() docs_reciever.page(1) }) }) msg.getNode().on("change", ".attachment_search input", async (e) => { await docs_reciever.search(ovk_proc_strtr(e.target.value, 100)) }) await docs_reciever.page(docs_reciever.stat.page + 1) } u(document).on('click', '#__documentAttachment', async (e) => { const form = u(e.target).closest('form') const targ = u(e.target).closest("#__documentAttachment") let entity_source = "user" let entity_id = 0 if(targ.attr('data-club') != null) { entity_source = "club" entity_id = Number(targ.attr('data-club')) } await __docAttachment(form, "wall", entity_source, entity_id) })