wip
This commit is contained in:
parent
3a39a36bed
commit
2a3a5d4b50
35 changed files with 402 additions and 367 deletions
|
@ -114,13 +114,13 @@
|
||||||
this.cancel = () => {
|
this.cancel = () => {
|
||||||
this.api('auth/deny', {
|
this.api('auth/deny', {
|
||||||
token: @session.token
|
token: @session.token
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.trigger('denied');
|
this.trigger('denied');
|
||||||
|
|
||||||
this.accept = () => {
|
this.accept = () => {
|
||||||
this.api('auth/accept', {
|
this.api('auth/accept', {
|
||||||
token: @session.token
|
token: @session.token
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.trigger('accepted');
|
this.trigger('accepted');
|
||||||
</script>
|
</script>
|
||||||
</mk-form>
|
</mk-form>
|
||||||
|
|
|
@ -110,7 +110,7 @@
|
||||||
if @session.app.is_authorized
|
if @session.app.is_authorized
|
||||||
this.api('auth/accept', {
|
this.api('auth/accept', {
|
||||||
token: @session.token
|
token: @session.token
|
||||||
.then =>
|
}).then(() => {
|
||||||
@accepted!
|
@accepted!
|
||||||
else
|
else
|
||||||
this.state = 'waiting'
|
this.state = 'waiting'
|
||||||
|
|
8
src/web/app/common/scripts/contains.js
Normal file
8
src/web/app/common/scripts/contains.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module.exports = function(parent, child) {
|
||||||
|
let node = child.parentNode;
|
||||||
|
while (node) {
|
||||||
|
if (node == parent) return true;
|
||||||
|
node = node.parentNode;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -126,7 +126,7 @@
|
||||||
this.api('signin', {
|
this.api('signin', {
|
||||||
username: this.refs.username.value
|
username: this.refs.username.value
|
||||||
password: this.refs.password.value
|
password: this.refs.password.value
|
||||||
.then =>
|
}).then(() => {
|
||||||
location.reload();
|
location.reload();
|
||||||
.catch =>
|
.catch =>
|
||||||
alert 'something happened'
|
alert 'something happened'
|
||||||
|
|
|
@ -277,11 +277,11 @@
|
||||||
username: username,
|
username: username,
|
||||||
password: password,
|
password: password,
|
||||||
'g-recaptcha-response': grecaptcha.getResponse()
|
'g-recaptcha-response': grecaptcha.getResponse()
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.api('signin', {
|
this.api('signin', {
|
||||||
username: username
|
username: username
|
||||||
password: password
|
password: password
|
||||||
.then =>
|
}).then(() => {
|
||||||
location.href = CONFIG.url
|
location.href = CONFIG.url
|
||||||
.catch =>
|
.catch =>
|
||||||
alert '何らかの原因によりアカウントの作成に失敗しました。再度お試しください。'
|
alert '何らかの原因によりアカウントの作成に失敗しました。再度お試しください。'
|
||||||
|
|
|
@ -6,100 +6,92 @@
|
||||||
display block
|
display block
|
||||||
width 256px
|
width 256px
|
||||||
height 256px
|
height 256px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
class Vec2 {
|
||||||
|
constructor(x, y) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.on('mount', () => {
|
this.on('mount', () => {
|
||||||
@draw!
|
this.draw()
|
||||||
this.clock = setInterval @draw, 1000ms
|
this.clock = setInterval(this.draw, 1000);
|
||||||
|
});
|
||||||
|
|
||||||
this.on('unmount', () => {
|
this.on('unmount', () => {
|
||||||
clearInterval @clock
|
clearInterval(this.clock);
|
||||||
|
});
|
||||||
|
|
||||||
this.draw = () => {
|
this.draw = () => {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
s = now.get-seconds!
|
const s = now.getSeconds();
|
||||||
m = now.getMinutes()
|
const m = now.getMinutes();
|
||||||
h = now.getHours()
|
const h = now.getHours();
|
||||||
|
|
||||||
vec2 = (x, y) ->
|
const ctx = this.refs.canvas.getContext('2d');
|
||||||
this.x = x
|
const canvW = this.refs.canvas.width;
|
||||||
this.y = y
|
const canvH = this.refs.canvas.height;
|
||||||
|
ctx.clearRect(0, 0, canvW, canvH);
|
||||||
|
|
||||||
ctx = this.refs.canvas.get-context '2d'
|
{ // 背景
|
||||||
canv-w = this.refs.canvas.width
|
const center = Math.min((canvW / 2), (canvH / 2));
|
||||||
canv-h = this.refs.canvas.height
|
const lineStart = center * 0.90;
|
||||||
ctx.clear-rect 0, 0, canv-w, canv-h
|
const shortLineEnd = center * 0.87;
|
||||||
|
const longLineEnd = center * 0.84;
|
||||||
|
for (let i = 0; i < 60; i++) {
|
||||||
|
const angle = Math.PI * i / 30;
|
||||||
|
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.lineWidth = 1;
|
||||||
|
ctx.moveTo((canv-w / 2) + uv.x * lineStart, (canv-h / 2) + uv.y * lineStart);
|
||||||
|
if (i % 5 == 0) {
|
||||||
|
ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)';
|
||||||
|
ctx.lineTo((canv-w / 2) + uv.x * longLineEnd, (canv-h / 2) + uv.y * longLineEnd);
|
||||||
|
} else {
|
||||||
|
ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';
|
||||||
|
ctx.lineTo((canv-w / 2) + uv.x * shortLineEnd, (canv-h / 2) + uv.y * shortLineEnd);
|
||||||
|
}
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 背景
|
{ // 分
|
||||||
center = (Math.min (canv-w / 2), (canv-h / 2))
|
const angle = Math.PI * (m + s / 60) / 30;
|
||||||
line-start = center * 0.90
|
const length = Math.min(canvW, canvH) / 2.6;
|
||||||
line-end-short = center * 0.87
|
const uv = new vec2(Math.sin(angle), -Math.cos(angle));
|
||||||
line-end-long = center * 0.84
|
ctx.beginPath();
|
||||||
for i from 0 to 59 by 1
|
ctx.strokeStyle = '#ffffff';
|
||||||
angle = Math.PI * i / 30
|
ctx.lineWidth = 2;
|
||||||
uv = new vec2 (Math.sin angle), (-Math.cos angle)
|
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
|
||||||
ctx.begin-path!
|
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
|
||||||
ctx.line-width = 1
|
ctx.stroke();
|
||||||
ctx.move-to do
|
}
|
||||||
(canv-w / 2) + uv.x * line-start
|
|
||||||
(canv-h / 2) + uv.y * line-start
|
|
||||||
if i % 5 == 0
|
|
||||||
ctx.stroke-style = 'rgba(255, 255, 255, 0.2)'
|
|
||||||
ctx.line-to do
|
|
||||||
(canv-w / 2) + uv.x * line-end-long
|
|
||||||
(canv-h / 2) + uv.y * line-end-long
|
|
||||||
else
|
|
||||||
ctx.stroke-style = 'rgba(255, 255, 255, 0.1)'
|
|
||||||
ctx.line-to do
|
|
||||||
(canv-w / 2) + uv.x * line-end-short
|
|
||||||
(canv-h / 2) + uv.y * line-end-short
|
|
||||||
ctx.stroke!
|
|
||||||
|
|
||||||
// 分
|
{ // 時
|
||||||
angle = Math.PI * (m + s / 60) / 30
|
const angle = Math.PI * (h % 12 + m / 60) / 6;
|
||||||
length = (Math.min canv-w, canv-h) / 2.6
|
const length = Math.min(canvW, canvH) / 4;
|
||||||
uv = new vec2 (Math.sin angle), (-Math.cos angle)
|
const uv = new vec2(Math.sin(angle), -Math.cos(angle));
|
||||||
ctx.begin-path!
|
ctx.beginPath();
|
||||||
ctx.stroke-style = '#ffffff'
|
ctx.strokeStyle = CONFIG.themeColor;
|
||||||
ctx.line-width = 2
|
ctx.lineWidth = 2;
|
||||||
ctx.move-to do
|
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
|
||||||
(canv-w / 2) - uv.x * length / 5
|
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
|
||||||
(canv-h / 2) - uv.y * length / 5
|
ctx.stroke();
|
||||||
ctx.line-to do
|
}
|
||||||
(canv-w / 2) + uv.x * length
|
|
||||||
(canv-h / 2) + uv.y * length
|
|
||||||
ctx.stroke!
|
|
||||||
|
|
||||||
// 時
|
{ // 秒
|
||||||
angle = Math.PI * (h % 12 + m / 60) / 6
|
const angle = Math.PI * s / 30;
|
||||||
length = (Math.min canv-w, canv-h) / 4
|
const length = Math.min(canvW, canvH) / 2.6;
|
||||||
uv = new vec2 (Math.sin angle), (-Math.cos angle)
|
const uv = new vec2(Math.sin(angle), -Math.cos(angle));
|
||||||
ctx.begin-path!
|
ctx.beginPath();
|
||||||
#ctx.stroke-style = '#ffffff'
|
ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';
|
||||||
ctx.stroke-style = CONFIG.theme-color
|
ctx.lineWidth = 1;
|
||||||
ctx.line-width = 2
|
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
|
||||||
ctx.move-to do
|
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
|
||||||
(canv-w / 2) - uv.x * length / 5
|
ctx.stroke();
|
||||||
(canv-h / 2) - uv.y * length / 5
|
}
|
||||||
ctx.line-to do
|
};
|
||||||
(canv-w / 2) + uv.x * length
|
|
||||||
(canv-h / 2) + uv.y * length
|
|
||||||
ctx.stroke!
|
|
||||||
|
|
||||||
// 秒
|
|
||||||
angle = Math.PI * s / 30
|
|
||||||
length = (Math.min canv-w, canv-h) / 2.6
|
|
||||||
uv = new vec2 (Math.sin angle), (-Math.cos angle)
|
|
||||||
ctx.begin-path!
|
|
||||||
ctx.stroke-style = 'rgba(255, 255, 255, 0.5)'
|
|
||||||
ctx.line-width = 1
|
|
||||||
ctx.move-to do
|
|
||||||
(canv-w / 2) - uv.x * length / 5
|
|
||||||
(canv-h / 2) - uv.y * length / 5
|
|
||||||
ctx.line-to do
|
|
||||||
(canv-w / 2) + uv.x * length
|
|
||||||
(canv-h / 2) + uv.y * length
|
|
||||||
ctx.stroke!
|
|
||||||
</script>
|
</script>
|
||||||
</mk-analog-clock>
|
</mk-analog-clock>
|
||||||
|
|
|
@ -80,108 +80,118 @@
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
const contains = require('../../common/scripts/contains');
|
||||||
|
|
||||||
this.mixin('api');
|
this.mixin('api');
|
||||||
|
|
||||||
this.q = this.opts.q
|
this.q = this.opts.q;
|
||||||
this.textarea = this.opts.textarea
|
this.textarea = this.opts.textarea;
|
||||||
this.loading = true
|
this.fetching = true;
|
||||||
this.users = []
|
this.users = [];
|
||||||
this.select = -1
|
this.select = -1;
|
||||||
|
|
||||||
this.on('mount', () => {
|
this.on('mount', () => {
|
||||||
@textarea.addEventListener 'keydown' this.on-keydown
|
this.textarea.addEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
all = document.query-selector-all 'body *'
|
document.querySelectorAll('body *').forEach(el => {
|
||||||
Array.prototype.forEach.call all, (el) =>
|
el.addEventListener('mousedown', this.mousedown);
|
||||||
el.addEventListener 'mousedown' @mousedown
|
});
|
||||||
|
|
||||||
this.api('users/search_by_username', {
|
this.api('users/search_by_username', {
|
||||||
query: @q
|
query: this.q,
|
||||||
limit: 30users
|
limit: 30
|
||||||
}).then((users) => {
|
}).then(users => {
|
||||||
this.users = users
|
this.update({
|
||||||
this.loading = false
|
fetching: false,
|
||||||
this.update();
|
users: users
|
||||||
.catch (err) =>
|
});
|
||||||
console.error err
|
});
|
||||||
|
});
|
||||||
|
|
||||||
this.on('unmount', () => {
|
this.on('unmount', () => {
|
||||||
@textarea.removeEventListener 'keydown' this.on-keydown
|
this.textarea.removeEventListener('keydown', this.onKeydown);
|
||||||
|
|
||||||
all = document.query-selector-all 'body *'
|
document.querySelectorAll('body *').forEach(el => {
|
||||||
Array.prototype.forEach.call all, (el) =>
|
el.removeEventListener('mousedown', this.mousedown);
|
||||||
el.removeEventListener 'mousedown' @mousedown
|
});
|
||||||
|
});
|
||||||
|
|
||||||
this.mousedown = (e) => {
|
this.mousedown = e => {
|
||||||
if (!contains this.root, e.target) and (this.root != e.target)
|
if (!contains(this.root, e.target) && (this.root != e.target)) this.close();
|
||||||
@close();
|
};
|
||||||
|
|
||||||
this.on-click = (e) => {
|
this.onClick = e => {
|
||||||
@complete e.item
|
this.complete(e.item);
|
||||||
|
};
|
||||||
|
|
||||||
this.on-keydown = (e) => {
|
this.onKeydown = e => {
|
||||||
key = e.which
|
const cancel = () => {
|
||||||
switch (key)
|
e.preventDefault();
|
||||||
| 10, 13 => // Key[ENTER]
|
e.stopPropagation();
|
||||||
if @select != -1
|
};
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
@complete this.users[@select]
|
|
||||||
else
|
|
||||||
@close();
|
|
||||||
| 27 => // Key[ESC]
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
@close();
|
|
||||||
| 38 => // Key[↑]
|
|
||||||
if @select != -1
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
@select-prev!
|
|
||||||
else
|
|
||||||
@close();
|
|
||||||
| 9, 40 => // Key[TAB] or Key[↓]
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
@select-next!
|
|
||||||
| _ =>
|
|
||||||
@close();
|
|
||||||
|
|
||||||
this.select-next = () => {
|
switch (e.which) {
|
||||||
@select++
|
case 10: // [ENTER]
|
||||||
|
case 13: // [ENTER]
|
||||||
|
if (this.select !== -1) {
|
||||||
|
cancel();
|
||||||
|
this.complete(this.users[this.select]);
|
||||||
|
} else {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
if @select >= this.users.length
|
case 27: // [ESC]
|
||||||
this.select = 0
|
cancel();
|
||||||
|
this.close();
|
||||||
|
break;
|
||||||
|
|
||||||
@apply-select!
|
case 38: // [↑]
|
||||||
|
if (this.select !== -1) {
|
||||||
|
cancel();
|
||||||
|
this.selectPrev();
|
||||||
|
} else {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
this.select-prev = () => {
|
case 9: // [TAB]
|
||||||
@select--
|
case 40: // [↓]
|
||||||
|
cancel();
|
||||||
|
this.selectNext();
|
||||||
|
break;
|
||||||
|
|
||||||
if @select < 0
|
default:
|
||||||
this.select = this.users.length - 1
|
this.close();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@apply-select!
|
this.selectNext = () => {
|
||||||
|
if (++this.select >= this.users.length) this.select = 0;
|
||||||
|
this.applySelect();
|
||||||
|
};
|
||||||
|
|
||||||
this.apply-select = () => {
|
this.selectPrev = () => {
|
||||||
this.refs.users.children.forEach (el) =>
|
if (--this.select < 0) this.select = this.users.length - 1;
|
||||||
el.remove-attribute 'data-selected'
|
this.applySelect();
|
||||||
|
};
|
||||||
|
|
||||||
this.refs.users.children[@select].setAttribute 'data-selected' \true
|
this.applySelect = () => {
|
||||||
this.refs.users.children[@select].focus();
|
this.refs.users.children.forEach(el => {
|
||||||
|
el.removeAttribute('data-selected');
|
||||||
|
});
|
||||||
|
|
||||||
this.complete = (user) => {
|
this.refs.users.children[this.select].setAttribute('data-selected', 'true');
|
||||||
this.opts.complete user
|
this.refs.users.children[this.select].focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.complete = user => {
|
||||||
|
this.opts.complete(user);
|
||||||
|
};
|
||||||
|
|
||||||
this.close = () => {
|
this.close = () => {
|
||||||
this.opts.close();
|
this.opts.close();
|
||||||
|
};
|
||||||
|
|
||||||
function contains(parent, child)
|
|
||||||
node = child.parentNode
|
|
||||||
while node?
|
|
||||||
if node == parent
|
|
||||||
return true
|
|
||||||
node = node.parentNode
|
|
||||||
return false
|
|
||||||
</script>
|
</script>
|
||||||
</mk-autocomplete-suggestion>
|
</mk-autocomplete-suggestion>
|
||||||
|
|
|
@ -106,21 +106,21 @@
|
||||||
if this.user.is_following
|
if this.user.is_following
|
||||||
this.api('following/delete', {
|
this.api('following/delete', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.user.is_following = false
|
this.user.is_following = false
|
||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
console.error err
|
console.error err
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
else
|
else
|
||||||
this.api('following/create', {
|
this.api('following/create', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.user.is_following = true
|
this.user.is_following = true
|
||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
console.error err
|
console.error err
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<mk-contextmenu><yield />
|
<mk-contextmenu>
|
||||||
|
<yield />
|
||||||
<style>
|
<style>
|
||||||
:scope
|
:scope
|
||||||
$width = 240px
|
$width = 240px
|
||||||
|
@ -94,46 +95,45 @@
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
this.root.addEventListener 'contextmenu' (e) =>
|
const contains = require('../../common/scripts/contains');
|
||||||
|
|
||||||
|
this.root.addEventListener('contextmenu', e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
this.mousedown = (e) => {
|
this.mousedown = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (!contains this.root, e.target) and (this.root != e.target)
|
if (!contains(this.root, e.target) && (this.root != e.target)) this.close();
|
||||||
@close();
|
return false;
|
||||||
return false
|
};
|
||||||
|
|
||||||
this.open = (pos) => {
|
this.open = pos => {
|
||||||
all = document.query-selector-all 'body *'
|
document.querySelectorAll('body *').forEach(el => {
|
||||||
Array.prototype.forEach.call all, (el) =>
|
el.addEventListener('mousedown', this.mousedown);
|
||||||
el.addEventListener 'mousedown' @mousedown
|
});
|
||||||
this.root.style.display = 'block'
|
|
||||||
this.root.style.left = pos.x + 'px'
|
|
||||||
this.root.style.top = pos.y + 'px'
|
|
||||||
|
|
||||||
Velocity(this.root, 'finish' true
|
this.root.style.display = 'block';
|
||||||
Velocity(this.root, { opacity: 0 } 0ms
|
this.root.style.left = pos.x + 'px';
|
||||||
|
this.root.style.top = pos.y + 'px';
|
||||||
|
|
||||||
|
Velocity(this.root, 'finish', true);
|
||||||
|
Velocity(this.root, { opacity: 0 }, 0);
|
||||||
Velocity(this.root, {
|
Velocity(this.root, {
|
||||||
opacity: 1
|
opacity: 1
|
||||||
}, {
|
}, {
|
||||||
queue: false
|
queue: false,
|
||||||
duration: 100ms
|
duration: 100,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
}
|
});
|
||||||
|
};
|
||||||
|
|
||||||
this.close = () => {
|
this.close = () => {
|
||||||
all = document.query-selector-all 'body *'
|
document.querySelectorAll('body *').forEach(el => {
|
||||||
Array.prototype.forEach.call all, (el) =>
|
el.removeEventListener('mousedown', this.mousedown);
|
||||||
el.removeEventListener 'mousedown' @mousedown
|
});
|
||||||
|
|
||||||
this.trigger('closed');
|
this.trigger('closed');
|
||||||
this.unmount();
|
this.unmount();
|
||||||
|
};
|
||||||
function contains(parent, child)
|
|
||||||
node = child.parentNode
|
|
||||||
while (node != null)
|
|
||||||
if (node == parent)
|
|
||||||
return true
|
|
||||||
node = node.parentNode
|
|
||||||
return false
|
|
||||||
</script>
|
</script>
|
||||||
</mk-contextmenu>
|
</mk-contextmenu>
|
||||||
|
|
|
@ -79,69 +79,72 @@
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
this.can-through = if opts.can-through? then opts.can-through else true
|
this.canThrough = opts.canThrough != null ? opts.canThrough : true;
|
||||||
this.opts.buttons.forEach (button) =>
|
this.opts.buttons.forEach(button => {
|
||||||
button._onclick = =>
|
button._onclick = () => {
|
||||||
if button.onclick?
|
if (button.onclick) button.onclick();
|
||||||
button.onclick();
|
this.close();
|
||||||
@close();
|
};
|
||||||
|
});
|
||||||
|
|
||||||
this.on('mount', () => {
|
this.on('mount', () => {
|
||||||
this.refs.header.innerHTML = this.opts.title
|
this.refs.header.innerHTML = this.opts.title;
|
||||||
this.refs.body.innerHTML = this.opts.text
|
this.refs.body.innerHTML = this.opts.text;
|
||||||
|
|
||||||
this.refs.bg.style.pointer-events = 'auto'
|
this.refs.bg.style.pointerEvents = 'auto';
|
||||||
Velocity(this.refs.bg, 'finish' true
|
Velocity(this.refs.bg, 'finish', true);
|
||||||
Velocity(this.refs.bg, {
|
Velocity(this.refs.bg, {
|
||||||
opacity: 1
|
opacity: 1
|
||||||
}, {
|
}, {
|
||||||
queue: false
|
queue: false,
|
||||||
duration: 100ms
|
duration: 100,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
}
|
});
|
||||||
|
|
||||||
Velocity(this.refs.main, {
|
Velocity(this.refs.main, {
|
||||||
opacity: 0
|
opacity: 0,
|
||||||
scale: 1.2
|
scale: 1.2
|
||||||
}, {
|
}, {
|
||||||
duration: 0
|
duration: 0
|
||||||
}
|
});
|
||||||
Velocity(this.refs.main, {
|
Velocity(this.refs.main, {
|
||||||
opacity: 1
|
opacity: 1,
|
||||||
scale: 1
|
scale: 1
|
||||||
}, {
|
}, {
|
||||||
duration: 300ms
|
duration: 300,
|
||||||
easing: [ 0, 0.5, 0.5, 1 ]
|
easing: [ 0, 0.5, 0.5, 1 ]
|
||||||
}
|
});
|
||||||
|
});
|
||||||
|
|
||||||
this.close = () => {
|
this.close = () => {
|
||||||
this.refs.bg.style.pointer-events = 'none'
|
this.refs.bg.style.pointerEvents = 'none';
|
||||||
Velocity(this.refs.bg, 'finish' true
|
Velocity(this.refs.bg, 'finish', true);
|
||||||
Velocity(this.refs.bg, {
|
Velocity(this.refs.bg, {
|
||||||
opacity: 0
|
opacity: 0
|
||||||
}, {
|
}, {
|
||||||
queue: false
|
queue: false,
|
||||||
duration: 300ms
|
duration: 300,
|
||||||
easing: 'linear'
|
easing: 'linear'
|
||||||
}
|
});
|
||||||
|
|
||||||
this.refs.main.style.pointer-events = 'none'
|
this.refs.main.style.pointerEvents = 'none';
|
||||||
Velocity(this.refs.main, 'finish' true
|
Velocity(this.refs.main, 'finish', true);
|
||||||
Velocity(this.refs.main, {
|
Velocity(this.refs.main, {
|
||||||
opacity: 0
|
opacity: 0,
|
||||||
scale: 0.8
|
scale: 0.8
|
||||||
}, {
|
}, {
|
||||||
queue: false
|
queue: false,
|
||||||
duration: 300ms
|
duration: 300,
|
||||||
easing: [ 0.5, -0.5, 1, 0.5 ]
|
easing: [ 0.5, -0.5, 1, 0.5 ],
|
||||||
complete: =>
|
complete: () => this.unmount()
|
||||||
this.unmount();
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
this.bg-click = () => {
|
this.bgClick = () => {
|
||||||
if @can-through
|
if (this.canThrough) {
|
||||||
if this.opts.on-through?
|
if (this.opts.onThrough) this.opts.onThrough();
|
||||||
this.opts.on-through!
|
this.close();
|
||||||
@close();
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
</mk-dialog>
|
</mk-dialog>
|
||||||
|
|
|
@ -408,7 +408,7 @@
|
||||||
this.api('drive/files/update', {
|
this.api('drive/files/update', {
|
||||||
file_id: file
|
file_id: file
|
||||||
folder_id: if this.folder? then this.folder.id else null
|
folder_id: if this.folder? then this.folder.id else null
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err, text-status) =>
|
.catch (err, text-status) =>
|
||||||
console.error err
|
console.error err
|
||||||
|
@ -425,7 +425,7 @@
|
||||||
this.api('drive/folders/update', {
|
this.api('drive/folders/update', {
|
||||||
folder_id: folder
|
folder_id: folder
|
||||||
parent_id: if this.folder? then this.folder.id else null
|
parent_id: if this.folder? then this.folder.id else null
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err) =>
|
.catch (err) =>
|
||||||
if err == 'detected-circular-definition'
|
if err == 'detected-circular-definition'
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
this.api('drive/files/update', {
|
this.api('drive/files/update', {
|
||||||
file_id: this.file.id
|
file_id: this.file.id
|
||||||
name: name
|
name: name
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err) =>
|
.catch (err) =>
|
||||||
console.error err
|
console.error err
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
this.api('drive/folders/update', {
|
this.api('drive/folders/update', {
|
||||||
folder_id: this.folder.id
|
folder_id: this.folder.id
|
||||||
name: name
|
name: name
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err) =>
|
.catch (err) =>
|
||||||
console.error err
|
console.error err
|
||||||
|
|
|
@ -118,7 +118,7 @@
|
||||||
this.api('drive/files/update', {
|
this.api('drive/files/update', {
|
||||||
file_id: file
|
file_id: file
|
||||||
folder_id: this.folder.id
|
folder_id: this.folder.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err, text-status) =>
|
.catch (err, text-status) =>
|
||||||
console.error err
|
console.error err
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
this.api('drive/folders/update', {
|
this.api('drive/folders/update', {
|
||||||
folder_id: folder
|
folder_id: folder
|
||||||
parent_id: this.folder.id
|
parent_id: this.folder.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err) =>
|
.catch (err) =>
|
||||||
if err == 'detected-circular-definition'
|
if err == 'detected-circular-definition'
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
this.api('drive/files/update', {
|
this.api('drive/files/update', {
|
||||||
file_id: file
|
file_id: file
|
||||||
folder_id: if this.folder? then this.folder.id else null
|
folder_id: if this.folder? then this.folder.id else null
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err, text-status) =>
|
.catch (err, text-status) =>
|
||||||
console.error err
|
console.error err
|
||||||
|
@ -87,7 +87,7 @@
|
||||||
this.api('drive/folders/update', {
|
this.api('drive/folders/update', {
|
||||||
folder_id: folder
|
folder_id: folder
|
||||||
parent_id: if this.folder? then this.folder.id else null
|
parent_id: if this.folder? then this.folder.id else null
|
||||||
.then =>
|
}).then(() => {
|
||||||
// something
|
// something
|
||||||
.catch (err, text-status) =>
|
.catch (err, text-status) =>
|
||||||
console.error err
|
console.error err
|
||||||
|
|
|
@ -33,9 +33,5 @@
|
||||||
40%
|
40%
|
||||||
transform scale(1)
|
transform scale(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</mk-ellipsis-icon>
|
</mk-ellipsis-icon>
|
||||||
|
|
|
@ -103,21 +103,21 @@
|
||||||
if this.user.is_following
|
if this.user.is_following
|
||||||
this.api('following/delete', {
|
this.api('following/delete', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.user.is_following = false
|
this.user.is_following = false
|
||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
console.error err
|
console.error err
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
else
|
else
|
||||||
this.api('following/create', {
|
this.api('following/create', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.user.is_following = true
|
this.user.is_following = true
|
||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
console.error err
|
console.error err
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
<mk-go-top>
|
|
||||||
<button class="hidden" title="一番上へ"><i class="fa fa-angle-up"></i></button>
|
|
||||||
<script>
|
|
||||||
window.addEventListener 'load' this.on-scroll
|
|
||||||
window.addEventListener 'scroll' this.on-scroll
|
|
||||||
window.addEventListener 'resize' this.on-scroll
|
|
||||||
|
|
||||||
this.on-scroll = () => {
|
|
||||||
if $ window .scroll-top! > 500px
|
|
||||||
@remove-class 'hidden'
|
|
||||||
else
|
|
||||||
@add-class 'hidden'
|
|
||||||
</script>
|
|
||||||
</mk-go-top>
|
|
|
@ -39,7 +39,7 @@
|
||||||
|
|
||||||
this.click = () => {
|
this.click = () => {
|
||||||
dialog = document.body.appendChild(document.createElement('mk-image-dialog'));
|
dialog = document.body.appendChild(document.createElement('mk-image-dialog'));
|
||||||
riot.mount dialog, do
|
riot.mount dialog, do
|
||||||
image: @image
|
image: @image
|
||||||
</script>
|
</script>
|
||||||
</mk-images-viewer>
|
</mk-images-viewer>
|
||||||
|
|
|
@ -16,7 +16,6 @@ require('./crop-window.tag');
|
||||||
require('./settings.tag');
|
require('./settings.tag');
|
||||||
require('./settings-window.tag');
|
require('./settings-window.tag');
|
||||||
require('./analog-clock.tag');
|
require('./analog-clock.tag');
|
||||||
require('./go-top.tag');
|
|
||||||
require('./ui-header.tag');
|
require('./ui-header.tag');
|
||||||
require('./ui-header-account.tag');
|
require('./ui-header-account.tag');
|
||||||
require('./ui-header-notifications.tag');
|
require('./ui-header-notifications.tag');
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
<mk-input-dialog>
|
<mk-input-dialog>
|
||||||
<mk-window ref="window" is-modal={ true } width={ '500px' }><yield to="header"><i class="fa fa-i-cursor"></i>{ parent.title }</yield>
|
<mk-window ref="window" is-modal={ true } width={ '500px' }>
|
||||||
<yield to="content">
|
<yield to="header">
|
||||||
<div class="body">
|
<i class="fa fa-i-cursor"></i>{ parent.title }
|
||||||
<input ref="text" oninput={ parent.update } onkeydown={ parent.onKeydown } placeholder={ parent.placeholder }/>
|
</yield>
|
||||||
</div>
|
<yield to="content">
|
||||||
<div class="action">
|
<div class="body">
|
||||||
<button class="cancel" onclick={ parent.cancel }>キャンセル</button>
|
<input ref="text" oninput={ parent.update } onkeydown={ parent.onKeydown } placeholder={ parent.placeholder }/>
|
||||||
<button class="ok" disabled={ !parent.allowEmpty && refs.text.value.length == 0 } onclick={ parent.ok }>決定</button>
|
</div>
|
||||||
</div></yield>
|
<div class="action">
|
||||||
|
<button class="cancel" onclick={ parent.cancel }>キャンセル</button>
|
||||||
|
<button class="ok" disabled={ !parent.allowEmpty && refs.text.value.length == 0 } onclick={ parent.ok }>決定</button>
|
||||||
|
</div>
|
||||||
|
</yield>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
<style>
|
<style>
|
||||||
:scope
|
:scope
|
||||||
|
@ -116,18 +120,17 @@
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
this.done = false
|
this.done = false;
|
||||||
|
|
||||||
this.title = this.opts.title
|
this.title = this.opts.title;
|
||||||
this.placeholder = this.opts.placeholder
|
this.placeholder = this.opts.placeholder;
|
||||||
this.default = this.opts.default
|
this.default = this.opts.default;
|
||||||
this.allow-empty = if this.opts.allow-empty? then this.opts.allow-empty else true
|
this.allowEmpty = this.opts.allowEmpty != null ? this.opts.allowEmpty : true;
|
||||||
|
|
||||||
this.on('mount', () => {
|
this.on('mount', () => {
|
||||||
this.text = this.refs.window.refs.text
|
this.text = this.refs.window.refs.text;
|
||||||
if @default?
|
if (this.default) this.text.value = this.default;
|
||||||
@text.value = @default
|
this.text.focus();
|
||||||
@text.focus();
|
|
||||||
|
|
||||||
this.refs.window.on('closing', () => {
|
this.refs.window.on('closing', () => {
|
||||||
if @done
|
if @done
|
||||||
|
@ -138,6 +141,7 @@
|
||||||
|
|
||||||
this.refs.window.on('closed', () => {
|
this.refs.window.on('closed', () => {
|
||||||
this.unmount();
|
this.unmount();
|
||||||
|
});
|
||||||
|
|
||||||
this.cancel = () => {
|
this.cancel = () => {
|
||||||
this.done = false
|
this.done = false
|
||||||
|
@ -148,7 +152,7 @@
|
||||||
this.done = true
|
this.done = true
|
||||||
this.refs.window.close();
|
this.refs.window.close();
|
||||||
|
|
||||||
this.on-keydown = (e) => {
|
this.onKeydown = (e) => {
|
||||||
if e.which == 13 // Enter
|
if e.which == 13 // Enter
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
|
@ -127,13 +127,13 @@
|
||||||
if this.post.is_liked
|
if this.post.is_liked
|
||||||
this.api('posts/likes/delete', {
|
this.api('posts/likes/delete', {
|
||||||
post_id: this.post.id
|
post_id: this.post.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.post.is_liked = false
|
this.post.is_liked = false
|
||||||
this.update();
|
this.update();
|
||||||
else
|
else
|
||||||
this.api('posts/likes/create', {
|
this.api('posts/likes/create', {
|
||||||
post_id: this.post.id
|
post_id: this.post.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.post.is_liked = true
|
this.post.is_liked = true
|
||||||
this.update();
|
this.update();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -412,13 +412,13 @@
|
||||||
if this.p.is_liked
|
if this.p.is_liked
|
||||||
this.api('posts/likes/delete', {
|
this.api('posts/likes/delete', {
|
||||||
post_id: this.p.id
|
post_id: this.p.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.p.is_liked = false
|
this.p.is_liked = false
|
||||||
this.update();
|
this.update();
|
||||||
else
|
else
|
||||||
this.api('posts/likes/create', {
|
this.api('posts/likes/create', {
|
||||||
post_id: this.p.id
|
post_id: this.p.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.p.is_liked = true
|
this.p.is_liked = true
|
||||||
this.update();
|
this.update();
|
||||||
|
|
||||||
|
|
|
@ -455,7 +455,7 @@
|
||||||
.catch (err) =>
|
.catch (err) =>
|
||||||
console.error err
|
console.error err
|
||||||
@notify '投稿できませんでした'
|
@notify '投稿できませんでした'
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
|
|
||||||
|
|
|
@ -127,14 +127,14 @@
|
||||||
this.wait = true
|
this.wait = true
|
||||||
this.api('posts/create', {
|
this.api('posts/create', {
|
||||||
repost_id: this.opts.post.id
|
repost_id: this.opts.post.id
|
||||||
text: if @quote then this.refs.text.value else undefined
|
text: if this.quote then this.refs.text.value else undefined
|
||||||
}).then((data) => {
|
}).then((data) => {
|
||||||
this.trigger('posted');
|
this.trigger('posted');
|
||||||
@notify 'Repostしました!'
|
@notify 'Repostしました!'
|
||||||
.catch (err) =>
|
.catch (err) =>
|
||||||
console.error err
|
console.error err
|
||||||
@notify 'Repostできませんでした'
|
@notify 'Repostできませんでした'
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
window.addEventListener 'scroll' this.on-scroll
|
window.addEventListener 'scroll' this.on-scroll
|
||||||
|
|
||||||
this.api('posts/search', {
|
this.api('posts/search', {
|
||||||
query: @query
|
query: this.query
|
||||||
}).then((posts) => {
|
}).then((posts) => {
|
||||||
this.is-loading = false
|
this.is-loading = false
|
||||||
this.is-empty = posts.length == 0
|
this.is-empty = posts.length == 0
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
this.more-loading = true
|
this.more-loading = true
|
||||||
this.update();
|
this.update();
|
||||||
this.api('posts/search', {
|
this.api('posts/search', {
|
||||||
query: @query
|
query: this.query
|
||||||
page: this.page + 1
|
page: this.page + 1
|
||||||
}).then((posts) => {
|
}).then((posts) => {
|
||||||
this.more-loading = false
|
this.more-loading = false
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
<mk-sub-post-content>
|
<mk-sub-post-content>
|
||||||
<div class="body"><a class="reply" if={ post.reply_to_id }><i class="fa fa-reply"></i></a><span ref="text"></span><a class="quote" if={ post.repost_id } href={ '/post:' + post.repost_id }>RP: ...</a></div>
|
<div class="body">
|
||||||
|
<a class="reply" if={ post.reply_to_id }>
|
||||||
|
<i class="fa fa-reply"></i>
|
||||||
|
</a>
|
||||||
|
<span ref="text"></span>
|
||||||
|
<a class="quote" if={ post.repost_id } href={ '/post:' + post.repost_id }>RP: ...</a>
|
||||||
|
</div>
|
||||||
<details if={ post.media }>
|
<details if={ post.media }>
|
||||||
<summary>({ post.media.length }つのメディア)</summary>
|
<summary>({ post.media.length }つのメディア)</summary>
|
||||||
<mk-images-viewer images={ post.media }></mk-images-viewer>
|
<mk-images-viewer images={ post.media }></mk-images-viewer>
|
||||||
|
@ -31,15 +37,17 @@
|
||||||
this.mixin('text');
|
this.mixin('text');
|
||||||
this.mixin('user-preview');
|
this.mixin('user-preview');
|
||||||
|
|
||||||
this.post = this.opts.post
|
this.post = this.opts.post;
|
||||||
|
|
||||||
this.on('mount', () => {
|
this.on('mount', () => {
|
||||||
if this.post.text?
|
if (this.post.text) {
|
||||||
tokens = @analyze this.post.text
|
const tokens = this.analyze(this.post.text);
|
||||||
this.refs.text.innerHTML = @compile tokens, false
|
this.refs.text.innerHTML = this.compile(tokens, false);
|
||||||
|
|
||||||
this.refs.text.children.forEach (e) =>
|
this.refs.text.children.forEach(e => {
|
||||||
if e.tag-name == 'MK-URL'
|
if (e.tagName == 'MK-URL') riot.mount(e);
|
||||||
riot.mount e
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
</mk-sub-post-content>
|
</mk-sub-post-content>
|
||||||
|
|
|
@ -324,7 +324,7 @@
|
||||||
this.mixin('NotImplementedException');
|
this.mixin('NotImplementedException');
|
||||||
|
|
||||||
this.post = this.opts.post;
|
this.post = this.opts.post;
|
||||||
this.isRepost = this.post.repost != null && this.post.text == null;
|
this.isRepost = this.post.repost && this.post.text == null;
|
||||||
this.p = this.isRepost ? this.post.repost : this.post;
|
this.p = this.isRepost ? this.post.repost : this.post;
|
||||||
|
|
||||||
this.title = this.dateStringify(this.p.created_at);
|
this.title = this.dateStringify(this.p.created_at);
|
||||||
|
@ -354,58 +354,87 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
this.reply = () => {
|
this.reply = () => {
|
||||||
form = document.body.appendChild(document.createElement('mk-post-form-window'));
|
riot.mount(document.body.appendChild(document.createElement('mk-post-form-window')), {
|
||||||
riot.mount form, do
|
|
||||||
reply: this.p
|
reply: this.p
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
this.repost = () => {
|
this.repost = () => {
|
||||||
form = document.body.appendChild(document.createElement('mk-repost-form-window'));
|
riot.mount(document.body.appendChild(document.createElement('mk-repost-form-window')), {
|
||||||
riot.mount form, do
|
|
||||||
post: this.p
|
post: this.p
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
this.like = () => {
|
this.like = () => {
|
||||||
if this.p.is_liked
|
if (this.p.is_liked) {
|
||||||
this.api('posts/likes/delete', {
|
this.api('posts/likes/delete', {
|
||||||
post_id: this.p.id
|
post_id: this.p.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.p.is_liked = false
|
this.p.is_liked = false;
|
||||||
this.update();
|
this.update();
|
||||||
else
|
});
|
||||||
|
} else {
|
||||||
this.api('posts/likes/create', {
|
this.api('posts/likes/create', {
|
||||||
post_id: this.p.id
|
post_id: this.p.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.p.is_liked = true
|
this.p.is_liked = true;
|
||||||
this.update();
|
this.update();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
this.toggle-detail = () => {
|
this.toggleDetail = () => {
|
||||||
this.is-detail-opened = !@is-detail-opened
|
this.update({
|
||||||
this.update();
|
isDetailOpened: !this.isDetailOpened
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
this.on-key-down = (e) => {
|
this.onKeyDown = e => {
|
||||||
should-be-cancel = true
|
let shouldBeCancel = true;
|
||||||
switch
|
|
||||||
| e.which == 38 or e.which == 74 or (e.which == 9 and e.shift-key) => // ↑, j or Shift+Tab
|
|
||||||
focus this.root, (e) -> e.previousElementSibling
|
|
||||||
| e.which == 40 or e.which == 75 or e.which == 9 => // ↓, k or Tab
|
|
||||||
focus this.root, (e) -> e.nextElementSibling
|
|
||||||
| e.which == 81 or e.which == 69 => // q or e
|
|
||||||
@repost!
|
|
||||||
| e.which == 70 or e.which == 76 => // f or l
|
|
||||||
@like!
|
|
||||||
| e.which == 82 => // r
|
|
||||||
@reply!
|
|
||||||
| _ =>
|
|
||||||
should-be-cancel = false
|
|
||||||
|
|
||||||
if should-be-cancel
|
switch (true) {
|
||||||
e.preventDefault();
|
case e.which == 38: // [↑]
|
||||||
|
case e.which == 74: // [j]
|
||||||
|
case e.which == 9 && e.shiftKey: // [Shift] + [Tab]
|
||||||
|
focus(this.root, e => e.previousElementSibling);
|
||||||
|
break;
|
||||||
|
|
||||||
function focus(el, fn)
|
case e.which == 40: // [↓]
|
||||||
target = fn el
|
case e.which == 75: // [k]
|
||||||
if target?
|
case e.which == 9: // [Tab]
|
||||||
if target.has-attribute 'tabindex'
|
focus(this.root, e => e.nextElementSibling);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case e.which == 81: // [q]
|
||||||
|
case e.which == 69: // [e]
|
||||||
|
this.repost();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case e.which == 70: // [f]
|
||||||
|
case e.which == 76: // [l]
|
||||||
|
this.like();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case e.which == 82: // [r]
|
||||||
|
this.reply();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
shouldBeCancel = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldBeCancel) e.preventDefault();
|
||||||
|
};
|
||||||
|
|
||||||
|
function focus(el, fn) {
|
||||||
|
const target = fn(el);
|
||||||
|
if (target) {
|
||||||
|
if (target.hasAttribute('tabindex')) {
|
||||||
target.focus();
|
target.focus();
|
||||||
else
|
} else {
|
||||||
focus target, fn
|
focus(target, fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</mk-timeline-post>
|
</mk-timeline-post>
|
||||||
|
|
|
@ -501,7 +501,7 @@
|
||||||
this.ondragover = (e) => {
|
this.ondragover = (e) => {
|
||||||
e.dataTransfer.dropEffect = 'none'
|
e.dataTransfer.dropEffect = 'none'
|
||||||
|
|
||||||
this.on-keydown = (e) => {
|
this.onKeydown = (e) => {
|
||||||
if e.which == 27 // Esc
|
if e.which == 27 // Esc
|
||||||
if @can-close
|
if @can-close
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
|
@ -233,7 +233,7 @@
|
||||||
description: description
|
description: description
|
||||||
callback_url: cb
|
callback_url: cb
|
||||||
permission: permission.join ','
|
permission: permission.join ','
|
||||||
.then =>
|
}).then(() => {
|
||||||
location.href = '/apps'
|
location.href = '/apps'
|
||||||
.catch =>
|
.catch =>
|
||||||
alert 'アプリの作成に失敗しました。再度お試しください。'
|
alert 'アプリの作成に失敗しました。再度お試しください。'
|
||||||
|
|
|
@ -192,9 +192,9 @@
|
||||||
name = window.prompt '名前を変更' this.file.name
|
name = window.prompt '名前を変更' this.file.name
|
||||||
if name? and name != '' and name != this.file.name
|
if name? and name != '' and name != this.file.name
|
||||||
this.api('drive/files/update', {
|
this.api('drive/files/update', {
|
||||||
file_id: this.file.id
|
file_id: this.file.id,
|
||||||
name: name
|
name: name
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.parent.cf this.file, true
|
this.parent.cf this.file, true
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -84,21 +84,21 @@
|
||||||
if this.user.is_following
|
if this.user.is_following
|
||||||
this.api('following/delete', {
|
this.api('following/delete', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.user.is_following = false
|
this.user.is_following = false
|
||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
console.error err
|
console.error err
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
else
|
else
|
||||||
this.api('following/create', {
|
this.api('following/create', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.user.is_following = true
|
this.user.is_following = true
|
||||||
.catch (err) ->
|
.catch (err) ->
|
||||||
console.error err
|
console.error err
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.wait = false
|
this.wait = false
|
||||||
this.update();
|
this.update();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -406,13 +406,13 @@
|
||||||
if this.p.is_liked
|
if this.p.is_liked
|
||||||
this.api('posts/likes/delete', {
|
this.api('posts/likes/delete', {
|
||||||
post_id: this.p.id
|
post_id: this.p.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.p.is_liked = false
|
this.p.is_liked = false
|
||||||
this.update();
|
this.update();
|
||||||
else
|
else
|
||||||
this.api('posts/likes/create', {
|
this.api('posts/likes/create', {
|
||||||
post_id: this.p.id
|
post_id: this.p.id
|
||||||
.then =>
|
}).then(() => {
|
||||||
this.p.is_liked = true
|
this.p.is_liked = true
|
||||||
this.update();
|
this.update();
|
||||||
|
|
||||||
|
|
|
@ -9,24 +9,24 @@
|
||||||
<script>
|
<script>
|
||||||
this.mixin('api');
|
this.mixin('api');
|
||||||
|
|
||||||
this.max = 30
|
this.max = 30;
|
||||||
this.offset = 0
|
this.offset = 0;
|
||||||
|
|
||||||
this.query = this.opts.query
|
this.query = this.opts.query;
|
||||||
this.with-media = this.opts.with-media
|
this.withMedia = this.opts.withMedia;
|
||||||
|
|
||||||
this.init = new Promise (res, rej) =>
|
this.init = new Promise (res, rej) =>
|
||||||
this.api('posts/search', {
|
this.api('posts/search', {
|
||||||
query: @query
|
query: this.query
|
||||||
}).then((posts) => {
|
}).then(posts => {
|
||||||
res posts
|
res posts
|
||||||
this.trigger('loaded');
|
this.trigger('loaded');
|
||||||
|
|
||||||
this.more = () => {
|
this.more = () => {
|
||||||
@offset += @max
|
this.offset += this.max;
|
||||||
this.api('posts/search', {
|
this.api('posts/search', {
|
||||||
query: @query
|
query: this.query
|
||||||
max: @max
|
max: this.max
|
||||||
offset: @offset
|
offset: this.offset
|
||||||
</script>
|
</script>
|
||||||
</mk-search-posts>
|
</mk-search-posts>
|
||||||
|
|
|
@ -11,21 +11,21 @@
|
||||||
<script>
|
<script>
|
||||||
this.mixin('api');
|
this.mixin('api');
|
||||||
|
|
||||||
this.user = this.opts.user
|
this.user = this.opts.user;
|
||||||
this.with-media = this.opts.with-media
|
this.withMedia = this.opts.withMedia;
|
||||||
|
|
||||||
this.init = new Promise (res, rej) =>
|
this.init = new Promise (res, rej) =>
|
||||||
this.api('users/posts', {
|
this.api('users/posts', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
with_media: @with-media
|
with_media: @withMedia
|
||||||
}).then((posts) => {
|
}).then(posts => {
|
||||||
res posts
|
res posts
|
||||||
this.trigger('loaded');
|
this.trigger('loaded');
|
||||||
|
|
||||||
this.more = () => {
|
this.more = () => {
|
||||||
this.api('users/posts', {
|
this.api('users/posts', {
|
||||||
user_id: this.user.id
|
user_id: this.user.id
|
||||||
with_media: @with-media
|
with_media: this.withMedia
|
||||||
max_id: this.refs.timeline.tail!.id
|
max_id: this.refs.timeline.tail!.id
|
||||||
</script>
|
</script>
|
||||||
</mk-user-timeline>
|
</mk-user-timeline>
|
||||||
|
|
Loading…
Reference in a new issue