Files
feeds/app/assets/javascripts/new_channel.js
T

341 lines
12 KiB
JavaScript

(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();
}
}
})();