Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>indexedDB Address Book</title>
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
- <link rel="stylesheet" href="http://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css">
- <style>
- .hideonready {
- display: none;
- }
- #photos {
- height:150px;
- background: #FF0;
- border: 1px solid #888;
- }
- .photolist-edit {
- position: relative;
- display: inline-block;
- width: 100px;
- height: 100px;
- border: 1px solid #888;
- margin: 5px;
- }
- .photolist-edit img {
- position: absolute;
- width: 100px;
- height: 100px;
- left: 0;
- top: 0;
- }
- .photolist-delete {
- position: absolute;
- top: 3px;
- right: 3px;
- width: 20px;
- height: 20px;
- border-radius: 10px;
- line-height: 20px;
- text-align: center;
- background-color: black;
- color: white;
- cursor: pointer;
- }
- .sort-selection {
- margin: 10px 0;
- }
- .novalue::-webkit-input-placeholder {
- color: red;
- }
- .novalue:-moz-placeholder {
- color: red;
- }
- .novalue::-moz-placeholder {
- color: red;
- }
- .novalue:-ms-input-placeholder {
- color: red;
- }
- </style>
- </head>
- <body>
- <div class="container">
- <div class="jumbotron">
- <h1>My Address Book</h1>
- </div>
- <div class="add-form">
- <form class="form-horizontal" onsubmit="return false">
- <div class="form-group">
- <label for="adname" class="col-sm-2 control-label">Name</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" id="adname" placeholder="이름을 입력하세요." required>
- </div>
- </div>
- <div class="form-group">
- <label for="ademail" class="col-sm-2 control-label">Email Address</label>
- <div class="col-sm-10">
- <input type="email" class="form-control" id="ademail" placeholder="your@email.com" required>
- </div>
- </div>
- <div class="form-group">
- <label for="adaddress" class="col-sm-2 control-label">Home Address</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" id="adaddress" placeholder="주소를 입력하세요." required>
- </div>
- </div>
- <div class="form-group">
- <label for="adphone" class="col-sm-2 control-label">Phone Number</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" id="adphone" placeholder="010-111-2222" required>
- </div>
- </div>
- <div class="form-group">
- <label for="adphotos" class="col-sm-2 control-label">Photos</label>
- <div class="col-sm-10">
- <div id="photos" ondragover="dragover(event)" ondrop="drop(event)" ondragleave="dragleave(event)" class="col-sm-12"></div>
- </div>
- </div>
- <div class="form-group">
- <div class="col-sm-offset-2 col-sm-10">
- <button type="submit" class="btn-add btn btn-success">Add Friend</button>
- </div>
- </div>
- </form>
- </div>
- <div class="sort-selection">
- <form class="form-inline" onsubmit="return false">
- <strong>search field and order by </strong>
- <div class="radio">
- <label>
- <input type="radio" name="orderby" id="orderbyAdname" value="adname" checked> Name
- </label>
- </div>
- <div class="radio">
- <label>
- <input type="radio" name="orderby" id="orderbyAdemail" value="ademail"> Email
- </label>
- </div>
- <div class="radio">
- <label>
- <input type="radio" name="orderby" id="orderbyAdaddress" value="adaddress"> Address
- </label>
- </div>
- <div class="radio">
- <label>
- <input type="radio" name="orderby" id="orderbyAdphone" value="adphone"> Phone
- </label>
- </div>
- <strong> | </strong>
- <div class="radio">
- <label>
- <input type="radio" name="ascdesc" id="ascdescAsc" value="next" checked> asc
- </label>
- </div>
- <div class="radio">
- <label>
- <input type="radio" name="ascdesc" id="ascdescDesc" value="prev"> desc
- </label>
- </div>
- <strong> | </strong>
- <div class="form-group">
- <label for="searchText" class="control-label">검색어</label>
- <input type="text" class="form-control" id="searchText" placeholder="search text here">
- </div>
- <button type="button" id="searchBtn" class="btn btn-sm btn-default">찾기</button>
- </form>
- </div>
- <div id="list">
- <table class="table">
- <tr>
- <th>Name</th>
- <th>Address</th>
- <th>Email</th>
- <th>Phone</th>
- <th> </th>
- </tr>
- </table>
- </div>
- </div>
- <div id="moreinfo" class="hideonready" title="상세정보">
- <h1 id="friendname"></h1>
- <p id="friendemail"></p>
- <p id="friendaddress"></p>
- <p id="friendphone"></p>
- <p id="friendphotos"></p>
- </div>
- <div id="updatefrm" class="hideonready" title="정보수정">
- <form class="form">
- <div class="form-group">
- <label for="adname-input">Name</label>
- <input type="text" class="form-control" id="adname-input" value="">
- </div>
- <div class="form-group">
- <label for="ademail-input">Email</label>
- <input type="email" class="form-control" id="ademail-input" value="">
- </div>
- <div class="form-group">
- <label for="adaddress-input">Address</label>
- <input type="text" class="form-control" id="adaddress-input" value="">
- </div>
- <div class="form-group">
- <label for="adphone-input">Phone</label>
- <input type="text" class="form-control" id="adphone-input" value="">
- </div>
- <div class="form-group">
- <label for="adphotos-input">Photos</label>
- <div id="adphotos-input"></div>
- </div>
- </form>
- </div>
- <script src="http://code.jquery.com/jquery-1.12.4.js"></script>
- <script src="http://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>
- <script>
- var db;
- //addressbook 데이터베이스 오픈(없으면 생성)
- var request = window.indexedDB.open("adbook",1);
- //DB Open Error Handling
- request.onerror = function(event) {
- console.log("DB Open Error");
- }
- //After DB Open
- request.onsuccess = function(event) {
- db = request.result;
- readAllData();
- }
- request.onupgradeneeded = function(event) {
- var result = event.target.result;
- var objectStore = result.createObjectStore("address",{ keyPath: "id", autoIncrement:true });
- //정렬을 위해 key들을 index에 추가
- objectStore.createIndex("adname", "adname", { unique: false });
- objectStore.createIndex("ademail", "ademail", { unique: false });
- objectStore.createIndex("adaddress", "adaddress", { unique: false });
- objectStore.createIndex("adphone", "adphone", { unique: false });
- }
- function readAllData(orderKey, ascdescType, searchText){
- var orderKey = orderKey ? orderKey : "adname";
- var ascdescType = ascdescType ? ascdescType : "next";
- var searchText = searchText ? searchText : "";
- var tr = db.transaction(["address"]);
- var store = tr.objectStore("address");
- $("#list table tr:not(:first)").remove();
- var keyRangeValue = null;
- if(searchText !== "") {
- //검색어 처리 : IDBKeyRange.bound("시작문자열","끝문자열");
- //시작문자열과 끝문자열을 같은 것으로 하여 검색
- //끝문자열에 \uffff 문자열을 더해 주면 like 검색과 같은 효과를 냄
- //만일 \uffff를 빼면 일치하는 단어가 포함된 경우만 검색
- keyRangeValue = IDBKeyRange.bound(searchText, searchText);
- }
- var request = store.index(orderKey).openCursor(keyRangeValue, ascdescType);
- request.onsuccess = function(event) {
- var cursor = event.target.result; //한 줄 얻어내기
- if (cursor) {
- addList(cursor.value);
- cursor.continue(); //다음 줄로 이동
- }
- };
- }
- function readData(id,act){
- if( ! id ) return;
- var tr = db.transaction(["address"]);
- var store = tr.objectStore("address");
- var request = store.get(id);
- request.onsuccess = function(event){
- var data = request.result;
- if( act == "read") {
- popUpInfo(data);
- } else if( act =="edit" ) {
- popUpEdit(data);
- }
- };
- request.onerror = function(event){
- console.log("read error");
- };
- }
- function popUpInfo(data){
- if( ! data ) return;
- $("#friendname").text(data.adname);
- $("#friendemail").text(data.ademail);
- $("#friendaddress").text(data.adaddress);
- $("#friendphone").text(data.adphone);
- if(data.photos){
- var photolist = data.photos;
- var i;
- for( i=0; i<photolist.length;i++){
- var src = photolist[i].src;
- var img = "<img src='" + src + "' width='100' height='100' style='margin: 5px;'>";
- $("#friendphotos").append(img);
- }
- }
- $("#moreinfo").dialog({
- width: 500,
- height: 500,
- title: data.adname + " 상세정보",
- modal: true
- });
- }
- var photoeditlist = [];
- function popUpEdit(data){
- if( ! data ) return;
- var id;
- $("#updatefrm").dialog({
- width: 500,
- height: 500,
- title: data.adname + " 정보수정",
- modal: true,
- open: function(){
- id = data.id;
- $("#adname-input").val(data.adname);
- $("#ademail-input").val(data.ademail);
- $("#adaddress-input").val(data.adaddress);
- $("#adphone-input").val(data.adphone);
- if(data.photos){
- photoeditlist = data.photos;
- var i;
- for( i=0; i<photoeditlist.length;i++){
- var src = photoeditlist[i].src;
- var img = "<div class='photolist-edit'>";
- img += "<img src='" + src + "'>";
- img += "<div class='photolist-delete' data-imgid='" + i + "'>X</div>";
- img += "</div>";
- $("#adphotos-input").append(img);
- }
- }
- },
- buttons: {
- "저장":function(){
- var tr = db.transaction(["address"], "readwrite");
- var store = tr.objectStore("address");
- var request = store.get(id);
- request.onsuccess = function(event){
- var data = event.target.result;
- data.adname = $("#adname-input").val();
- data.ademail = $("#ademail-input").val();
- data.adaddress = $("#ademail-input").val();
- data.adphone = $("#adphone-input").val();
- data.photos = photoeditlist;
- var dbupdate = store.put(data);
- dbupdate.onsuccess = function(event){
- console.log('데이터 수정 성공');
- $("#list" + id + " .adname").text(data.adname);
- $("#updatefrm").dialog("close");
- };
- dbupdate.onerror = function(event){
- console.log('데이터 수정 실패');
- };
- };
- request.onerror = function(event){
- console.log('데이터 수정 실패');
- }
- },
- "닫기":function(){
- $(this).dialog("close");
- }
- },
- close: function(){
- $("#adname-input").val("");
- $("#ademail-input").val("");
- $("#ademail-input").val("");
- $("#adphone-input").val("");
- $("#adphotos-input").html("");
- while (photoeditlist.length) { photoeditlist.pop(); }
- }
- });
- }
- $("#adphotos-input").on("click",".photolist-delete",function(){
- var id = $(this).attr("data-imgid");
- photoeditlist.splice(id, 1);//배열에서 특정 index를 제거함
- $(this).parent(".photolist-edit").remove();
- //배열에서 하나를 삭제하였으므로 포토리스트에서 버튼마다 주어진 번호(배열기준)를 다시 0부터 순서대로 부여해주어야 함.
- var i = 0;
- $("#adphotos-input .photolist-delete").each(function(){
- $(this).attr("data-imgid",i);
- i++;
- });
- });
- function addList(data){
- if( ! data ) return;
- var row = "<tr id='list" + data.id + "'>";
- row += "<td class='adname'>" + data.adname + "</td>";
- row += "<td class='adaddress'>" + data.adaddress + "</td>";
- row += "<td class='ademail'>" + data.ademail + "</td>";
- row += "<td class='adphone'>" + data.adphone + "</td>";
- row += "<td>";
- row += "<a class='btn-del btn btn-danger' data-id='" + data.id + "'>삭제</a>";
- row += " <a class='btn-read btn btn-primary' data-id='" + data.id + "'>보기</a>";
- row += " <a class='btn-edit btn btn-warning' data-id='" + data.id + "'>수정</a>";
- row += "</td>";
- row += "</tr>";
- $(row).insertAfter("#list table tr:last");
- }
- function deleteData(id){
- if( ! id ) return false;
- var tr = db.transaction(["address"], "readwrite");
- var store = tr.objectStore("address");
- var request = store.delete(id);
- request.onsuccess = function(event) {
- $("#list" + id).remove();
- };
- request.onerror = function(event) {
- //some error code
- }
- }
- function saveData(data){
- var tr = db.transaction(["address"], "readwrite");
- var store = tr.objectStore("address");
- var request = store.add(data);
- request.onsuccess = function(event){
- //마지막에 추가한 레코드의 id를 구함
- var id = event.target.result;
- data.id = id; // 데이터 객체 data에 id를 추가
- addList(data);
- $("#adname").val("");
- $("#ademail").val("");
- $("#adaddress").val("");
- $("#adphone").val("");
- };
- request.onerror = function(event) {
- console.log("Error : data save error");
- }
- }
- function updateData(id){
- var tr = db.transaction(["address"], "readwrite");
- var store = tr.objectStore("address");
- var request = store.get(id);
- request.onsuccess = function(event){
- var data = event.target.result;
- data.adname = $("#adname-input").val();
- data.ademail = $("#ademail-input").val();
- data.adaddress = $("#ademail-input").val();
- data.adphone = $("#adphone-input").val();
- var dbupdate = store.put(data);
- dbupdate.onsuccess = function(event){
- console.log('데이터 수정 성공');
- return true;
- };
- dbupdate.onerror = function(event){
- console.log('데이터 수정 실패');
- return false;
- };
- };
- request.onerror = function(event){
- console.log('데이터 수정 실패');
- return false;
- }
- }
- $("#searchBtn").on("click",function(event){
- event.preventDefault();
- var searchText = $("#searchText").val();
- var orderKey = $("input[name='orderby']:checked").val();
- var ascdescType = $("input[name='ascdesc']:checked").val();
- var searchText = $("#searchText").val();
- readAllData(orderKey,ascdescType,searchText);
- });
- $("#searchText").keypress(function(event){
- if(event.which == 13) {
- $("#searchBtn").click();
- }
- });
- $(".btn-add").on("click",function(event){
- event.preventDefault();
- var friend = {};
- friend.adname = $("#adname").val();
- friend.ademail = $("#ademail").val();
- friend.adaddress = $("#adaddress").val();
- friend.adphone = $("#adphone").val();
- friend.photos = photos;
- var dataok = true;
- if( ! friend.adname ) {
- $("#adname").addClass("novalue");
- dataok = false;
- } else {
- $("#adname").removeClass("novalue");
- }
- if( ! friend.ademail ) {
- $("#ademail").addClass("novalue");
- dataok = false;
- } else {
- $("#ademail").removeClass("novalue");
- }
- if( ! friend.adaddress ) {
- $("#adaddress").addClass("novalue");
- dataok = false;
- } else {
- $("#adaddress").removeClass("novalue");
- }
- if( ! friend.adphone ) {
- $("#adphone").addClass("novalue");
- dataok = false;
- } else {
- $("#adphone").removeClass("novalue");
- }
- if( dataok === true ) saveData(friend);
- });
- $("#list").on("click",".btn-del",function(){
- var id = $(this).attr("data-id");
- if( ! id ) return;
- id = parseInt(id,10);
- deleteData(id);
- });
- $("#list").on("click",".btn-read",function(){
- var id = $(this).attr("data-id");
- if( ! id ) return;
- id = parseInt(id,10);
- readData(id,"read");
- });
- $("#list").on("click",".btn-edit",function(){
- var id = $(this).attr("data-id");
- if( ! id ) return;
- id = parseInt(id,10);
- readData(id,"edit");
- });
- function dragover(event){
- event.preventDefault();
- var id = event.target.id;
- $("#" + id).css({"background":"red"});
- }
- function dragleave(event){
- event.preventDefault();
- var id = event.target.id;
- $("#" + id).css({"background":"#ff0"});
- }
- var photos;
- function drop(event){
- event.preventDefault();
- photos = [];
- var data = event.dataTransfer;
- var files = data.files;
- var i;
- for( i=0; i<files.length; i++){
- if( files[i].type == "image/jpeg" || files[i].type == "image/png" || files[i].type == "image/gif" ) {
- addPhotos(files[i]);
- }
- }
- }
- function addPhotos(file){
- var photo = {};
- photo.name = file.name;
- photo.size = file.size;
- photo.type = file.type;
- var reader = new FileReader();
- reader.addEventListener("load",function(){
- photo.src = reader.result;
- //console.log(photo);
- photos.push(photo);
- });
- reader.readAsDataURL(file);
- }
- </script>
- </body>
- </html>
Add Comment
Please, Sign In to add comment