$(function() {
$("#bmcanvas").resizable();
$("#clear").click(function(){
$(".sticky").remove();
});
$('#save').click(function(){
var arr = [];
$(".sticky").each(function(){
var sticky = $(this);
var offset = sticky.offset();
var obj = {};
obj.width = sticky.width();
obj.height = sticky.height();
obj.zindex = sticky.css("z-index");
obj.top = offset.top;
obj.left = offset.left;
obj.text = sticky.find(".instxt").html();
arr.push(obj);
});
var saveObj = {};
saveObj.title = $("#title").val();
saveObj.width = $("#bmcanvas").width();
saveObj.height = $("#bmcanvas").height();
saveObj.sticky = arr;
var jsonStr = JSON.stringify(saveObj);
localStorage.setItem("data",jsonStr);
});
var szidx=0;
var newSticky = function(){
return $('<div class="sticky"><div class="instxt"> </div></div>')
.appendTo('body')
.draggable({
start: function(event, ui) { $(this).css("z-index", szidx++); }
})
.click(function() {
$(this).css("z-index", szidx++);
})
.dblclick(function() {
var txt = $(this).find(".instxt").html().replace(/<br>/g,"\n");
$(this).find(".instxt").html('<textarea></textarea>')
.find('textarea')
.val(txt)
.width($(this).width())
.height($(this).height())
.focus()
.select()
.blur(function() {
$(this).parent().html($(this).val().replace(/\n/g,"<br>"));
$(this).remove()
});
}).resizable({
minHeight: 30,
minWidth: 60,
start: function(event, ui) { $(this).css("z-index", szidx++); }
})
.css("position","absolute")
.appendTo('#bmcanvasContent');
}
$("#load").click(function(){
if(localStorage.getItem("data")){
$(".sticky").remove();
var saveObj = $.parseJSON(localStorage.getItem("data"));
$("#title").val(saveObj.title);
$("#bmcanvas").width(saveObj.width);
$("#bmcanvas").height(saveObj.height);
$.each(saveObj.sticky, function(idx,val){
if(szidx < val.zindex) szidx = val.zindex;
var stic = newSticky();
stic.offset({ top: val.top, left: val.left})
.height(val.height)
.width(val.width)
.css("z-index",val.zindex)
.find(".instxt").html(val.text);
});
} else {
alert("no save");
}
});
$('#new').click(function() {
newSticky();
});
$("#bmcanvas").dblclick(function(e) {
var x = e.pageX;
var y = e.pageY;
var stic = newSticky();
stic.offset({ top: y, left: x});
stic.dblclick();
stic.find('textarea').focus()
});
$.contextMenu({
selector: '.sticky',
callback: function(key, options) {
if(key=="del"){
$(this).remove();
}
},
items: {
"del": {name: "削除"}
}
});
});
<div>
キャンバスタイトル:<input id="title" type="text" value="" />
<input id="new" type="button" value="付箋追加" />
<input id="clear" type="button" value="付箋全削除" />
<input id="save" type="button" value="一時保存" />
<input id="load" type="button" value="読込" />
</div>
<div id="bmcanvasContent" onSelectStart="return false;">
<table id="bmcanvas">
<col width="20%" /><col width="20%" />
<col width="10%" /><col width="10%" />
<col width="20%" /><col width="20%" />
<tr>
<td class="bmKeyPartners" rowspan="2" ><b>重要なパートナー</b></td>
<td class="bmKeyActivities"><b>主要な活動</b></td>
<td class="bmValuePropositons" rowspan="2" colspan="2"><b>価値提案</b></td>
<td class="bmCustomerRelationship"><b>顧客との関係</b></td>
<td class="bmCustomerSegments" rowspan="2"><b>顧客セグメント</b></td>
</tr>
<tr>
<td><b>重要なリソース</b></td>
<td><b>チャネル</b></td>
</tr>
<tr>
<td colspan="3" class="bmCostStructure"><b>コスト構造</b></td>
<td colspan="3" class="bmRevenueStreams"><b>収益の流れ</b></td>
</tr>
</table>
</div>
table#bmcanvas{
width:700px;
height:450px;
border: solid 1px black;
position:absolute;
}
table#bmcanvas td{
border: solid 1px black;
vertical-align:top;
}
#title {
width:200px;
}
.sticky {
width: 120px;
height: 40px;
background-color: #FFD900;
cursor: pointer;
overflow: hidden;
}
.instxt{
padding:3px;
}
textarea {
width: 100%;
height: 100%;
}
#bmcanvasContent{
position:relative;
}
.context-menu-list {
margin:0;
padding:0;
min-width: 100px;
max-width: 200px;
display: inline-block;
position: absolute;
list-style-type: none;
border: 1px solid #DDD;
background: #EEE;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
-ms-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
-o-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
}
.context-menu-item {
padding: 2px 2px 2px 24px;
background-color: #EEE;
position: relative;
-webkit-user-select: none;
-moz-user-select: -moz-none;
-ms-user-select: none;
user-select: none;
}
.context-menu-separator {
padding-bottom:0;
border-bottom: 1px solid #DDD;
}
.context-menu-item > label > input,
.context-menu-item > label > textarea {
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.context-menu-item.hover {
cursor: pointer;
background-color: #39F;
}
.context-menu-item.disabled {
color: #666;
}
.context-menu-input.hover,
.context-menu-item.disabled.hover {
cursor: default;
background-color: #EEE;
}
.context-menu-submenu:after {
content: ">";
color: #666;
position: absolute;
top: 0;
right: 3px;
z-index: 1;
}
External resources loaded into this fiddle: