feeds/app/assets/javascripts/new_channel.js

341 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function(){
var loading = null,
site_url = null;
$("document").ready(function(){
loading = $("#loading");
bindHandlers();
})
var bindHandlers = function(){
$("#find-channels").on("click",function(){
site_url = $("#site-url-wrapper input[type=text]").val();
$("#site-url-wrapper").fadeOut();
getChannelList();
})
$("#toggle-manual-rss").on("click",function(){
$("#manual-rss-form").slideToggle();
})
$("input[name='source-type']").on("change",function(){
if($(this).val() == "json"){
$("#rss-detect-block").hide();
$("#json-detect-block").show();
}else{
$("#json-detect-block").hide();
$("#rss-detect-block").show();
}
})
$("#manual-rss-detect").on("click",function(){
var rss_url = $("#manual-rss-url").val().trim();
if(!rss_url){
alert("請先填寫 RSS 網址");
return;
}
$.ajax({
url: "/admin/feeds/rss_fields",
data: {"url": rss_url},
dataType: "json",
type: "get"
}).done(function(data){
if(!data.fields || data.fields.length == 0){
alert("偵測不到欄位,請確認 RSS 網址是否正確");
return;
}
var titleSelect = $("#manual-rss-title-field");
var linkSelect = $("#manual-rss-link-field");
var imageSelect = $("#manual-rss-image-field");
titleSelect.html("");
linkSelect.html("");
imageSelect.html("<option value=''>(不設定圖片欄位)</option>");
$.each(data.fields, function(i, f){
titleSelect.append("<option value='" + f + "'" + (f=="title" ? " selected" : "") + ">" + f + "</option>");
linkSelect.append("<option value='" + f + "'" + (f=="link" ? " selected" : "") + ">" + f + "</option>");
imageSelect.append("<option value='" + f + "'" + (f=="imageUrl" ? " selected" : "") + ">" + f + "</option>");
})
$("#manual-rss-mapping").show();
})
})
$("#json-detect-step1").on("click",function(){
var json_url = $("#manual-rss-url").val().trim();
if(!json_url){
alert("請先填寫網址");
return;
}
$.ajax({
url: "/admin/feeds/json_top_keys",
data: {"url": json_url},
dataType: "json",
type: "get"
}).done(function(data){
if(data.error){
alert("抓取失敗,請確認網址是否正確、是否為 JSON 格式");
return;
}
var select = $("#json-list-key-select");
select.html("");
if(data.root_is_array){
select.append("<option value=''>(根層級本身就是陣列)</option>");
}
$.each(data.array_keys, function(i, k){
select.append("<option value='" + k + "'>" + k + "</option>");
})
if(!data.root_is_array && data.array_keys.length == 0){
alert("偵測不到任何陣列欄位,請確認這個網址回傳的是不是文章列表 JSON");
return;
}
$("#json-list-key-wrapper").show();
$("#json-field-mapping").hide();
})
})
$("#json-detect-step2").on("click",function(){
var json_url = $("#manual-rss-url").val().trim();
var list_key = $("#json-list-key-select").val();
$.ajax({
url: "/admin/feeds/json_item_fields",
data: {"url": json_url, "list_key": list_key},
dataType: "json",
type: "get"
}).done(function(data){
if(!data.fields || data.fields.length == 0){
alert("偵測不到欄位,請確認列表位置選對了嗎");
return;
}
var titleSelect = $("#json-title-field");
var subtitleSelect = $("#json-subtitle-field");
var contentSelect = $("#json-content-field");
var timeSelect = $("#json-time-field");
var imageSelect = $("#json-image-field");
var idSelect = $("#json-id-field");
var linkFieldSelect = $("#json-link-field");
titleSelect.html("");
subtitleSelect.html("<option value=''>(不設定副標題欄位)</option>");
contentSelect.html("<option value=''>(不設定內容欄位)</option>");
timeSelect.html("");
imageSelect.html("<option value=''>(不設定圖片欄位)</option>");
idSelect.html("");
linkFieldSelect.html("");
$.each(data.fields, function(i, f){
titleSelect.append("<option value='" + f + "'>" + f + "</option>");
subtitleSelect.append("<option value='" + f + "'>" + f + "</option>");
contentSelect.append("<option value='" + f + "'>" + f + "</option>");
timeSelect.append("<option value='" + f + "'>" + f + "</option>");
imageSelect.append("<option value='" + f + "'>" + f + "</option>");
idSelect.append("<option value='" + f + "'>" + f + "</option>");
linkFieldSelect.append("<option value='" + f + "'" + ((f=="url"||f=="link") ? " selected" : "") + ">" + f + "</option>");
})
$("#json-field-mapping").show();
})
})
$("input[name='json-link-mode']").on("change",function(){
if($(this).val() == "template"){
$("#json-link-field-wrapper").hide();
$("#json-link-template-wrapper").show();
}else{
$("#json-link-template-wrapper").hide();
$("#json-link-field-wrapper").show();
}
})
$("#manual-rss-next").on("click",function(){
var rss_url = $("#manual-rss-url").val().trim();
var title = $("#manual-rss-title").val().trim();
var source_type = $("input[name='source-type']:checked").val();
var channel_key = "announcement";
if(!rss_url || !title){
alert("請把網址、頻道顯示名稱填寫完整");
return;
}
site_url = rss_url;
var title_translations = {};
title_translations[I18n.locale] = title;
var feed = {
uid: title.replace(/\s+/g,'_') + "_" + Date.now(),
url: rss_url,
title_translations: title_translations
};
if(source_type == "json"){
var list_key = $("#json-list-key-select").val();
var json_title_field = $("#json-title-field").val();
var json_subtitle_field = $("#json-subtitle-field").val();
var json_content_field = $("#json-content-field").val();
var json_time_field = $("#json-time-field").val();
var json_image_field = $("#json-image-field").val();
var json_id_field = $("#json-id-field").val();
var json_link_mode = $("input[name='json-link-mode']:checked").val();
var json_link_field = $("#json-link-field").val();
var json_link_template = $("#json-link-template").val().trim();
if(!json_title_field || !json_id_field){
alert("請完成 JSON 欄位偵測並至少填寫標題欄位、ID欄位");
return;
}
if(json_link_mode == "template" && !json_link_template){
alert("請填寫連結樣板");
return;
}
if(json_link_mode == "field" && !json_link_field){
alert("請選擇連結欄位");
return;
}
feed.is_json_list = true;
feed.json_list_key = list_key;
feed.json_id_field = json_id_field;
feed.json_title_field = json_title_field;
feed.json_subtitle_field = json_subtitle_field;
feed.json_content_field = json_content_field;
feed.json_time_field = json_time_field;
feed.json_image_field = json_image_field;
feed.json_link_mode = json_link_mode;
feed.json_link_field = json_link_field;
feed.json_link_template = json_link_template;
}else{
var title_field = $("#manual-rss-title-field").val();
var link_field = $("#manual-rss-link-field").val();
var image_field = $("#manual-rss-image-field").val();
if(!title_field || !link_field){
alert("請把標題欄位、連結欄位填寫完整");
return;
}
feed.is_rss = true;
feed.rss_title_field = title_field;
feed.rss_link_field = link_field;
feed.rss_image_field = image_field;
}
var channel = {key: channel_key, title: title};
subscribeFeed($("<div></div>"), feed, channel);
})
}
var getChannelList = function(){
displayLoading(true,"Fetching channels from " + site_url);
$.ajax({
url : "/admin/feeds/get_channel_list",
data : {"url" : site_url},
dataType : "json",
type : "get"
}).done(function(channels){
if (channels != null){
$.each(channels.channels,function(index,channel){
var ch = $("<div id='" + channel.key + "-channel' class='module cursor-pointer'><div class='lead muted'><i class='" + channel.app_icon + "'></i><br/><span style='font-size:14px;'>" + channel.title + "</span></div></div>");
ch.on("click",function(){
getFeedList(channel);
})
$("#channels").append(ch);
})
setTimeout(function(){
displayLoading(false);
setTimeout(function(){$("#channels").fadeIn();},500);
},1000);
}
else{
alert('Feed not found')
window.location.href = window.location.href
}
})
}
var getFeedList = function(channel){
$("#channels").fadeOut(function(){
$("#channels").html("");
displayLoading(true,"Fetching feed list for " + channel.title);
var data_to_send = {"url" : site_url, "channel" : channel.key, "feed_list_url" : channel.url};
if (channel.feeds){
data_to_send.feeds = JSON.stringify(channel.feeds)
}
console.log(data_to_send)
$.ajax({
url : "/admin/feeds/get_feed_list",
data : data_to_send,
dataType : "json",
type : "post"
}).done(function(data){
$.each(data.feeds, function(index,feed){
var klass = (feed.subscribed ? "active" : "");
var f = $("<div class='module cursor-pointer " + klass + "'><div class='lead muted'><i class='icons-text-2'></i><br/><span style='font-size:14px;'>" + feed.title_translations[I18n.locale] + "</span></div></div>");
f.on("click",function(){
if($(this).hasClass("active")){
if(confirm("Are you sure, you want to unsubscribe from " + feed.title_translations[I18n.locale] + "?")){
unsubscribeFeed($(this),feed);
}
}else{
subscribeFeed($(this),feed,channel);
}
})
$("#channels").append(f);
})
setTimeout(function(){
displayLoading(false);
setTimeout(function(){$("#channels").fadeIn();},500);
},1000);
})
})
}
var unsubscribeFeed = function(dom,feed){
dom.removeClass("active");
$.ajax({
url : "/admin/feeds/unsubscribe",
data : {"feed_uid": feed.uid},
dataType : "json",
type : "post"
}).done(function(){
$("#selectCategoryModal").modal("hide");
})
}
var subscribeFeed = function(dom,feed,channel){
var subscribe_button = $("#subscribe-button"),
select = $("#local-category");
$("#selectCategoryModal").modal("show");
subscribe_button.attr("disabled","disabled");
$.ajax({
url : "/admin/feeds/get_category_list",
data : {"channel" : channel.key},
dataType : "json",
type : "get"
}).done(function(data){
select.html("");
$.each(data.categories,function(index,category){
select.append("<option value='" + category.id + "'>" + category.title + "</option>");
})
subscribe_button.removeAttr("disabled");
})
subscribe_button.unbind("click");
subscribe_button.on("click",function(){
dom.addClass("active");
subscribe_button.attr("disabled","disabled");
$.ajax({
url : "/admin/feeds/subscribe",
data : {"url" : site_url, "feed" : feed, "channel" : channel.title, "channel_key" : channel.key, "category" : select.val()},
dataType : "json",
type : "post"
}).done(function(){
subscribe_button.removeAttr("disabled");
$("#selectCategoryModal").modal("hide");
alert("訂閱成功!");
}).fail(function(){
subscribe_button.removeAttr("disabled");
alert("訂閱失敗,請確認欄位設定是否正確,或稍後再試一次");
})
})
}
var displayLoading = function(display, msg){
if(display){
loading.find(".progress_msg").text(msg);
loading.fadeIn();
}else{
loading.find(".progress_msg").text("");
loading.fadeOut();
}
}
})();