Commit 4b710c26 authored by 神楽坂玲奈's avatar 神楽坂玲奈

upload

parent dab94809
...@@ -6,7 +6,7 @@ class Card extends Spine.Model ...@@ -6,7 +6,7 @@ class Card extends Spine.Model
@categories = ['Monster', 'Spell', 'Trap'] @categories = ['Monster', 'Spell', 'Trap']
@card_types_extra = ['Fusion', 'Synchro', 'Xyz'] @card_types_extra = ['Fusion', 'Synchro', 'Xyz']
@configure 'Card', 'id', 'name', 'card_type', 'type', 'attribute', 'level', 'atk', 'def', 'description' @configure 'Card', 'id', 'name', 'card_type', 'type', 'attribute', 'level', 'atk', 'def', 'description'
@extend Spine.Model.Ajax @extend Spine.Model.Local
@extend Spine.Events @extend Spine.Events
@hasMany 'card_usages', CardUsage @hasMany 'card_usages', CardUsage
@url: "https://api.mongolab.com/api/1/databases/mycard/collections/cards?apiKey=508e5726e4b0c54ca4492ead" @url: "https://api.mongolab.com/api/1/databases/mycard/collections/cards?apiKey=508e5726e4b0c54ca4492ead"
...@@ -80,8 +80,16 @@ class Deck extends Spine.Controller ...@@ -80,8 +80,16 @@ class Deck extends Spine.Controller
side = decoded >> 29 side = decoded >> 29
count = decoded >> 27 & 0x3 count = decoded >> 27 & 0x3
{card_id: card_id, side: side, count: count} {card_id: card_id, side: side, count: count}
Card.query {_id: { $in: card_usage.card_id for card_usage in card_usages}}, => @refresh card_usages
refresh: (card_usages, modify_url=true)->
cards_need_load = (card_usage.card_id for card_usage in card_usages when !Card.exists(card_usage.card_id))
if cards_need_load.length
Card.query {_id: { $in: cards_need_load}}, =>
CardUsage.refresh card_usages, clear: true CardUsage.refresh card_usages, clear: true
history.pushState(CardUsage.toJSON(), @deck_name, @location()) if modify_url
else
CardUsage.refresh card_usages, clear: true
history.pushState(CardUsage.toJSON(), @deck_name, @location()) if modify_url
render: => render: =>
@main = [] @main = []
...@@ -106,11 +114,14 @@ class Deck extends Spine.Controller ...@@ -106,11 +114,14 @@ class Deck extends Spine.Controller
main_count += card_usage.count main_count += card_usage.count
category_count[(category for category in card.card_type when category in Card.categories).pop()] += card_usage.count category_count[(category for category in card.card_type when category in Card.categories).pop()] += card_usage.count
@html $('#deck_template').tmpl({main: @main, side: @side, extra: @extra, main_count: main_count, side_count: side_count, extra_count: extra_count, category_count: category_count}) @html $('#deck_template').tmpl({main: @main, side: @side, extra: @extra, main_count: main_count, side_count: side_count, extra_count: extra_count, category_count: category_count})
$('#deck_url_ydk').attr 'download', @deck_name + '.ydk'
$('#deck_url_ydk').attr 'href', 'data:application/octet-stream;headers=' + encodeURIComponent('Content-Disposition: attachment; filename=' + @deck_name + '.ydk') + ',' + (card_usage.card_id for i in [0...card_usage.count] for card_usage in @main).concat((card_usage.card_id for i in [0...card_usage.count] for card_usage in @extra), ["!side"], (card_usage.card_id for i in [0...card_usage.count] for card_usage in @side)).join("%0a")
#$('#deck_url_ydk').attr 'href', 'data:application/octet-stream;headers=' + encodeURIComponent('Content-Disposition: attachment; filename=' + @deck_name + '.ydk') + ',' + (card_usage.card_id for i in [0...card_usage.count] for card_usage in @main).concat((card_usage.card_id for i in [0...card_usage.count] for card_usage in @extra), ["!side"], (card_usage.card_id for i in [0...card_usage.count] for card_usage in @side)).join("%0a")
$( ".deck_part" ).sortable( $( ".deck_part" ).sortable(
connectWith: ".deck_part" connectWith: ".deck_part"
stop: -> stop: =>
card_usages = [] card_usages = []
last_item = null last_item = null
for el in $('.card_usage') for el in $('.card_usage')
card_id = $(el).tmplItem().data.card_id card_id = $(el).tmplItem().data.card_id
...@@ -125,17 +136,17 @@ class Deck extends Spine.Controller ...@@ -125,17 +136,17 @@ class Deck extends Spine.Controller
else else
last_item = {card_id: card_id, side: side, count: 1} last_item = {card_id: card_id, side: side, count: 1}
card_usages.push last_item card_usages.push last_item
CardUsage.refresh card_usages, clear: true @refresh card_usages
).disableSelection(); ).disableSelection();
if $('.operate_area').hasClass('text') if $('.operate_area').hasClass('text')
@el.jscroll({W: "12px", Btn: @el.jscroll({W: "12px", Btn:
{btn: false}}) {btn: false}})
location: ->
"/decks/?name=#{@deck_name}&cards=#{@encode()}"
url: ->
"http://my-card.in" + @location()
@url = "http://my-card.in/decks/?name=#{@deck_name}&cards=#{@encode()}"
#alert @url
#$('#deck_url_ydk').attr 'download', Deck.deck_name + '.ydk'
#$('#deck_url_ydk').attr 'href', 'data:application/octet-stream,' + (card_usage.card_id for i in ).concat((card_usage.card_id for i in [0...card_usage.count] for card_usage in @extra), ["!side"], (card_usage.card_id for i in [0...card_usage.count] for card_usage in @side)).join("%0a")
tab_control: -> tab_control: ->
$(".bottom_area div").click -> $(".bottom_area div").click ->
$(this).addClass("bottom_button_active").removeClass("bottom_button") $(this).addClass("bottom_button_active").removeClass("bottom_button")
...@@ -162,7 +173,7 @@ class Deck extends Spine.Controller ...@@ -162,7 +173,7 @@ class Deck extends Spine.Controller
if count < 3 #TODO: lflist if count < 3 #TODO: lflist
card_usage.count++ card_usage.count++
card_usage.save() card_usage.save()
history.pushState(null, @deck_name, @url)
minus: (e)-> minus: (e)->
e.preventDefault() e.preventDefault()
card_usage = $(e.target).tmplItem().data card_usage = $(e.target).tmplItem().data
...@@ -171,7 +182,7 @@ class Deck extends Spine.Controller ...@@ -171,7 +182,7 @@ class Deck extends Spine.Controller
card_usage.save() card_usage.save()
else else
card_usage.destroy() card_usage.destroy()
history.pushState(null, @deck_name, @url) history.pushState(CardUsage.toJSON(), @deck_name, @location())
$(document).ready -> $(document).ready ->
...@@ -180,25 +191,66 @@ $(document).ready -> ...@@ -180,25 +191,66 @@ $(document).ready ->
modal: true modal: true
autoOpen: false autoOpen: false
deck = new Deck(el: $("#deck"))
deck.deck_name = $.url().param('name')
deck.tab_control()
$('#deck_share').click -> $('#deck_share').click ->
$("#deck_url").val $("#deck_url").val deck.url()
$("#deck_url_qrcode").attr 'src', 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chld=|0&chl=' + encodeURIComponent(deck.url())
$("#deck_share_dialog").dialog('open') $("#deck_share_dialog").dialog('open')
$('#deck_url_shorten').click ->
$('#deck_url_shorten').attr "disabled",true
$.ajax
url: 'https://www.googleapis.com/urlshortener/v1/url'
type: 'POST'
data: JSON.stringify {longUrl: deck.url()}
contentType: 'application/json; charset=utf-8'
success: (data)->
$("#deck_url").val data.id
$('#deck_url_shorten').attr "disabled", false
$('#deck_load').change ->
file = @files[0]
reader = new FileReader()
reader.readAsText(file)
reader.onload = (ev)->
result = []
lines = ev.target.result.split("\n")
side = false
last_id = 0
count = 0
for line in lines
if line.charAt(0) == '#'
continue
else if line.substr(0,5) == '!side'
result.push {card_id: last_id, side: side, count: count} if last_id
side = true
else
card_id = parseInt(line)
if card_id
if card_id == last_id
count++
else
result.push {card_id: last_id, side: side, count: count} if last_id
last_id = card_id
count = 1
result.push {card_id: last_id, side: side, count: count} if last_id
deck.refresh result
#$.ajax({url: 'https://www.googleapis.com/urlshortener/v1/url', type: 'POST', data:JSON.stringify({longUrl: 'http://my-card.in/'}), contentType: 'application/json; charset=utf-8', success: function(data){alert(data)} })"
$.i18n.properties $.i18n.properties
name: 'card' name: 'card'
path: '/locales/' path: '/locales/'
mode: 'map' mode: 'map'
cache: true cache: true
callback: -> callback: ->
deck = new Deck(el: $("#deck")) Card.fetch ->
deck.deck_name = $.url().param('name')
deck.tab_control()
deck.decode $.url().param('cards') deck.decode $.url().param('cards')
window.addEventListener 'popstate', (ev)->
if ev.state
deck.refresh ev.state, false
Card.fetch()
$(".rename_ope").click -> $(".rename_ope").click ->
$(".text,.graphic").toggleClass("graphic text") $(".text,.graphic").toggleClass("graphic text")
deck.render() deck.render()
#window.addEventListener 'popstate', (ev)->
# alert ev.state
#if ev.state
# CardUsage.refresh ev.state, clear: true
\ No newline at end of file
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
Card.configure('Card', 'id', 'name', 'card_type', 'type', 'attribute', 'level', 'atk', 'def', 'description'); Card.configure('Card', 'id', 'name', 'card_type', 'type', 'attribute', 'level', 'atk', 'def', 'description');
Card.extend(Spine.Model.Ajax); Card.extend(Spine.Model.Local);
Card.extend(Spine.Events); Card.extend(Spine.Events);
...@@ -176,8 +176,7 @@ ...@@ -176,8 +176,7 @@
}; };
Deck.prototype.decode = function(str) { Deck.prototype.decode = function(str) {
var card_id, card_usage, card_usages, char, count, decoded, i, side, var card_id, card_usages, char, count, decoded, i, side;
_this = this;
card_usages = (function() { card_usages = (function() {
var _i, _j, _len, _ref, _ref1, _results; var _i, _j, _len, _ref, _ref1, _results;
_results = []; _results = [];
...@@ -199,27 +198,51 @@ ...@@ -199,27 +198,51 @@
} }
return _results; return _results;
}).call(this); }).call(this);
return Card.query({ return this.refresh(card_usages);
_id: { };
$in: (function() {
Deck.prototype.refresh = function(card_usages, modify_url) {
var card_usage, cards_need_load,
_this = this;
if (modify_url == null) {
modify_url = true;
}
cards_need_load = (function() {
var _i, _len, _results; var _i, _len, _results;
_results = []; _results = [];
for (_i = 0, _len = card_usages.length; _i < _len; _i++) { for (_i = 0, _len = card_usages.length; _i < _len; _i++) {
card_usage = card_usages[_i]; card_usage = card_usages[_i];
if (!Card.exists(card_usage.card_id)) {
_results.push(card_usage.card_id); _results.push(card_usage.card_id);
} }
}
return _results; return _results;
})() })();
if (cards_need_load.length) {
return Card.query({
_id: {
$in: cards_need_load
} }
}, function() { }, function() {
return CardUsage.refresh(card_usages, { CardUsage.refresh(card_usages, {
clear: true clear: true
}); });
if (modify_url) {
return history.pushState(CardUsage.toJSON(), _this.deck_name, _this.location());
}
});
} else {
CardUsage.refresh(card_usages, {
clear: true
}); });
if (modify_url) {
return history.pushState(CardUsage.toJSON(), this.deck_name, this.location());
}
}
}; };
Deck.prototype.render = function() { Deck.prototype.render = function() {
var category, category_count, extra_count, main_count, side_count, _i, _len, _ref, var card_usage, category, category_count, extra_count, i, main_count, side_count, _i, _len, _ref,
_this = this; _this = this;
this.main = []; this.main = [];
this.side = []; this.side = [];
...@@ -279,6 +302,56 @@ ...@@ -279,6 +302,56 @@
extra_count: extra_count, extra_count: extra_count,
category_count: category_count category_count: category_count
})); }));
$('#deck_url_ydk').attr('download', this.deck_name + '.ydk');
$('#deck_url_ydk').attr('href', 'data:application/octet-stream;headers=' + encodeURIComponent('Content-Disposition: attachment; filename=' + this.deck_name + '.ydk') + ',' + ((function() {
var _j, _len1, _ref1, _results;
_ref1 = this.main;
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
card_usage = _ref1[_j];
_results.push((function() {
var _k, _ref2, _results1;
_results1 = [];
for (i = _k = 0, _ref2 = card_usage.count; 0 <= _ref2 ? _k < _ref2 : _k > _ref2; i = 0 <= _ref2 ? ++_k : --_k) {
_results1.push(card_usage.card_id);
}
return _results1;
})());
}
return _results;
}).call(this)).concat((function() {
var _j, _len1, _ref1, _results;
_ref1 = this.extra;
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
card_usage = _ref1[_j];
_results.push((function() {
var _k, _ref2, _results1;
_results1 = [];
for (i = _k = 0, _ref2 = card_usage.count; 0 <= _ref2 ? _k < _ref2 : _k > _ref2; i = 0 <= _ref2 ? ++_k : --_k) {
_results1.push(card_usage.card_id);
}
return _results1;
})());
}
return _results;
}).call(this), ["!side"], (function() {
var _j, _len1, _ref1, _results;
_ref1 = this.side;
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
card_usage = _ref1[_j];
_results.push((function() {
var _k, _ref2, _results1;
_results1 = [];
for (i = _k = 0, _ref2 = card_usage.count; 0 <= _ref2 ? _k < _ref2 : _k > _ref2; i = 0 <= _ref2 ? ++_k : --_k) {
_results1.push(card_usage.card_id);
}
return _results1;
})());
}
return _results;
}).call(this)).join("%0a"));
$(".deck_part").sortable({ $(".deck_part").sortable({
connectWith: ".deck_part", connectWith: ".deck_part",
stop: function() { stop: function() {
...@@ -310,20 +383,25 @@ ...@@ -310,20 +383,25 @@
} }
} }
card_usages.push(last_item); card_usages.push(last_item);
return CardUsage.refresh(card_usages, { return _this.refresh(card_usages);
clear: true
});
} }
}).disableSelection(); }).disableSelection();
if ($('.operate_area').hasClass('text')) { if ($('.operate_area').hasClass('text')) {
this.el.jscroll({ return this.el.jscroll({
W: "12px", W: "12px",
Btn: { Btn: {
btn: false btn: false
} }
}); });
} }
return this.url = "http://my-card.in/decks/?name=" + this.deck_name + "&cards=" + (this.encode()); };
Deck.prototype.location = function() {
return "/decks/?name=" + this.deck_name + "&cards=" + (this.encode());
};
Deck.prototype.url = function() {
return "http://my-card.in" + this.location();
}; };
Deck.prototype.tab_control = function() { Deck.prototype.tab_control = function() {
...@@ -366,9 +444,8 @@ ...@@ -366,9 +444,8 @@
} }
if (count < 3) { if (count < 3) {
card_usage.count++; card_usage.count++;
card_usage.save(); return card_usage.save();
} }
return history.pushState(null, this.deck_name, this.url);
}; };
Deck.prototype.minus = function(e) { Deck.prototype.minus = function(e) {
...@@ -381,7 +458,7 @@ ...@@ -381,7 +458,7 @@
} else { } else {
card_usage.destroy(); card_usage.destroy();
} }
return history.pushState(null, this.deck_name, this.url); return history.pushState(CardUsage.toJSON(), this.deck_name, this.location());
}; };
return Deck; return Deck;
...@@ -389,28 +466,106 @@ ...@@ -389,28 +466,106 @@
})(Spine.Controller); })(Spine.Controller);
$(document).ready(function() { $(document).ready(function() {
var deck;
$('#name').html($.url().param('name')); $('#name').html($.url().param('name'));
$("#deck_share_dialog").dialog({ $("#deck_share_dialog").dialog({
modal: true, modal: true,
autoOpen: false autoOpen: false
}); });
deck = new Deck({
el: $("#deck")
});
deck.deck_name = $.url().param('name');
deck.tab_control();
$('#deck_share').click(function() { $('#deck_share').click(function() {
$("#deck_url").val; $("#deck_url").val(deck.url());
$("#deck_url_qrcode").attr('src', 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chld=|0&chl=' + encodeURIComponent(deck.url()));
return $("#deck_share_dialog").dialog('open'); return $("#deck_share_dialog").dialog('open');
}); });
$('#deck_url_shorten').click(function() {
$('#deck_url_shorten').attr("disabled", true);
return $.ajax({
url: 'https://www.googleapis.com/urlshortener/v1/url',
type: 'POST',
data: JSON.stringify({
longUrl: deck.url()
}),
contentType: 'application/json; charset=utf-8',
success: function(data) {
$("#deck_url").val(data.id);
return $('#deck_url_shorten').attr("disabled", false);
}
});
});
$('#deck_load').change(function() {
var file, reader;
file = this.files[0];
reader = new FileReader();
reader.readAsText(file);
return reader.onload = function(ev) {
var card_id, count, last_id, line, lines, result, side, _i, _len;
result = [];
lines = ev.target.result.split("\n");
side = false;
last_id = 0;
count = 0;
for (_i = 0, _len = lines.length; _i < _len; _i++) {
line = lines[_i];
if (line.charAt(0) === '#') {
continue;
} else if (line.substr(0, 5) === '!side') {
if (last_id) {
result.push({
card_id: last_id,
side: side,
count: count
});
}
side = true;
} else {
card_id = parseInt(line);
if (card_id) {
if (card_id === last_id) {
count++;
} else {
if (last_id) {
result.push({
card_id: last_id,
side: side,
count: count
});
}
last_id = card_id;
count = 1;
}
}
}
}
if (last_id) {
result.push({
card_id: last_id,
side: side,
count: count
});
}
return deck.refresh(result);
};
});
return $.i18n.properties({ return $.i18n.properties({
name: 'card', name: 'card',
path: '/locales/', path: '/locales/',
mode: 'map', mode: 'map',
cache: true, cache: true,
callback: function() { callback: function() {
var deck; Card.fetch(function() {
deck = new Deck({
el: $("#deck")
});
deck.deck_name = $.url().param('name');
deck.tab_control();
deck.decode($.url().param('cards')); deck.decode($.url().param('cards'));
return window.addEventListener('popstate', function(ev) {
if (ev.state) {
return deck.refresh(ev.state, false);
}
});
});
Card.fetch();
return $(".rename_ope").click(function() { return $(".rename_ope").click(function() {
$(".text,.graphic").toggleClass("graphic text"); $(".text,.graphic").toggleClass("graphic text");
return deck.render(); return deck.render();
......
...@@ -425,11 +425,11 @@ ...@@ -425,11 +425,11 @@
<img class="rename_ope" src="/assets/images/decks/rename.png" alt="" title="重命名"/> <img class="rename_ope" src="/assets/images/decks/rename.png" alt="" title="重命名"/>
</div> </div>
<div class="select_cardUnder"> <div class="select_cardUnder">
<div class="donwload_out" title="下载"> <div class="donwload_out" title="上传">
<div class="download_inner"></div> <input id="deck_load" class="upload_inner" type="file" />
</div> </div>
<div class="donwload_out" title="分享" id="deck_share"> <div class="donwload_out" title="分享" id="deck_share">
<div class="upload_inner"></div> <div class="download_inner"></div>
</div> </div>
<!-- <img class="donwload_ope" src="/assets/images/decks/download.png" alt="" title="上传" /> --> <!-- <img class="donwload_ope" src="/assets/images/decks/download.png" alt="" title="上传" /> -->
<a href="#" id="deck_url_ydk"><img class="save_ope" src="/assets/images/decks/save.png" alt="" title="保存"/></a> <a href="#" id="deck_url_ydk"><img class="save_ope" src="/assets/images/decks/save.png" alt="" title="保存"/></a>
...@@ -441,12 +441,12 @@ ...@@ -441,12 +441,12 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div id="deck_share_dialog" title="share"> <div id="deck_share_dialog" title="share">
<fieldset> <fieldset>
<legend>URL</legend> <legend>URL</legend>
<input id="deck_url" readonly="readonly"/><br/> <input id="deck_url" readonly="readonly"/><br/>
<button id="deck_url_shorten">shorten</button> <button id="deck_url_shorten">shorten</button>
<input id="deck_url_short" readonly="readonly"/><br/>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>share</legend> <legend>share</legend>
...@@ -462,14 +462,12 @@ ...@@ -462,14 +462,12 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>QR Code</legend> <legend>QR Code</legend>
<img id="qrcode"/> <img id="deck_url_qrcode"/>
</fieldset> </fieldset>
<script type="text/javascript" <script type="text/javascript"
src="http://s7.addthis.com/js/300/addthis_widget.js#pubid=ra-504b398d148616ce"></script> src="http://s7.addthis.com/js/300/addthis_widget.js#pubid=ra-504b398d148616ce"></script>
<!-- AddThis Button END --> <!-- AddThis Button END -->
</div> </div>
</div>
<script src="/vendor/javascripts/jquery-1.8.2.min.js"></script> <script src="/vendor/javascripts/jquery-1.8.2.min.js"></script>
<script src="/vendor/javascripts/jQuery-URL-Parser.js"></script> <script src="/vendor/javascripts/jQuery-URL-Parser.js"></script>
<script src="/vendor/javascripts/jquery.tmpl.min.js"></script> <script src="/vendor/javascripts/jquery.tmpl.min.js"></script>
...@@ -482,6 +480,7 @@ ...@@ -482,6 +480,7 @@
<script src="/vendor/javascripts/json2.js"></script> <script src="/vendor/javascripts/json2.js"></script>
<script src="/vendor/javascripts/spine/spine.js"></script> <script src="/vendor/javascripts/spine/spine.js"></script>
<script src="/vendor/javascripts/spine/ajax.js"></script> <script src="/vendor/javascripts/spine/ajax.js"></script>
<script src="/vendor/javascripts/spine/local.js"></script>
<script src="/vendor/javascripts/spine/relation.js"></script> <script src="/vendor/javascripts/spine/relation.js"></script>
<script src="/assets/javascripts/public.js"></script> <script src="/assets/javascripts/public.js"></script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment