Bug fixes and feature update

added article publication logic
This commit is contained in:
sairaj mote 2021-12-14 23:35:33 +05:30
parent eb29f04103
commit b61adfc188
4 changed files with 212 additions and 181 deletions

View File

@ -101,7 +101,7 @@ button,
.button { .button {
white-space: nowrap; white-space: nowrap;
padding: 0.6rem 1rem; padding: 0.5rem 0.8rem;
border-radius: 0.3rem; border-radius: 0.3rem;
background-color: rgba(var(--text-color), 0.06); background-color: rgba(var(--text-color), 0.06);
color: rgba(var(--text-color), 0.8); color: rgba(var(--text-color), 0.8);
@ -114,6 +114,11 @@ button,
color: rgba(var(--background-color), 1); color: rgba(var(--background-color), 1);
} }
.icon-only {
padding: 0.5rem;
border-radius: 0.3rem;
}
button:disabled { button:disabled {
opacity: 0.5; opacity: 0.5;
} }
@ -137,7 +142,7 @@ sm-textarea {
} }
sm-button { sm-button {
--padding: 0.6rem 0.8rem; --padding: 0.5rem 0.8rem;
-webkit-transition: -webkit-transform 0.3s; -webkit-transition: -webkit-transform 0.3s;
transition: -webkit-transform 0.3s; transition: -webkit-transform 0.3s;
transition: transform 0.3s; transition: transform 0.3s;
@ -224,10 +229,6 @@ ul {
display: grid; display: grid;
} }
.grid-3 {
grid-template-columns: 1fr auto auto;
}
.flow-column { .flow-column {
grid-auto-flow: column; grid-auto-flow: column;
} }
@ -513,6 +514,8 @@ menu-option {
} }
#main_header { #main_header {
position: sticky;
top: 0;
display: grid; display: grid;
gap: 1rem; gap: 1rem;
padding: 1rem; padding: 1rem;
@ -975,23 +978,22 @@ menu-option {
} }
@media screen and (max-width: 40rem) { @media screen and (max-width: 40rem) {
sm-button {
--padding: 0.9rem 1.6rem;
}
#article_name_wrapper, #article_name_wrapper,
#selected_content_options { #selected_content_options {
grid-row: 2/3; grid-row: 2/3;
grid-column: 1/-1; grid-column: 1/-1;
-webkit-box-pack: start;
-ms-flex-pack: start;
justify-content: flex-start;
} }
#article_name_wrapper sm-menu, #article_name_wrapper sm-menu,
#selected_content_options sm-menu { #selected_content_options sm-menu {
margin-left: auto; margin-left: auto;
} }
#article_name_wrapper {
-webkit-box-pack: start;
-ms-flex-pack: start;
justify-content: flex-start;
}
.hide-on-mobile { .hide-on-mobile {
display: none; display: none;
} }

2
css/main.min.css vendored

File diff suppressed because one or more lines are too long

View File

@ -92,7 +92,7 @@ button,
} }
.button { .button {
white-space: nowrap; white-space: nowrap;
padding: 0.6rem 1rem; padding: 0.5rem 0.8rem;
border-radius: 0.3rem; border-radius: 0.3rem;
background-color: rgba(var(--text-color), 0.06); background-color: rgba(var(--text-color), 0.06);
color: rgba(var(--text-color), 0.8); color: rgba(var(--text-color), 0.8);
@ -102,6 +102,10 @@ button,
color: rgba(var(--background-color), 1); color: rgba(var(--background-color), 1);
} }
} }
.icon-only{
padding: 0.5rem;
border-radius: 0.3rem;
}
button:disabled { button:disabled {
opacity: 0.5; opacity: 0.5;
@ -117,7 +121,7 @@ sm-textarea {
--border-radius: 0.3rem; --border-radius: 0.3rem;
} }
sm-button { sm-button {
--padding: 0.6rem 0.8rem; --padding: 0.5rem 0.8rem;
transition: transform 0.3s; transition: transform 0.3s;
&[variant="primary"] { &[variant="primary"] {
.icon { .icon {
@ -203,11 +207,6 @@ ul {
.grid { .grid {
display: grid; display: grid;
} }
.grid-3 {
grid-template-columns: 1fr auto auto;
}
.flow-column { .flow-column {
grid-auto-flow: column; grid-auto-flow: column;
} }
@ -448,6 +447,8 @@ menu-option {
} }
#main_header { #main_header {
position: sticky;
top: 0;
display: grid; display: grid;
gap: 1rem; gap: 1rem;
padding: 1rem; padding: 1rem;
@ -849,18 +850,17 @@ menu-option {
} }
@media screen and (max-width: 40rem) { @media screen and (max-width: 40rem) {
sm-button {
--padding: 0.9rem 1.6rem;
}
#article_name_wrapper, #article_name_wrapper,
#selected_content_options { #selected_content_options {
grid-row: 2/3; grid-row: 2/3;
grid-column: 1/-1; grid-column: 1/-1;
justify-content: flex-start;
sm-menu { sm-menu {
margin-left: auto; margin-left: auto;
} }
} }
#article_name_wrapper{
justify-content: flex-start;
}
.hide-on-mobile { .hide-on-mobile {
display: none; display: none;
} }

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CC</title> <title>Content Collaboration</title>
<script src="components.js" defer></script> <script src="components.js" defer></script>
<link rel="stylesheet" href="css/main.min.css"> <link rel="stylesheet" href="css/main.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
@ -70,12 +70,11 @@
d="M14 16.591C16.2349 15.7182 17.8182 13.544 17.8182 11C17.8182 8.45602 16.2349 6.28183 14 5.40903C14.6762 5.14494 15.4121 5 16.1818 5C19.4955 5 22.1818 7.68629 22.1818 11C22.1818 14.3137 19.4955 17 16.1818 17C15.4121 17 14.6762 16.8551 14 16.591Z" /> d="M14 16.591C16.2349 15.7182 17.8182 13.544 17.8182 11C17.8182 8.45602 16.2349 6.28183 14 5.40903C14.6762 5.14494 15.4121 5 16.1818 5C19.4955 5 22.1818 7.68629 22.1818 11C22.1818 14.3137 19.4955 17 16.1818 17C15.4121 17 14.6762 16.8551 14 16.591Z" />
</svg> </svg>
<div class="grid"> <div class="grid">
<span class="label">RanchiMall</span> <h4>RanchiMall CC</h4>
<h4>Content Collaboration</h4>
</div> </div>
</div> </div>
<div id="article_name_wrapper" class="flex gap-0-5 align-center justify-center"> <div id="article_name_wrapper" class="flex gap-0-5 align-center justify-center">
<button title="Show all articles list" onclick="showPopup('article_list_popup')"> <button class="icon-only" title="Show all articles list" onclick="showPopup('article_list_popup')">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" <svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000"> fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none" /> <path d="M0 0h24v24H0V0z" fill="none" />
@ -84,15 +83,14 @@
</svg> </svg>
</button> </button>
<text-field id="current_article_title"></text-field> <text-field id="current_article_title"></text-field>
<button class="button" onclick="toggleFilterPanel()"> <button class="icon-only" title="Show filters" onclick="toggleFilterPanel()">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" height="24px" <svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
viewBox="0 0 24 24" width="24px" fill="#000000"> fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none" /> <path d="M0 0h24v24H0V0z" fill="none" />
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z" /> <path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z" />
</svg> </svg>
Filters
</button> </button>
<sm-menu align-options="right"> <sm-menu align-options="right" title="Admin options">
<menu-option onclick="showPopup('create_article_popup')"> <menu-option onclick="showPopup('create_article_popup')">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" height="24px" <svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" height="24px"
viewBox="0 0 24 24" width="24px" fill="#000000"> viewBox="0 0 24 24" width="24px" fill="#000000">
@ -127,7 +125,16 @@
</menu-option> </menu-option>
</sm-menu> </sm-menu>
</div> </div>
<div id="selected_content_options" class="flex hide-completely"> <div id="selected_content_options" class="flex space-between hide-completely">
<button onclick="clearSelection()" title="Clear selection">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" height="24px"
viewBox="0 0 24 24" width="24px" fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none" />
<path
d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />
</svg>
<div id="selected_entries_no"></div>
</button>
<button class="button" onclick="renderPreview()"> <button class="button" onclick="renderPreview()">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" <svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg"
enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000">
@ -181,14 +188,14 @@
d="M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z" /> d="M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z" />
</svg> </svg>
</button> </button>
<button class="formatting-button" title="Add quote" onclick="insertBlockquote()"> <!-- <button class="formatting-button" title="Add quote" onclick="insertBlockquote()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" <svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000"> fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none" /> <path d="M0 0h24v24H0V0z" fill="none" />
<path <path
d="M18.62 18h-5.24l2-4H13V6h8v7.24L18.62 18zm-2-2h.76L19 12.76V8h-4v4h3.62l-2 4zm-8 2H3.38l2-4H3V6h8v7.24L8.62 18zm-2-2h.76L9 12.76V8H5v4h3.62l-2 4z" /> d="M18.62 18h-5.24l2-4H13V6h8v7.24L18.62 18zm-2-2h.76L19 12.76V8h-4v4h3.62l-2 4zm-8 2H3.38l2-4H3V6h8v7.24L8.62 18zm-2-2h.76L9 12.76V8H5v4h3.62l-2 4z" />
</svg> </svg>
</button> </button> -->
</div> </div>
<div id="article_wrapper"></div> <div id="article_wrapper"></div>
<aside id="version_history_panel" class="flex direction-column hide-completely"> <aside id="version_history_panel" class="flex direction-column hide-completely">
@ -227,50 +234,11 @@
Preview Preview
</button> </button>
</div> </div>
<div class="flex align-center gap-0-5"> <div id="preview_options" class="flex align-center gap-0-5"></div>
<sm-button variant="primary">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" height="24px"
viewBox="0 0 24 24" width="24px" fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M5 4h14v2H5zm0 10h4v6h6v-6h4l-7-7-7 7zm8-2v6h-2v-6H9.83L12 9.83 14.17 12H13z" />
</svg>
Publish
</sm-button>
<sm-menu align-options="right">
<menu-option onclick="exportSelection()">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg"
enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000">
<g>
<rect fill="none" height="24" width="24" />
</g>
<g>
<path
d="M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z" />
</g>
</svg>
Download as HTML
</menu-option>
<menu-option onclick="sharePreview()">
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg"
enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000">
<g>
<rect fill="none" height="24" width="24" />
</g>
<g>
<path
d="M16,5l-1.42,1.42l-1.59-1.59V16h-1.98V4.83L9.42,6.42L8,5l4-4L16,5z M20,10v11c0,1.1-0.9,2-2,2H6c-1.11,0-2-0.9-2-2V10 c0-1.11,0.89-2,2-2h3v2H6v11h12V10h-3V8h3C19.1,8,20,8.89,20,10z" />
</g>
</svg>
Share preview
</menu-option>
</sm-menu>
</div>
</div> </div>
<h1 id="preview__title" class="article__title"></h1> <h1 id="preview__title" class="article__title"></h1>
</header> </header>
<div id="preview__body"></div> <main id="preview__body"></main>
</article> </article>
<sm-popup id="article_list_popup"> <sm-popup id="article_list_popup">
<header slot="header" class="popup__header"> <header slot="header" class="popup__header">
@ -810,6 +778,7 @@
case 'preview': case 'preview':
case 'preview_page': case 'preview_page':
if (params.uid) { if (params.uid) {
getRef('preview__title').textContent = floGlobals.appObjects.cc.articleList[params.articleID].title
getRef('preview__body').innerHTML = floGlobals.appObjects[params.articleID].preview.content getRef('preview__body').innerHTML = floGlobals.appObjects[params.articleID].preview.content
} }
targetPage = 'preview_page' targetPage = 'preview_page'
@ -1234,6 +1203,7 @@
easing: 'ease', easing: 'ease',
} }
const selectedContentSize = selectedContent.size const selectedContentSize = selectedContent.size
getRef('selected_entries_no').textContent = `${selectedContentSize} selected`
if (selectedContentSize === 1 && !isContentSelected) { if (selectedContentSize === 1 && !isContentSelected) {
getRef('article_name_wrapper').classList.remove('hide-completely') getRef('article_name_wrapper').classList.remove('hide-completely')
getRef('selected_content_options').classList.add('hide-completely') getRef('selected_content_options').classList.add('hide-completely')
@ -1257,6 +1227,7 @@
} }
} }
}) })
function formatSelectedContent() { function formatSelectedContent() {
const composedDocumentStructure = {} const composedDocumentStructure = {}
floGlobals.appObjects[currentArticle.id].sections.forEach(section => composedDocumentStructure[section.id] = []) floGlobals.appObjects[currentArticle.id].sections.forEach(section => composedDocumentStructure[section.id] = [])
@ -1270,6 +1241,13 @@
return composedDocumentStructure return composedDocumentStructure
} }
function clearSelection() {
selectedContent.forEach((v, key) => {
getRef('article_wrapper').querySelector(`.content-card[data-uid="${key}"] sm-checkbox`).checked = false
})
selectedContent.clear()
}
function renderPreview() { function renderPreview() {
const composedDocumentStructure = formatSelectedContent() const composedDocumentStructure = formatSelectedContent()
let frag = document.createDocumentFragment() let frag = document.createDocumentFragment()
@ -1279,7 +1257,7 @@
textContent: currentArticle.sections[section].title textContent: currentArticle.sections[section].title
})) }))
composedDocumentStructure[section].forEach(({ content, uid }) => { composedDocumentStructure[section].forEach(({ content, uid }) => {
const group = createElement('div', { const group = createElement('section', {
className: 'preview-group', className: 'preview-group',
attributes: { 'data-section-id': section, 'data-uid': uid }, attributes: { 'data-section-id': section, 'data-uid': uid },
innerHTML: content innerHTML: content
@ -1325,28 +1303,21 @@
document.body.removeChild(element); document.body.removeChild(element);
} }
function getCleanExportContent() {
const exportContent = getRef('preview__body').cloneNode(true)
exportContent.querySelectorAll('.preview-group').forEach(section => {
section.lastElementChild.remove()
section.replaceWith(...section.childNodes)
})
return DOMPurify.sanitize(exportContent.innerHTML)
}
function exportSelection() { function exportSelection() {
const bodyTemplate = getRef('body_template').content.cloneNode(true) const bodyTemplate = getRef('body_template').content.cloneNode(true)
const composedDocumentStructure = formatSelectedContent()
let frag = document.createDocumentFragment()
for (const section in composedDocumentStructure) {
frag.append(createElement('h3', {
textContent: currentArticle.sections[section].title
}))
composedDocumentStructure[section].forEach(({ content, uid }) => {
const group = createElement('section', {
className: 'grid gap-1',
innerHTML: content
})
frag.append(group)
})
}
const articleTitle = floGlobals.appObjects.cc.articleList[currentArticle.id].title const articleTitle = floGlobals.appObjects.cc.articleList[currentArticle.id].title
bodyTemplate.querySelector('#exported_title').textContent = articleTitle bodyTemplate.querySelector('#exported_title').textContent = articleTitle
bodyTemplate.querySelector('#exported_time').textContent = `Exported on ${getFormattedTime(Date.now())}` bodyTemplate.querySelector('#exported_time').textContent = `Exported on ${getFormattedTime(Date.now())}`
bodyTemplate.querySelector('#export_body').innerHTML = '' bodyTemplate.querySelector('#export_body').innerHTML = getCleanExportContent()
bodyTemplate.querySelector('#export_body').append(frag)
let bodyAttributes = '' let bodyAttributes = ''
let extraScripts = '' let extraScripts = ''
if (isSubAdmin) { if (isSubAdmin) {
@ -1385,35 +1356,6 @@
function goHome() { function goHome() {
window.location.hash = `#/home?articleID=${pagesData.params.articleID}` window.location.hash = `#/home?articleID=${pagesData.params.articleID}`
} }
getRef('preview_page').addEventListener('click', e => {
if (e.target.closest('.move-up')) {
const currentElement = e.target.closest('.preview-group')
const previousSibling = currentElement.previousElementSibling
if (previousSibling?.dataset.sectionId === currentElement.dataset.sectionId) {
const clone = currentElement.cloneNode(true)
previousSibling.before(clone)
currentElement.remove()
}
} else if (e.target.closest('.move-down')) {
const currentElement = e.target.closest('.preview-group')
const nextSibling = currentElement.nextElementSibling
if (nextSibling?.dataset.sectionId === currentElement.dataset.sectionId) {
const clone = currentElement.cloneNode(true)
nextSibling.after(clone)
currentElement.remove()
}
} else if (e.target.closest('.remove-group')) {
const currentElement = e.target.closest('.preview-group')
const uid = currentElement.dataset.uid
if (currentArticle.id) {
getRef('article_wrapper').querySelector(`.content-card[data-uid="${uid}"] sm-checkbox`).checked = false
}
if (!currentElement.nextElementSibling && currentElement.previousElementSibling.tagName === 'H3') {
currentElement.previousElementSibling.remove()
}
currentElement.remove()
}
})
function sharePreview() { function sharePreview() {
if (isSubAdmin) { if (isSubAdmin) {
if (floGlobals.appObjects[pagesData.params.articleID].preview.uid) { if (floGlobals.appObjects[pagesData.params.articleID].preview.uid) {
@ -1445,6 +1387,63 @@
} }
} }
function publishArticle() {
if (isSubAdmin) {
getConfirmation('Request publishing?', {
message: 'Send this article as publishing candidate on RanchiMall TImes',
confirmText: 'Request'
})
.then(res => {
if (res) {
floCloudAPI.sendGeneralData({
articleID: pagesData.params.articleID,
title: floGlobals.appObjects.cc.articleList[currentArticle.id].title,
content: getCleanExportContent(),
}, 'publishing_requests', {
application: 'Test_RM_Times',
receiverID: 'FKAEdnPfjXLHSYwrXQu377ugN4tXU7VGdf'
})
.then(res => {
console.log(res)
notify('Publication request sent', 'success')
})
.catch(err => notify(err, 'error'))
}
})
} else {
notify('This action requires sub-admin privileges', 'error')
}
}
getRef('preview_page').addEventListener('click', e => {
if (e.target.closest('.move-up')) {
const currentElement = e.target.closest('.preview-group')
const previousSibling = currentElement.previousElementSibling
if (previousSibling?.dataset.sectionId === currentElement.dataset.sectionId) {
const clone = currentElement.cloneNode(true)
previousSibling.before(clone)
currentElement.remove()
}
} else if (e.target.closest('.move-down')) {
const currentElement = e.target.closest('.preview-group')
const nextSibling = currentElement.nextElementSibling
if (nextSibling?.dataset.sectionId === currentElement.dataset.sectionId) {
const clone = currentElement.cloneNode(true)
nextSibling.after(clone)
currentElement.remove()
}
} else if (e.target.closest('.remove-group')) {
const currentElement = e.target.closest('.preview-group')
const uid = currentElement.dataset.uid
if (currentArticle.id) {
getRef('article_wrapper').querySelector(`.content-card[data-uid="${uid}"] sm-checkbox`).checked = false
}
if ((!currentElement.nextElementSibling || currentElement.nextElementSibling.tagName === 'H3') && currentElement.previousElementSibling.tagName === 'H3') {
currentElement.previousElementSibling.remove()
}
currentElement.remove()
}
})
getRef('current_article_title').addEventListener("change", e => { getRef('current_article_title').addEventListener("change", e => {
floGlobals.appObjects.cc.articleList[currentArticle.id].title = e.target.value.trim() floGlobals.appObjects.cc.articleList[currentArticle.id].title = e.target.value.trim()
floCloudAPI.updateObjectData('cc') floCloudAPI.updateObjectData('cc')
@ -1718,11 +1717,15 @@
section.querySelectorAll('.content-card').forEach(card => { section.querySelectorAll('.content-card').forEach(card => {
allContentCards[card.dataset.uid] = card.cloneNode(true) allContentCards[card.dataset.uid] = card.cloneNode(true)
}) })
const emptyCard = section.firstElementChild.cloneNode(true) let emptyCard
if (!isSubAdmin)
emptyCard = section.firstElementChild.cloneNode(true)
section.innerHTML = '' section.innerHTML = ''
const frag = document.createDocumentFragment() const frag = document.createDocumentFragment()
currentArticle.sections[sectionID].uniqueEntries.forEach((entry, index) => frag.append(allContentCards[entry])) currentArticle.sections[sectionID].uniqueEntries.forEach((entry, index) => frag.append(allContentCards[entry]))
section.append(emptyCard, frag) if (!isSubAdmin)
section.append(emptyCard)
section.append(frag)
} }
} }
} }
@ -2081,6 +2084,25 @@
await Promise.all([ await Promise.all([
floCloudAPI.requestObjectData('cc'), floCloudAPI.requestObjectData('cc'),
]) ])
getRef('preview_options').innerHTML = `
${isSubAdmin ? `
<button class="icon-only" title="Share preview" onclick="sharePreview()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> <g> <rect fill="none" height="24" width="24" /> </g> <g> <path d="M16,5l-1.42,1.42l-1.59-1.59V16h-1.98V4.83L9.42,6.42L8,5l4-4L16,5z M20,10v11c0,1.1-0.9,2-2,2H6c-1.11,0-2-0.9-2-2V10 c0-1.11,0.89-2,2-2h3v2H6v11h12V10h-3V8h3C19.1,8,20,8.89,20,10z" /> </g> </svg>
</button>
<button class="icon-only" title="Export selection" onclick="exportSelection()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> <g> <rect fill="none" height="24" width="24" /> </g> <g> <path d="M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z" /> </g> </svg>
</button>
`: ''}
<sm-button variant="primary" onclick="${isSubAdmin ? 'publishArticle()' : 'exportSelection()'}">
${isSubAdmin ? `
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> <path d="M0 0h24v24H0V0z" fill="none" /> <path d="M5 4h14v2H5zm0 10h4v6h6v-6h4l-7-7-7 7zm8-2v6h-2v-6H9.83L12 9.83 14.17 12H13z" /> </svg>
Publish
`: `
<svg class="icon button__icon--left" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> <g> <rect fill="none" height="24" width="24" /> </g> <g> <path d="M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z" /> </g> </svg>
Download
`}
</sm-button>
`
showPage(window.location.hash, { firstLoad: true }) showPage(window.location.hash, { firstLoad: true })
console.log(result) console.log(result)
@ -12601,21 +12623,28 @@
//floDapps.addStartUpFunction('Sample', Promised Function) //floDapps.addStartUpFunction('Sample', Promised Function)
//floDapps.setAppObjectStores({sampleObs1:{}, sampleObs2:{options{autoIncrement:true, keyPath:'SampleKey'}, Indexes:{sampleIndex:{}}}}) //floDapps.setAppObjectStores({sampleObs1:{}, sampleObs2:{options{autoIncrement:true, keyPath:'SampleKey'}, Indexes:{sampleIndex:{}}}})
let firstLoad = true
floDapps.setMidStartup(() => new Promise(async (resolve, reject) => { floDapps.setMidStartup(() => new Promise(async (resolve, reject) => {
await floCloudAPI.requestObjectData('RMT') await floCloudAPI.requestObjectData('RMT')
await floCloudAPI.requestGeneralData(`article_${currentArticleID}_votes`, { await floCloudAPI.requestGeneralData(`article_${currentArticleID}_votes`, {
callback: (d, e) => { callback: (d, e) => {
animateLikeCount() if (firstLoad) {
const allVotes = floGlobals.generalData[`article_${currentArticleID}_votes|${floGlobals.adminID}|${floGlobals.application}`]
for (const vote in allVotes) {
const { message: { articleID } } = allVotes[vote]
if (allVotes[vote].message.articleID === currentArticleID) {
totalVotes++
}
}
getRef('like_count').textContent = totalVotes
} else {
animateLikeCount()
}
firstLoad = false
} }
}) })
const allVotes = floGlobals.generalData[`article_${currentArticleID}_votes|${floGlobals.adminID}|${floGlobals.application}`]
for (const vote in allVotes) {
const { message: { articleID } } = allVotes[vote]
if (allVotes[vote].message.articleID === currentArticleID) {
totalVotes++
}
}
getRef('like_count').textContent = totalVotes
resolve(true) resolve(true)
})) }))
floDapps.setCustomPrivKeyInput(() => new Promise((resolve, reject) => { floDapps.setCustomPrivKeyInput(() => new Promise((resolve, reject) => {