lib.itmens/common/static/js/home.js
Henri Dickson 14b003a44a add all NeoDB features to NiceDB (#115)
* fix scraping failure with wepb image (merge upstream/fix-webp-scrape)

* add filetype to requirements

* add proxycrawl.com as fallback for douban scraper

* load 3p js/css from cdn

* add fix-cover task

* fix book/album cover tasks

* scrapestack

* bandcamp scrape and preview ;
manage.py scrape <url> ;
make ^C work when DEBUG

* use scrapestack when fix cover

* add user agent to improve compatibility

* search BandCamp for music albums

* add missing MovieGenre

* fix search 500 when song has no parent album

* adjust timeout

* individual scrapers

* fix tmdb parser

* export marks via rq; pref to send public toot; move import to data page

* fix spotify import

* fix edge cases

* export: fix dupe tags

* use rq to manage doufen import

* add django command to manage rq jobs

* fix export edge case

* tune rq admin

* fix detail page 502 step 1: async pull mastodon follow/block/mute list

* fix detail page 502 step 2: calculate relationship by local cached data

* manual sync mastodon follow info

* domain_blocks parsing fix

* marks by who i follows

* adjust label

* use username in urls

* add page to list a user\'s review

* review widget on user home page

* fix preview 500

* fix typo

* minor fix

* fix google books parsing

* allow mark/review visible to oneself

* fix auto sync masto for new user

* fix search 500

* add command to restart a sync task

* reset visibility

* delete user data

* fix tag search result pagination

* not upgrade to django 4 yet

* basic doc

* wip: collection

* wip

* wip

* collection use htmx

* show in-collection section for entities

* fix typo

* add su for easier debug

* fix some 500s

* fix login using alternative domain

* hide data from disabled user

* add item to list from detail page

* my tags

* collection: inline comment edit

* show number of ratings

* fix collection delete

* more detail in collection view

* use item template in search result

* fix 500

* write index to meilisearch

* fix search

* reindex in batch

* fix 500

* show search result from meilisearch

* more search commands

* index less fields

* index new items only

* search highlights

* fix 500

* auto set search category

* classic search if no meili server

* fix index stats error

* support typesense backend

* workaround typesense bug

* make external search async

* fix 500, typo

* fix cover scripts

* fix minor issue in douban parser

* supports m.douban.com and customized bandcamp domain

* move account

* reword with gender-friendly and instance-neutral language

* Friendica does not have vapid_key in api response

* enable anonymous search

* tweak book result template

* API v0

API v0

* fix meilisearch reindex

* fix search by url error

* login via twitter.com

* login via pixelfed

* minor fix

* no refresh on inactive users

* support refresh access token

* get rid of /users/number-id/

* refresh twitter handler automatically

* paste image when review

* support PixelFed (very long token)

* fix django-markdownx version

* ignore single quote for meilisearch for now

* update logo

* show book review/mark from same isbn

* show movie review/mark from same imdb

* fix login with older mastodon servers

* import Goodreads book list and profile

* add timestamp to Goodreads import

* support new google books api

* import goodreads list

* minor goodreads fix

* click corner action icon to add to wishlist

* clean up duplicated code

* fix anonymous search

* fix 500

* minor fix search 500

* show rating only if votes > 5

* Entity.refresh_rating()

* preference to append text when sharing; clean up duplicated code

* fix missing data for user tagged view

* fix page link for tag view

* fix 500 when language field longer than 10

* fix 500 when sharing mark for song

* fix error when reimport goodread profile

* fix minor typo

* fix a rare 500

* error log dump less

* fix tags in marks export

* fix missing param in pagination

* import douban review

* clarify text

* fix missing sheet in review import

* review: show in progress

* scrape douban: ignore unknown genre

* minor fix

* improve review import by guess entity urls

* clear guide text for review import

* improve review import form text

* workaround some 500

* fix mark import error

* fix img in review import

* load external results earlier

* ignore search server errors

* simplify user register flow to avoid inconsistent state

* Add a learn more link on login page

* Update login.html

* show mark created timestamp as mark time

* no 500 for api error

* redirect for expired tokens

* ensure preference object created.

* mark collections

* tag list

* fix tag display

* fix sorting etc

* fix 500

* fix potential export 500; save shared links

* fix share to twittwe

* fix review url

* fix 500

* fix 500

* add timeline, etc

* missing status change in timeline

* missing id in timeline

* timeline view by default

* workaround bug in markdownx...

* fix typo

* option to create new collection when add from detail page

* add missing announcement and tags in timeline home

* add missing announcement

* add missing announcement

* opensearch

* show fediverse shared link

* public review no longer requires login

* fix markdownx bug

* fix 500

* use cloudflare cdn

* validate jquery load and domain input

* fix 500

* tips for goodreads import

* collaborative collection

* show timeline and profile link on nav bar

* minor tweak

* share collection

* fix Goodreads search

* show wish mark in timeline

* resync failed urls with local proxy

* resync failed urls with local proxy: check proxy first

* scraper minor fix

* resync failed urls

* fix fields limit

* fix douban parsing error

* resync

* scraper minor fix

* scraper minor fix

* scraper minor fix

* local proxy

* local proxy

* sync default config from neodb

* configurable site name

* fix 500

* fix 500 for anonymous user

* add sentry

* add git version in log

* add git version in log

* no longer rely on cdnjs.cloudflare.com

* move jq/cash to _common_libs template partial

* fix rare js error

* fix 500

* avoid double submission error

* import tag in lower case

* catch some js network errors

* catch some js network errors

* support more goodread urls

* fix unaired tv in tmdb

* support more google book urls

* fix related series

* more goodreads urls

* robust googlebooks search

* robust search

* Update settings.py

* Update scraper.py

* Update requirements.txt

* make nicedb work

* doc update

* simplify permission check

* update doc

* update doc for bug report link

* skip spotify tracks

* fix 500

* improve search api

* blind fix import compatibility

* show years for movie in timeline

* show years for movie in timeline; thinner font

* export reviews

* revert user home to use jquery https://github.com/fabiospampinato/cash/issues/246

* IGDB

* use IGDB for Steam

* use TMDB for IMDb

* steam: igdb then fallback to steam

* keep change history

* keep change history: add django settings

* Steam: keep localized title/brief while merging IGDB

* basic Docker support

* rescrape

* Create codeql-analysis.yml

* Create SECURITY.md

* Create pysa.yml

Co-authored-by: doubaniux <goodsir@vivaldi.net>
Co-authored-by: Your Name <you@example.com>
Co-authored-by: Their Name <they@example.com>
Co-authored-by: Mt. Front <mfcndw@gmail.com>
2022-11-09 19:56:50 +01:00

227 lines
No EOL
8.9 KiB
JavaScript

$(document).ready( function() {
$("#userInfoCard .mast-brief").text($("<div>"+$("#userInfoCard .mast-brief").text().replace(/\<br/g,'\n<br').replace(/\<p/g,'\n<p')+"</div>").text());
$("#userInfoCard .mast-brief").html($("#userInfoCard .mast-brief").html().replace(/\n/g,'<br/>'));
let token = $("#oauth2Token").text();
let mast_domain = $("#mastodonURI").text();
let mast_uri = 'https://' + mast_domain
let id = $("#userMastodonID").text();
if (id && id != 'None' && mast_domain != 'twitter.com') {
// let userInfoSpinner = $("#spinner").clone().removeAttr("hidden");
let followersSpinner = $("#spinner").clone().removeAttr("hidden");
let followingSpinner = $("#spinner").clone().removeAttr("hidden");
// $("#userInfoCard").append(userInfoSpinner);
$("#followings h5").after(followingSpinner);
$("#followers h5").after(followersSpinner);
$(".mast-following-more").hide();
$(".mast-followers-more").hide();
getFollowers(
id,
mast_uri,
token,
function(userList, request) {
if (userList.length == 0) {
$(".mast-followers").hide();
$(".mast-followers").before('<div style="margin-bottom: 20px;">暂无</div>');
} else {
if (userList.length > 4){
userList = userList.slice(0, 4);
$(".mast-followers-more").show();
}
let template = $(".mast-followers li").clone();
$(".mast-followers").html("");
userList.forEach(data => {
temp = $(template).clone();
temp.find("img").attr("src", data.avatar);
if (data.display_name) {
temp.find(".mast-displayname").html(translateEmojis(data.display_name, data.emojis));
} else {
temp.find(".mast-displayname").text(data.username);
}
let url;
if (data.acct.includes('@')) {
url = $("#userPageURL").text().replace('0', data.acct);
} else {
url = $("#userPageURL").text().replace('0', data.acct + '@' + mast_domain);
}
temp.find("a").attr('href', url);
$(".mast-followers").append(temp);
});
}
$(followersSpinner).remove();
}
);
getFollowing(
id,
mast_uri,
token,
function(userList, request) {
if (userList.length == 0) {
$(".mast-following").hide();
$(".mast-following").before('<div style="margin-bottom: 20px;">暂无</div>');
} else {
if (userList.length > 4){
userList = userList.slice(0, 4);
$(".mast-following-more").show();
}
let template = $(".mast-following li").clone();
$(".mast-following").html("");
userList.forEach(data => {
temp = $(template).clone()
temp.find("img").attr("src", data.avatar);
if (data.display_name) {
temp.find(".mast-displayname").html(translateEmojis(data.display_name, data.emojis));
} else {
temp.find(".mast-displayname").text(data.username);
}
let url;
if (data.acct.includes('@')) {
url = $("#userPageURL").text().replace('0', data.acct);
} else {
url = $("#userPageURL").text().replace('0', data.acct + '@' + mast_domain);
}
temp.find("a").attr('href', url);
$(".mast-following").append(temp);
});
}
$(followingSpinner).remove();
}
);
}
// mobile dropdown
$(".relation-dropdown__button").data("collapse", true);
function onClickDropdownButton(e) {
const button = $(".relation-dropdown__button");
button.data("collapse", !button.data("collapse"));
button.children('.icon-arrow').toggleClass("icon-arrow--expand");
button.siblings('.relation-dropdown__body').toggleClass("relation-dropdown__body--expand");
}
$(".relation-dropdown__button").on('click', onClickDropdownButton);
// close when click outside
window.onclick = evt => {
const target = $(evt.target);
if (!target.parents('.relation-dropdown').length && !$(".relation-dropdown__button").data("collapse")) {
onClickDropdownButton();
}
};
// import panel
$("#uploadBtn").on('click', e => {
const btn = $("#uploadBtn")
const form = $(".import-panel__body form")
// validate form
let isValidForm = form[0].checkValidity();
if (!isValidForm) {
if (form[0].reportValidity) {
form[0].reportValidity();
} else {
alert("Invalid File");
}
return
}
e.preventDefault();
let formData = new FormData(form[0]);
// disable submit button
btn.prop('disabled', true);
// show progress bar & hide last status
$(".import-panel__progress").show();
$(".import-panel__last-task").hide();
// flush failed urls
$("#failedUrls").html("");
// reset progress bar
$("#importProgress").attr("max", 1);
$("#importProgress").attr("value", 0);
$("#progressPercent").text('0%');
$.ajax({
url: form.attr("action"),
type: 'POST',
data: formData,
contentType: false,
dataType: "json",
processData: false,
enctype: form.attr("enctype"),
success: function (response) {
// console.log(response);
// long polling
poll();
},
error: function (response) {
// console.log(response)
},
complete: function (response) {
// console.log(response)
},
});
});
// if progress is visible start to poll
if ($(".import-panel__progress").is(":visible")) {
poll();
}
// long polling function
const pollingInterval = 1500;
function poll() {
$.ajax({
url: $("#querySyncInfoURL").data("url"),
success: function (data) {
// console.log(data);
const progress = $("#importProgress");
const percent = $("#progressPercent");
if (!data.is_finished) {
// update progress bar
if (!data.total_items == 0) {
progress.attr("max", data.total_items);
progress.attr("value", data.finished_items);
progress.attr("value", data.finished_items);
percent.text("" + data.finished_items + "/" + data.total_items);
}
setTimeout(() => {
poll();
}, pollingInterval);
} else {
// task finishes
// update progress bar
percent.text('100%');
progress.attr("max", 1);
progress.attr("value", 1);
$("#uploadBtn").prop('disabled', false);
// update last task summary
$("#lastTaskTotalItems").text(data.total_items);
$("#lastTaskSuccessItems").text(data.success_items);
$("#lastTaskStatus").text(data.status);
// display failed urls
if (data.failed_urls.length > 0) {
$(".import-panel__fail-urls").show();
data.failed_urls.forEach((v, i) => {
console.log(v)
$("#failedUrls").append($("<li>" + v + "</li>"));
});
}
// hide progress & show last task
$(".import-panel__progress").hide();
$(".import-panel__last-task").show();
}
},
dataType: "json",
complete: () => {
// setTimeout(() => {
// poll();
// }, pollingInterval);
},
});
}
});