Bug fixes and feature update
added article publication logic
This commit is contained in:
parent
eb29f04103
commit
b61adfc188
28
css/main.css
28
css/main.css
@ -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
2
css/main.min.css
vendored
File diff suppressed because one or more lines are too long
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
341
index.html
341
index.html
@ -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">
|
||||||
@ -608,7 +576,7 @@
|
|||||||
return getRef(popupId);
|
return getRef(popupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hides the popup or modal
|
// hides the popup or modal
|
||||||
function hidePopup() {
|
function hidePopup() {
|
||||||
if (popupStack.peek() === undefined)
|
if (popupStack.peek() === undefined)
|
||||||
return;
|
return;
|
||||||
@ -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'
|
||||||
@ -921,7 +890,7 @@
|
|||||||
getDiff(oldStr, newStr)
|
getDiff(oldStr, newStr)
|
||||||
oldStr - Old String
|
oldStr - Old String
|
||||||
newStr - New String
|
newStr - New String
|
||||||
returns diff
|
returns diff
|
||||||
updateString(oldStr, diff)
|
updateString(oldStr, diff)
|
||||||
oldStr - Same old String
|
oldStr - Same old String
|
||||||
diff - returned data from getDiff function
|
diff - returned data from getDiff function
|
||||||
@ -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)
|
||||||
@ -4882,9 +4904,9 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Electronic Code Book mode.
|
* Electronic Code Book mode.
|
||||||
*
|
*
|
||||||
* ECB applies the cipher directly against each block of the input.
|
* ECB applies the cipher directly against each block of the input.
|
||||||
*
|
*
|
||||||
* ECB does not require an initialization vector.
|
* ECB does not require an initialization vector.
|
||||||
*/
|
*/
|
||||||
var ECB = C_mode.ECB = function () {
|
var ECB = C_mode.ECB = function () {
|
||||||
@ -4919,7 +4941,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Cipher block chaining
|
* Cipher block chaining
|
||||||
*
|
*
|
||||||
* The first block is XORed with the IV. Subsequent blocks are XOR with the
|
* The first block is XORed with the IV. Subsequent blocks are XOR with the
|
||||||
* previous cipher output.
|
* previous cipher output.
|
||||||
*/
|
*/
|
||||||
@ -4973,11 +4995,11 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Cipher feed back
|
* Cipher feed back
|
||||||
*
|
*
|
||||||
* The cipher output is XORed with the plain text to produce the cipher output,
|
* The cipher output is XORed with the plain text to produce the cipher output,
|
||||||
* which is then fed back into the cipher to produce a bit pattern to XOR the
|
* which is then fed back into the cipher to produce a bit pattern to XOR the
|
||||||
* next block with.
|
* next block with.
|
||||||
*
|
*
|
||||||
* This is a stream cipher mode and does not require padding.
|
* This is a stream cipher mode and does not require padding.
|
||||||
*/
|
*/
|
||||||
var CFB = C_mode.CFB = function () {
|
var CFB = C_mode.CFB = function () {
|
||||||
@ -5025,10 +5047,10 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Output feed back
|
* Output feed back
|
||||||
*
|
*
|
||||||
* The cipher repeatedly encrypts its own output. The output is XORed with the
|
* The cipher repeatedly encrypts its own output. The output is XORed with the
|
||||||
* plain text to produce the cipher text.
|
* plain text to produce the cipher text.
|
||||||
*
|
*
|
||||||
* This is a stream cipher mode and does not require padding.
|
* This is a stream cipher mode and does not require padding.
|
||||||
*/
|
*/
|
||||||
var OFB = C_mode.OFB = function () {
|
var OFB = C_mode.OFB = function () {
|
||||||
@ -5174,17 +5196,17 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved
|
* Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* in the Software without restriction, including without limitation the rights
|
* in the Software without restriction, including without limitation the rights
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be included in
|
* The above copyright notice and this permission notice shall be included in
|
||||||
* all copies or substantial portions of the Software.
|
* all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
@ -5204,7 +5226,7 @@
|
|||||||
* N = Cpu cost
|
* N = Cpu cost
|
||||||
* r = Memory cost
|
* r = Memory cost
|
||||||
* p = parallelization cost
|
* p = parallelization cost
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) {
|
window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) {
|
||||||
if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2");
|
if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2");
|
||||||
@ -7125,11 +7147,11 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2011 Stefan Thomas
|
Copyright (c) 2011 Stefan Thomas
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -8066,7 +8088,7 @@
|
|||||||
|
|
||||||
(function (ellipticCurveType) {
|
(function (ellipticCurveType) {
|
||||||
|
|
||||||
//Defining Elliptic Encryption Object
|
//Defining Elliptic Encryption Object
|
||||||
var ellipticEncryption = window.ellipticCurveEncryption = function () { };
|
var ellipticEncryption = window.ellipticCurveEncryption = function () { };
|
||||||
|
|
||||||
ellipticEncryption.rng = new SecureRandom();
|
ellipticEncryption.rng = new SecureRandom();
|
||||||
@ -8154,7 +8176,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
//In real life ellipticEncryption.receiverPublicString is the public key of the receiver.
|
//In real life ellipticEncryption.receiverPublicString is the public key of the receiver.
|
||||||
//you don't have to run receiverRandom and the bottom function
|
//you don't have to run receiverRandom and the bottom function
|
||||||
ellipticEncryption.receiverPublicString = function (receiverPublicKey) {
|
ellipticEncryption.receiverPublicString = function (receiverPublicKey) {
|
||||||
|
|
||||||
var receiverKeyECData = {};
|
var receiverKeyECData = {};
|
||||||
@ -8787,7 +8809,7 @@
|
|||||||
addedDiff(original, updatedObj) returns only the values added to the updated object
|
addedDiff(original, updatedObj) returns only the values added to the updated object
|
||||||
deletedDiff(original, updatedObj) returns only the values deleted in the updated object
|
deletedDiff(original, updatedObj) returns only the values deleted in the updated object
|
||||||
updatedDiff(original, updatedObj) returns only the values that have been changed in the updated object
|
updatedDiff(original, updatedObj) returns only the values that have been changed in the updated object
|
||||||
findDiff(original, updatedObj) returns an object with the added, deleted and updated differences
|
findDiff(original, updatedObj) returns an object with the added, deleted and updated differences
|
||||||
mergeRecursive(original, diff) returns a new object that will merge difference to old object
|
mergeRecursive(original, diff) returns a new object that will merge difference to old object
|
||||||
mergeDiff(original, allDiff) returns a new object from original object merged with all differences (allDiff is returned object of findDiff)
|
mergeDiff(original, allDiff) returns a new object from original object merged with all differences (allDiff is returned object of findDiff)
|
||||||
*/
|
*/
|
||||||
@ -8964,7 +8986,7 @@
|
|||||||
// Recurse...
|
// Recurse...
|
||||||
cleanse(value);
|
cleanse(value);
|
||||||
// ...and remove if now "empty" (NOTE: insert your definition of "empty" here)
|
// ...and remove if now "empty" (NOTE: insert your definition of "empty" here)
|
||||||
//if (!Object.keys(value).length)
|
//if (!Object.keys(value).length)
|
||||||
// delete obj[key];
|
// delete obj[key];
|
||||||
}
|
}
|
||||||
else if (value === null)
|
else if (value === null)
|
||||||
@ -9238,7 +9260,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
//Split the str using shamir's Secret and Returns the shares
|
//Split the str using shamir's Secret and Returns the shares
|
||||||
createShamirsSecretShares: function (str, total_shares, threshold_limit) {
|
createShamirsSecretShares: function (str, total_shares, threshold_limit) {
|
||||||
try {
|
try {
|
||||||
if (str.length > 0) {
|
if (str.length > 0) {
|
||||||
@ -9405,7 +9427,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
//Send Tx to blockchain
|
//Send Tx to blockchain
|
||||||
sendTx: function (senderAddr, receiverAddr, sendAmt, privKey, floData = '', strict_utxo = true) {
|
sendTx: function (senderAddr, receiverAddr, sendAmt, privKey, floData = '', strict_utxo = true) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (!floCrypto.validateASCII(floData))
|
if (!floCrypto.validateASCII(floData))
|
||||||
@ -10040,7 +10062,7 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
/*searchData: function (obsName, options = {}, dbName = this.defaultDB) {
|
/*searchData: function (obsName, options = {}, dbName = this.defaultDB) {
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.openDB(dbName).then(db => {
|
this.openDB(dbName).then(db => {
|
||||||
var obs = db.transaction(obsName, "readonly").objectStore(obsName);
|
var obs = db.transaction(obsName, "readonly").objectStore(obsName);
|
||||||
@ -12102,7 +12124,7 @@
|
|||||||
fill: rgba(var(--text-color), 1);
|
fill: rgba(var(--text-color), 1);
|
||||||
transition: transform 0.3s, opacity 0.1s;
|
transition: transform 0.3s, opacity 0.1s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-switcher__checkbox {
|
.theme-switcher__checkbox {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -12391,7 +12413,7 @@
|
|||||||
return getRef(popupId);
|
return getRef(popupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hides the popup or modal
|
// hides the popup or modal
|
||||||
function hidePopup() {
|
function hidePopup() {
|
||||||
if (popupStack.peek() === undefined)
|
if (popupStack.peek() === undefined)
|
||||||
return;
|
return;
|
||||||
@ -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) => {
|
||||||
@ -12645,13 +12674,13 @@
|
|||||||
<script>
|
<script>
|
||||||
const smButton = document.createElement('template')
|
const smButton = document.createElement('template')
|
||||||
smButton.innerHTML = `
|
smButton.innerHTML = `
|
||||||
<style>
|
<style>
|
||||||
*{
|
*{
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
:host{
|
:host{
|
||||||
display: -webkit-inline-box;
|
display: -webkit-inline-box;
|
||||||
display: -ms-inline-flexbox;
|
display: -ms-inline-flexbox;
|
||||||
@ -12671,11 +12700,11 @@
|
|||||||
:host([variant='outlined']) .button{
|
:host([variant='outlined']) .button{
|
||||||
-webkit-box-shadow: 0 0 0 1px rgba(var(--text-color), 0.2) inset;
|
-webkit-box-shadow: 0 0 0 1px rgba(var(--text-color), 0.2) inset;
|
||||||
box-shadow: 0 0 0 1px rgba(var(--text-color), 0.2) inset;
|
box-shadow: 0 0 0 1px rgba(var(--text-color), 0.2) inset;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
color: var(--accent-color);
|
color: var(--accent-color);
|
||||||
}
|
}
|
||||||
:host([variant='no-outline']) .button{
|
:host([variant='no-outline']) .button{
|
||||||
background: inherit;
|
background: inherit;
|
||||||
color: var(--accent-color);
|
color: var(--accent-color);
|
||||||
}
|
}
|
||||||
:host([disabled]){
|
:host([disabled]){
|
||||||
@ -12694,15 +12723,15 @@
|
|||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--border-radius);
|
||||||
-webkit-box-pack: center;
|
-webkit-box-pack: center;
|
||||||
-ms-flex-pack: center;
|
-ms-flex-pack: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
transition: box-shadow 0.3s, background-color 0.3s;
|
transition: box-shadow 0.3s, background-color 0.3s;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
background-color: var(--background);
|
background-color: var(--background);
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
outline: none;
|
outline: none;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@ -12741,7 +12770,7 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div part="button" class="button">
|
<div part="button" class="button">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>`;
|
</div>`;
|
||||||
customElements.define('sm-button',
|
customElements.define('sm-button',
|
||||||
class extends HTMLElement {
|
class extends HTMLElement {
|
||||||
@ -12803,7 +12832,7 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
input[type="search"]::-webkit-search-decoration,
|
input[type="search"]::-webkit-search-decoration,
|
||||||
input[type="search"]::-webkit-search-cancel-button,
|
input[type="search"]::-webkit-search-cancel-button,
|
||||||
input[type="search"]::-webkit-search-results-button,
|
input[type="search"]::-webkit-search-results-button,
|
||||||
@ -12811,12 +12840,12 @@
|
|||||||
input[type=number] {
|
input[type=number] {
|
||||||
-moz-appearance:textfield;
|
-moz-appearance:textfield;
|
||||||
}
|
}
|
||||||
input[type=number]::-webkit-inner-spin-button,
|
input[type=number]::-webkit-inner-spin-button,
|
||||||
input[type=number]::-webkit-outer-spin-button {
|
input[type=number]::-webkit-outer-spin-button {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
-moz-appearance: none;
|
-moz-appearance: none;
|
||||||
appearance: none;
|
appearance: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
input::-ms-reveal,
|
input::-ms-reveal,
|
||||||
input::-ms-clear {
|
input::-ms-clear {
|
||||||
@ -12860,7 +12889,7 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
:host(.round) .input{
|
:host(.round) .input{
|
||||||
border-radius: 10rem;
|
border-radius: 10rem;
|
||||||
}
|
}
|
||||||
@ -12939,7 +12968,7 @@
|
|||||||
-webkit-box-flex: 1;
|
-webkit-box-flex: 1;
|
||||||
-ms-flex: 1;
|
-ms-flex: 1;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
input{
|
input{
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
border: none;
|
border: none;
|
||||||
@ -12953,7 +12982,7 @@
|
|||||||
-ms-transform: translateY(0.6rem);
|
-ms-transform: translateY(0.6rem);
|
||||||
transform: translateY(0.6rem);
|
transform: translateY(0.6rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
:host(:not([variant="outlined"])) .animate-label .label {
|
:host(:not([variant="outlined"])) .animate-label .label {
|
||||||
-webkit-transform: translateY(-0.7em) scale(0.8);
|
-webkit-transform: translateY(-0.7em) scale(0.8);
|
||||||
-ms-transform: translateY(-0.7em) scale(0.8);
|
-ms-transform: translateY(-0.7em) scale(0.8);
|
||||||
@ -13298,7 +13327,7 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
:host{
|
:host{
|
||||||
position: fixed;
|
position: fixed;
|
||||||
display: -ms-grid;
|
display: -ms-grid;
|
||||||
@ -13431,7 +13460,7 @@
|
|||||||
::-webkit-scrollbar{
|
::-webkit-scrollbar{
|
||||||
width: 0.5rem;
|
width: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb{
|
::-webkit-scrollbar-thumb{
|
||||||
background: rgba(var(--text-color), 0.3);
|
background: rgba(var(--text-color), 0.3);
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
@ -13749,13 +13778,13 @@
|
|||||||
});
|
});
|
||||||
const smCopy = document.createElement('template');
|
const smCopy = document.createElement('template');
|
||||||
smCopy.innerHTML = `
|
smCopy.innerHTML = `
|
||||||
<style>
|
<style>
|
||||||
*{
|
*{
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
:host{
|
:host{
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user