TheDesk Miho(ver.7)

This commit is contained in:
cutls 2018-02-04 23:56:31 +09:00
parent 108086c48a
commit df86d32b33
17 changed files with 229 additions and 24 deletions

13
app/css/sort.css Normal file
View File

@ -0,0 +1,13 @@
.drag-content{
width:300px;
max-width:100%;
height:30px;
text-overflow: ellipsis;
cursor:move;
user-select: none;
background-color:#424242;
margin:5px;
border-radius:5px;
color:white;
padding:3px;
}

View File

@ -1,5 +1,7 @@
/*TL CSS(ただしBBCode pulse:master.css/spin:font-awesome*/ /*TL CSS(ただしBBCode pulse:master.css/spin:font-awesome*/
#timeline-container { #timeline-container {
overflow-x: scroll;
overflow-y: hidden;
display: flex; display: flex;
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
@ -8,7 +10,7 @@ iframe {
max-width:100%; max-width:100%;
} }
.box { .box {
overflow-y: hidden; overflow: hidden;
min-width: 300px; min-width: 300px;
height: 100vh; height: 100vh;
flex: 1; flex: 1;
@ -132,7 +134,7 @@ p {
} }
/*black theme*/ /*black theme*/
.blacktheme #notf-box, .notf-box { .blacktheme .notf-box {
background-color: #424242; background-color: #424242;
} }
.blacktheme .modal-footer { .blacktheme .modal-footer {

View File

@ -23,7 +23,7 @@
<script type="text/javascript" src="./js/common/keyshortcut.js"></script> <script type="text/javascript" src="./js/common/keyshortcut.js"></script>
<script type="text/javascript" src="./js/common/modal.js"></script> <script type="text/javascript" src="./js/common/modal.js"></script>
<script> <script>
var ver="Miho (ver.6)"; var ver="Miho (ver.7)";
//betaを入れるとバージョンチェックしない //betaを入れるとバージョンチェックしない
//var ver="beta"; //var ver="beta";
var acct_id=0; var acct_id=0;
@ -316,6 +316,7 @@ var tlid=0;
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="modal-action waves-effect waves-green btn-flat" id="his-history-btn" onclick="historyShow()">一つ前のユーザーデータ</button>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-follow-btn" onclick="follow()">フォロー</a> <a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-follow-btn" onclick="follow()">フォロー</a>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-mute-btn" onclick="mute()">ミュート</a> <a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-mute-btn" onclick="mute()">ミュート</a>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-block-btn" onclick="block()">ブロック</a> <a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-block-btn" onclick="block()">ブロック</a>

View File

@ -10,6 +10,13 @@ $(function($) {
return false; return false;
} }
} }
//Shift+Enter:Markdown
if (event.shiftKey) {
if (e.keyCode === 13) {
brInsert(" \n");
return false;
}
}
//Esc:消す //Esc:消す
if (e.keyCode === 27) { if (e.keyCode === 27) {
hide(); hide();

View File

@ -112,3 +112,9 @@ function emojiInsert(code, del) {
} }
$("#textarea").focus(); $("#textarea").focus();
} }
//改行挿入
function brInsert(code) {
var now = $("#textarea").val();
$("#textarea").val(now + code);
$("#textarea").focus();
}

View File

@ -46,8 +46,13 @@ function additional(acct_id, tlid) {
$("[toot-id=" + id + "]").addClass("parsed"); $("[toot-id=" + id + "]").addClass("parsed");
} }
}); });
}else{
$(this).attr("title",text);
} }
}); });
$("#timeline_" + tlid + " .toot:not(:has(a:not(.add-show)))").each(function(i, elem) {
$(this).parent().find(".add-show").hide();
});
//Markdownイメージビューワー //Markdownイメージビューワー
$("#timeline_" + tlid + " .toot a:not(.img-parsed):has(img)").each(function(i, elem) { $("#timeline_" + tlid + " .toot a:not(.img-parsed):has(img)").each(function(i, elem) {
var ilink=$(this).attr("href"); var ilink=$(this).attr("href");
@ -61,6 +66,50 @@ function additional(acct_id, tlid) {
}); });
} }
function additionalIndv(tlid, acct_id, id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var text = $("[toot-id="+id+"] .toot a").attr('href');
var urls = text.match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/media\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/
);
if (urls) {
$("[toot-id="+id+"] .toot a").remove();
} else {
var id = $("[toot-id="+id+"] .toot a").parents('.cvo').attr("toot-id");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/card";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
//body: JSON.stringify({})
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
console.log(json);
if (json.title) {
$("[toot-id=" + id + "] .additional").html(
"<span class=\"gray\">URLチェック:<br>Title:" + json.title + "<br>" +
json.description + "</span>");
}
if (json.html) {
$("[toot-id=" + id + "] .additional").html(json.html);
}
if (json.title) {
$("[toot-id=" + id + "] a:not(.parsed)").addClass("parsed");
$("[toot-id=" + id + "]").addClass("parsed");
}
});
}
}
//各TL上方のLink[On/Off] //各TL上方のLink[On/Off]
function cardToggle(tlid) { function cardToggle(tlid) {
var card = localStorage.getItem("card_" + tlid); var card = localStorage.getItem("card_" + tlid);

View File

@ -33,13 +33,14 @@ function notf(acct_id, tlid, sys) {
at; at;
console.log(start); console.log(start);
var websocket = new WebSocket(start); var wsid = websocketNotf.length;
console.log(websocket); websocketNotf[wsid] = new WebSocket(start);
websocket.onopen = function(mess) { console.log(websocketNotf);
websocketNotf[wsid].onopen = function(mess) {
console.log("Connect Streaming API:"); console.log("Connect Streaming API:");
console.log(mess); console.log(mess);
} }
websocket.onmessage = function(mess) { websocketNotf[wsid].onmessage = function(mess) {
console.log("Receive Streaming API:"); console.log("Receive Streaming API:");
var obj = JSON.parse(JSON.parse(mess.data).payload); var obj = JSON.parse(JSON.parse(mess.data).payload);
@ -62,7 +63,7 @@ function notf(acct_id, tlid, sys) {
} }
} }
websocket.onerror = function(error) { websocketNotf[wsid].onerror = function(error) {
console.error('WebSocket Error ' + error); console.error('WebSocket Error ' + error);
}; };
} }

View File

@ -177,7 +177,8 @@ function parse(obj, mix, acct_id) {
api_spoil + ' cw_text_' + toot.id + '">' + spoil + spoiler_show + api_spoil + ' cw_text_' + toot.id + '">' + spoil + spoiler_show +
'</span>' + '</span>' +
'' + viewer + '' + '' + viewer + '' +
'<div class="additional"></div><span class="cbadge"><i class="fa fa-clock-o"></i>' + '<div class="additional"><a onclick="additionalIndv(\'' + tlid + '\',' + acct_id +
',\''+id+'\')" class="add-show pointer">URL解析</a></div><span class="cbadge"><i class="fa fa-clock-o"></i>' +
date(toot.created_at, datetype) + '</span>' + date(toot.created_at, datetype) + '</span>' +
'<span class="cbadge">via ' + via + '<span class="cbadge">via ' + via +
'<help class="white-text">どこから投稿したか</help></span>' + mentions + tags + '<help class="white-text">どこから投稿したか</help></span>' + mentions + tags +

View File

@ -139,6 +139,11 @@ function moreload(type, tlid) {
var acct_id = obj[tlid].domain; var acct_id = obj[tlid].domain;
if (!type) { if (!type) {
var type = obj[tlid].type; var type = obj[tlid].type;
}else{
var data;
}
if(type=="tag"){
var data=obj[tlid].data;
} }
var sid = $("#timeline_" + tlid + " .cvo").last().attr("toot-id"); var sid = $("#timeline_" + tlid + " .cvo").last().attr("toot-id");
console.log(localStorage.getItem("morelock") + ":" + sid) console.log(localStorage.getItem("morelock") + ":" + sid)
@ -152,7 +157,7 @@ function moreload(type, tlid) {
todo(cap(type) + " TL MoreLoading"); todo(cap(type) + " TL MoreLoading");
var domain = localStorage.getItem("domain_" + acct_id); var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at"); var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/timelines/" + com(type) + var start = "https://" + domain + "/api/v1/timelines/" + com(type,data) +
"max_id=" + sid; "max_id=" + sid;
fetch(start, { fetch(start, {
method: 'GET', method: 'GET',
@ -206,6 +211,14 @@ function tlCloser() {
}); });
websocketLocal = []; websocketLocal = [];
Object.keys(websocketNotf).forEach(function(tlid) {
if (websocketNotf[tlid]) {
websocketNotf[tlid].close();
console.log("Close Streaming API:Notf" + tlid);
}
});
websocketLocal = [];
} }
//TLのタイトル //TLのタイトル

13
app/js/ui/jquery-ui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -4,6 +4,7 @@
var websocket = []; var websocket = [];
var websocketHome = []; var websocketHome = [];
var websocketLocal = []; var websocketLocal = [];
var websocketNotf = [];
//カラム追加ボックストグル //カラム追加ボックストグル
function addToggle() { function addToggle() {
@ -53,7 +54,7 @@
tlCloser(); tlCloser();
Object.keys(obj).forEach(function(key) { Object.keys(obj).forEach(function(key) {
var acct = obj[key]; var acct = obj[key];
var html = '<div class="box" id="timeline_' + key + '_box" tlid="' + key + var html = '<div class="box" id="timeline_box_' + key + '_box" tlid="' + key +
'"><div class="notice-box"><span id="notice_' + key + '"></span><br>' + '"><div class="notice-box"><span id="notice_' + key + '"></span><br>' +
'<a onclick="notfToggle(' + acct.domain + ',' + key + '<a onclick="notfToggle(' + acct.domain + ',' + key +
')" class="setting nex" title="このアカウントの通知"><i class="material-icons nex notf-icon_' + ')" class="setting nex" title="このアカウントの通知"><i class="material-icons nex notf-icon_' +
@ -65,8 +66,8 @@
key + '">On</span></a><a onclick="goTop(' + key + ')" class="setting nex"><i class="material-icons nex" title="一番上へ">vertical_align_top</i></a>' + key + '">On</span></a><a onclick="goTop(' + key + ')" class="setting nex"><i class="material-icons nex" title="一番上へ">vertical_align_top</i></a>' +
'<div class="hide notf-indv-box" id="notf-box_' + key + '<div class="hide notf-indv-box" id="notf-box_' + key +
'"><div id="notifications_' + key + '"><div id="notifications_' + key +
'"></div></div></div><div class="tl-box"><div id="timeline_' + key + '"></div></div></div><div class="tl-box" tlid="' + key + '"><div id="timeline_' + key +
'" class="tl"></div></div></div>'; '" class="tl" tlid="' + key + '"></div></div></div>';
$("#timeline-container").append(html); $("#timeline-container").append(html);
if (acct.data) { if (acct.data) {
var data = acct.data; var data = acct.data;

View File

@ -1,13 +1,13 @@
//スクロールで続きを読む //スクロールで続きを読む
function scrollevent() { function scrollevent() {
$(".box").scroll(function() { $(".tl-box").scroll(function() {
scrollck(); scrollck();
}); });
} }
scrollevent(); scrollevent();
function scrollck() { function scrollck() {
$(".box").each(function(i, elem) { $(".tl-box").each(function(i, elem) {
var tlid = $(this).attr('tlid'); var tlid = $(this).attr('tlid');
//一番上ならためていた新しいトゥートを表示 //一番上ならためていた新しいトゥートを表示
if ($(this).scrollTop() == 0) { if ($(this).scrollTop() == 0) {

View File

@ -131,6 +131,8 @@ function load() {
var img = "no-act"; var img = "no-act";
} }
$("#i_" + img).prop("checked", true); $("#i_" + img).prop("checked", true);
//並べ替え
sortload();
} }
//最初に読む //最初に読む
load(); load();

74
app/js/ui/sort.js Normal file
View File

@ -0,0 +1,74 @@
//ソートデータ読み込み
function sortload(){
var col = localStorage.getItem("column");
if (col) {
var obj = JSON.parse(col);
}
Object.keys(obj).forEach(function(key) {
var acct = obj[key];
var flag="false";
if(localStorage.getItem("card_" + key)=="true"){
flag="true"
}
var html='<li class="drag-content" data-id="'+key+'" data-flag="'+flag+'">'+localStorage.getItem("domain_" + acct.domain)+" "+cap(acct.type, acct.data)+' TL</li>';
$("#sort").append(html);
});
drag();
}
//TLのタイトル
function cap(type, data) {
if (type == "home") {
return "Home"
} else if (type == "local") {
return "Local"
} else if (type == "pub") {
return "Public"
} else if (type == "tag") {
return "#" + data
} else if (type == "list") {
return "List(id:" + data + ")"
} else if (type == "notf") {
return "Notification"
}
}
//jquery-ui依存
function drag(){
$('#sort').sortable();
$('#sort').disableSelection();
}
//ソート指定
function sort(){
var arr=[];
var flags=[];
$(".drag-content").each(function(i, elem) {
var id=$(this).attr("data-id");
var flag=$(this).attr("data-flag");
arr.push(id)
flags.push(flag);
});
var col = localStorage.getItem("column");
var obj = JSON.parse(col);
var newobj=[];
for(i=0;i<arr.length;i++){
var data=obj[arr[i]];
var add = {
domain: data.domain,
type: data.type,
data:data.data
};
newobj.push(add);
if(flags[i]=="true"){
localStorage.setItem("card_" + i, "true");
}else{
localStorage.removeItem("card_" + i);
}
}
var json = JSON.stringify(newobj);
localStorage.setItem("column", json);
$("#sort").html("");
Materialize.toast("並べ替え完了。", 3000);
sortload();
}

View File

@ -1,4 +1,5 @@
//ユーザーデータ表示 //ユーザーデータ表示
localStorage.removeItem("history");
function udg(user, acct_id) { function udg(user, acct_id) {
if (!user) { if (!user) {
user = localStorage.getItem("user-id"); user = localStorage.getItem("user-id");
@ -19,6 +20,13 @@ function udg(user, acct_id) {
todo(error); todo(error);
console.error(error); console.error(error);
}).then(function(json) { }).then(function(json) {
//一つ前のユーザーデータ
if (!localStorage.getItem("history")){
$("#his-history-btn").prop("disabled",true);
}else{
$("#his-history-btn").prop("disabled",false);
$('#his-data').attr("history", localStorage.getItem("history"));
}
//moved設定時 //moved設定時
if (json.moved) { if (json.moved) {
Materialize.toast( Materialize.toast(
@ -48,6 +56,7 @@ function udg(user, acct_id) {
$('ul.tabs').tabs(); $('ul.tabs').tabs();
$('#his-data').css('background-size', 'cover'); $('#his-data').css('background-size', 'cover');
$("#his-since").text(crat(json.created_at)); $("#his-since").text(crat(json.created_at));
localStorage.setItem("history" , user);
} }
//自分の時 //自分の時
if (json.acct == localStorage.getItem("user")) { if (json.acct == localStorage.getItem("user")) {
@ -71,6 +80,12 @@ function udg(user, acct_id) {
todc(); todc();
}); });
} }
//一つ前のユーザーデータ表示
function historyShow(){
var acct_id=$('#his-data').attr("use-acct");
var user=$('#his-data').attr("history");
udg(user, acct_id, "true")
}
//FF関係取得 //FF関係取得
function relations(user, acct_id) { function relations(user, acct_id) {
@ -163,4 +178,6 @@ function hisclose() {
$("#his-data-nav").show(); $("#his-data-nav").show();
$(".cont-series").html(""); $(".cont-series").html("");
$("#domainblock").val(""); $("#domainblock").val("");
$('#his-data').attr("history", "");
localStorage.removeItem("history");
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "TheDesk", "name": "TheDesk",
"version": "11.6.0", "version": "11.7.0",
"description": "TheDesk on Mastodonはシンプルと多機能を両立したデスクトップ向けクライアントです", "description": "TheDesk on Mastodonはシンプルと多機能を両立したデスクトップ向けクライアントです",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {

View File

@ -8,16 +8,18 @@
<link href='./css/font-awesome.css' rel='stylesheet' type='text/css'> <link href='./css/font-awesome.css' rel='stylesheet' type='text/css'>
<link href='./css/tl.css' rel='stylesheet' type='text/css'> <link href='./css/tl.css' rel='stylesheet' type='text/css'>
<link href='./css/userdata.css' rel='stylesheet' type='text/css'> <link href='./css/userdata.css' rel='stylesheet' type='text/css'>
<link href='./css/sort.css' rel='stylesheet' type='text/css'>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300" rel="stylesheet">
<meta charset="utf-8"> <meta charset="utf-8">
</head> </head>
<body id="mainView"> <body id="mainView" style="overflow-y:scroll">
<script type="text/javascript" src="./js/common/jquery.js"></script> <script type="text/javascript" src="./js/common/jquery.js"></script>
<script type="text/javascript" src="./js/platform/first.js"></script> <script type="text/javascript" src="./js/platform/first.js"></script>
<script type="text/javascript" src="./js/common/materialize.js"></script> <script type="text/javascript" src="./js/common/materialize.js"></script>
<script type="text/javascript" src="./js/ui/tips.js"></script> <script type="text/javascript" src="./js/ui/tips.js"></script>
<script type="text/javascript" src="./js/common/time.js"></script> <script type="text/javascript" src="./js/common/time.js"></script>
<script type="text/javascript" src="./js/common/modal.js"></script> <script type="text/javascript" src="./js/common/modal.js"></script>
<script type="text/javascript" src="./js/ui/jquery-ui.min.js"></script>
<div id="tools"> <div id="tools">
<div id="notice" >Settings</div> <div id="notice" >Settings</div>
<a onclick="notfToggle()" class="setting nex"><i class="material-icons nex notf-icon">notifications</i></a> <a onclick="notfToggle()" class="setting nex"><i class="material-icons nex notf-icon">notifications</i></a>
@ -26,6 +28,9 @@
</div> </div>
<div id="notf-box" class="hide"><div id="notifications">Notifications will be showed here...</div><button class="btn waves-effect orange more-hide" style="width:calc( 100% - 10px); padding:0;" onclick="notfToggle()">閉じる</button></div> <div id="notf-box" class="hide"><div id="notifications">Notifications will be showed here...</div><button class="btn waves-effect orange more-hide" style="width:calc( 100% - 10px); padding:0;" onclick="notfToggle()">閉じる</button></div>
<a href="acct.html" class="btn waves-effect blue nex" style="width:100%; max-width:400px;">アカウントマネージャー</a><br> <a href="acct.html" class="btn waves-effect blue nex" style="width:100%; max-width:400px;">アカウントマネージャー</a><br>
<h5>カラム並べ替え</H5>
<ul id="sort"></ul>
<button onclick="sort()" class="btn waves-effect light-blue nex" style="width:100%; max-width:200px;">並べ替え設定</button><br><br><br>
<h5>時間表記設定</h5> <h5>時間表記設定</h5>
相対時間の例:"1分前","3日前"<br> 相対時間の例:"1分前","3日前"<br>
絶対時間の例"23:25:21","2017年12月30日 23:59:00"<br> 絶対時間の例"23:25:21","2017年12月30日 23:59:00"<br>
@ -105,9 +110,7 @@
<button class="btn waves-effect" style="width:100%; max-width:200px;" onclick="settings()">設定</button><br> <button class="btn waves-effect" style="width:100%; max-width:200px;" onclick="settings()">設定</button><br>
<br> <br>
<button class="btn waves-effect red" style="width:100%; max-width:200px;" onclick="if(confirm('初期化します')){ localStorage.clear(); location.href='index.html'; }">初期化</button><br> <br><br>
<a href="index.html" class="btn waves-effect orange nex" style="width:100%; max-width:200px;">戻る</a><br> <a href="index.html" class="btn waves-effect orange nex" style="width:100%; max-width:200px;">戻る</a><br>
<br> <br>
キーボードショートカット一覧<br> キーボードショートカット一覧<br>
@ -119,6 +122,7 @@ L:Local TL<br>
P:連合 TL<br> P:連合 TL<br>
[スペース]+Shift:更新<br> [スペース]+Shift:更新<br>
<br> <br>
<button class="btn waves-effect red" style="width:100%; max-width:500px;" onclick="if(confirm('初期化します')){ localStorage.clear(); location.href='index.html'; }">初期化</button><br>
<button class="btn waves-effect indigo" onclick="about()" style="width:100%; max-width:500px;">このソフトについて</button><br> <button class="btn waves-effect indigo" onclick="about()" style="width:100%; max-width:500px;">このソフトについて</button><br>
<a href="https://desk.cutls.com" class="btn waves-effect deep-purple lighten-2" style="width:100%; max-width:500px;">公式HP</a><br> <a href="https://desk.cutls.com" class="btn waves-effect deep-purple lighten-2" style="width:100%; max-width:500px;">公式HP</a><br>
<a href="https://enty.jp/Cutls" class="btn waves-effect purple lighten-2" style="width:100%; max-width:500px;">寄付(Enty)</a><br> <a href="https://enty.jp/Cutls" class="btn waves-effect purple lighten-2" style="width:100%; max-width:500px;">寄付(Enty)</a><br>
@ -169,6 +173,7 @@ Developer: <a onclick="udg('12336')" style="cursor:pointer" class="nex pointer">
<script type="text/javascript" src="./js/common/about.js"></script> <script type="text/javascript" src="./js/common/about.js"></script>
<script type="text/javascript" src="./js/platform/end.js"></script> <script type="text/javascript" src="./js/platform/end.js"></script>
<script type="text/javascript" src="./js/login/logout.js"></script> <script type="text/javascript" src="./js/login/logout.js"></script>
<script type="text/javascript" src="./js/ui/sort.js"></script>
<script type="text/javascript" src="./js/ui/settings.js"></script> <script type="text/javascript" src="./js/ui/settings.js"></script>
<script type="text/javascript" src="./js/ui/theme.js"></script> <script type="text/javascript" src="./js/ui/theme.js"></script>
<script type="text/javascript" src="./js/userdata/showOnTL.js"></script> <script type="text/javascript" src="./js/userdata/showOnTL.js"></script>