341 lines
12 KiB
JavaScript
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();
|
||
}
|
||
}
|
||
})();
|