! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

SpreadJS 간트시트(GanttSheet) 시작하기 > 온라인 스터디

본문 바로가기

고급기능 SpreadJS 간트시트(GanttSheet) 시작하기

페이지 정보

작성자 MESCIUS루카스 작성일 2024-02-22 15:07 조회 71회 댓글 0건

본문

SpreadJS V17에 드디어 많은 고객사와 개발자 분들께서 요청해주셨던 간트시트(Gantt Sheet)기능이 추가되었습니다. 


많은 기업에서 프로젝트 또는 업무의 진행 상황을 기록하고 빠르게 파악하기 위해, 일반적으로  엑셀로 간트(Gantt)를 만들어 사용합니다. 엑셀(Excel) 시트의 "열(Column)"에는 업무 리스트를  "행(Row)"에는 일자(날짜)를 작성하여, 실제 프로젝트를 진행하면서 업무 진행률에 맞추어 셀에 색상으로 진행 상태 표시하여 업무를 관리할 수 있게 만들어 사용합니다.


하지만, 엑셀(Excel) 파일로 이러한 프로젝트를 관리하다 보면, 작업자 간에 공유가 잘되지 않아 작업의 정확한 진행 파악과 관리가 어렵거나, 이후에 작업의 내용과 진행 시에 추가된 사안을 재이용/재가공하기에 어렵다는 문제점들이 있습니다.  이를 해결하기 위해, 간트 기능을 시스템(전산화)하고자 하지만, 간트의 복잡한 UI와 기능을 웹 시스템 상에 구현해야하는 기획자/개발자 입장에서는 이는 역시 결코 쉬운 일이 아닙니다.


이러한 문제와 수 많은 고객사들의 요청과 피드백을 받아 SpreadJS의 Excel 스프레드시트 기반으로 새로운 "간트시트 | GanttSheet" 컨트롤을 추가하였습니다.



* 아래는 실제 SpreadJS의 간트시트(GanttSheet)를 구현한 화면 입니다. 아래 HTML/JS 탭을 통해서 소스코드를 확인할 수 있습니다. 

 


이번 포스팅에서는 글에서는 SpreadJS v17부터 새롭게 제공하는 간트시트(GanttSheet)를 여러분의 앱에 적용하는 방법을 설명합니다.



간트시트 | GanttSheets 시작하기

아래의 단계를 따라 SpreadJS의 GanttSheets(간트시트)를 만들 수 있습니다.


1. 간트 시트를 사용하려면 다음 스크립트 파일을 추가하세요.
*간트시트는 GC.Spread.Sheets.GanttSheet.GanttSheet 클래스를 사용하여 생성됩니다.
 
<script src='.../spreadjs/gc.spread.sheets.all.x.x.x.min.js' type='text/javascript'></script>
<script src='.../spreadjs/plugins/gc.spread.sheets.tablesheet.x.x.x.min.js' type='text/javascript'></script>
<script src='.../spreadjs/plugins/gc.spread.sheets.ganttsheet.x.x.x.min.js' type='text/javascript'></script>

2. 스프레드 컨테이너를 생성한 다음 GanttSheet 유형의 시트 탭을 추가합니다.

var workbook = new GC.Spread.Sheets.Workbook(document.getElementById("ss"),{ sheetCount: 0 });
var ganttSheet = workbook.addSheetTab(0, "GanttSheet", GC.Spread.Sheets.SheetType.ganttSheet);


3. DataManager 메소드를 사용하여 데이터 관리자를 초기화합니다.

SpreadJS의 새로운 DataManager는 서버 측(에 요청을 보낸 다음 데이터가 준비되면, 데이터를 쉽고 빠르게 GanttSheet에 바인딩하는 것을 도와주는 강력한 로컬 데이터 엔진입니다. 

var dataManager = spread.dataManager();


4. addTable 메소드를 사용하여 데이터 관리자에 테이블을 추가합니다. 이 메소드는 테이블 이름을 문자열로 받아들이고 IDataSourceOption 인터페이스 옵션을 사용합니다.


var myTable1 = dataManager.addTable("myTable1", {
  batch: true,
  remote: {
    read: {
    }
  },
});
참고: 데이터는 GanttSheet와 관련이 있으므로 batch(배치모드)를 사용하여 저장해야 합니다. 


5. 데이터 소스 구조를 기반으로 필요한 계층 구조 스키마를 정의합니다.

SpreadJS 간트시트에서 계층 구조를 표현할 수 있는 데이터 구조는 3가지로 정의할 수 있습니다. (자세히 알아보기)

  • Parent: 상위의 부모ID를 통해 계층 표현 
  • Level: 각 작업의 레벨 숫자의 크기에 따라서 계층 표현
  • ChildrenPath: JSON의 객체(Object) 배열 구조에 맞추어서 계층 표현


이번 예제에는 대표적으로 게시판과 같은 계층 구조에서 많이 사용하는 Parent(부모ID)를 기반으로 설명합니다.



샘플 JSON


아래와 같이 샘플 JSON 데이터에는 "id(작업고유id)"와 "parentId(부모작업id)"를 가지고 있습니다. 

[
    {
        "id": 1,
        "parentId": null,
        "taskNumber": 1,
        "name": "Plan for Project Server 2013 deployment",
        "duration": "7 days",
        "predecessors": "",
        "resource": 1,
        "cost": 100
    },
    {
        "id": 2,
        "parentId": 1,
        "taskNumber": 2,
        "name": "Prepare for deployment",
        "duration": "1 days",
        "predecessors": "1",
        "resource": null,
        "cost": null
    },
    ....
]


실제 사용하는 JSON 데이터 상의 계층 구조 표현을 위한 "이름(name)" 변수가 반드시 "id"와 "parentId"일 필요는 없습니다.


대신, 아래 코드에서 처럼, JSON데이터 상에서 어떤 값(Value)를 Parent(부모) 값으로 사용하여 계층 구조가 표현될 것인지 설정을 해주면 됩니다.


var myTable1 = dataManager.addTable("myTable1", {
  batch: true,
  remote: {
    read: {
    }
  },
  schema: {
    hierarchy: {
      type: "Parent",
      column: "parentId" //받아온 JSON 데이터의 parentID라는 값을 계층구조 기준으로 사용
    },
    columns: {
      id: { isPrimaryKey: true },
      taskNumber: { dataType: "rowOrder" }
    }
  }
});


6. addView 메소드를 사용하여 Data Manager의 테이블에 뷰를 추가하고 열 정보를 정의하여 간트 시트에 어떤 정보를 보여줄지 설정합니다.

var view = myTable1.addView("myView1", [
    { value: "taskNumber", caption: "NO.", width: 60 },
    { value: "name", caption: "Task Name", width: 200 },
    { value: "duration", caption: "Duration", width: 90 },
    { value: "predecessors", caption: "Predecessors", width: 120 , visible: false}
]);


7. Data Manager(데이터 관리자) 테이블의 fetch 메소드를 사용하여 데이터를 가져온 다음, BindGanttView 메소드를 사용하여 가져온 뷰를 간트 시트에 바인딩합니다.

view.fetch().then(function () {
    ganttSheet.bindGanttView(view);
});


위 단계에 따라 완성된 샘플은 아래에서 확인하실 수 있습니다.


* 아래는 실제 SpreadJS의 간트시트(GanttSheet)를 구현한 화면 입니다. 아래 HTML/JS 탭을 통해서 소스코드를 확인할 수 있습니다. 

 



참고: 간트시트(GanttSheet) 데이터 스키마 종류


SpreadJS의 간트시트(GanttSheet)에서 계층 구조를 표현할 수 있는 데이터 소스의 스키마(Schema)는 Parent, Level, ChildrenPath 3가지로 정의할 수 있습니다.


GanttSheet 기능을 위해 JSON 데이터 구조를 설계할 때 아래의 3가지 중 하나를 고려하여 구조를 만들어 서버로 부터 데이터를 가져오는 것 권장합니다.

  • Parent: 상위의 부모ID를 통해 계층 표현 
  • Level: 각 작업의 레벨 숫자의 크기에 따라서 계층 표현
  • ChildrenPath: JSON의 객체 구조에 맞추어서 계층 표현


각 계층의 JSON 데이터 예시와 SpreadJS에서 각 데이터에 따른 계층 구조 표현을 위한  Schema 설정 코드는 아래와 같습니다.



Parent 계층 구조


대표적으로 게시판과 같은 하위 댓글과 같은 계층 구조에서 많이 사용하는 Parent(부모ID)를 기반으로 데이터 구조를 설계하여 간트(Gantt)에서 작업(Task) 간의 부모/자식 관계를 표현할 수 있습니다.



[JSON 데이터 샘플]


id "작업 고유의 id 값"을 나타내며, parentId "부모 작업의 고유 id 값"을 나타냅니다.

[
    {
        "id": 1,
        "parentId": null,
        "taskNumber": 1,
        "name": "Plan for Project Server 2013 deployment",
        "duration": "7 days",
        "predecessors": "",
        "resource": 1,
        "cost": 100
    },
    {
        "id": 2,
        "parentId": 1,
        "taskNumber": 2,
        "name": "Prepare for deployment",
        "duration": "1 days",
        "predecessors": "1",
        "resource": null,
        "cost": null
    },
    ....
]




[SpeadJS 스키마(Schema) 세팅]


아래와 같이 SpreadJS의 DataManager에 Table을 추가하고 해당 테이블을 schema 속성을 Parenet로 설정해주면, 부모ID 값을 기반으로 계층을 표현합니다.


  • type: "Parenet"       // 계층 구조를 Parent 값으로 그리겠다는 속성 설정
  • column: "parentId"  // JSON데이터의 "parentId" 값이 부모ID라고 매칭


var myTable1 = dataManager.addTable("myTable1", {
    batch: true,
    remote: {
      read: {
      }
    },
    schema: {
      hierarchy: {
        type: "Parent",
        column: "parentId"
      },
      columns: {
        id: { isPrimaryKey: true },
        taskNumber: { dataType: "rowOrder" }
      }
    }
  });


[결과화면]




Level 계층 구조


​레벨 값을 기반으로 데이터 구조를 설계하여 간트(Gantt)에서 작업(Task) 사이의 계층을 표현할 수 있습니다. 


[JSON 데이터 샘플]


level은 각 작업의 레벨 값을 나타냅니다. 

레벨 값이 낮을 수록 상위 작업, 높을수록 하위 작업을 표현 합니다. 동일한 레벨 일 경우, 동일한 계층의 작업입니다.

[
    {
        "taskNumber": 1,
        "name": "Plan for Project Server 2013 deployment",
        "duration": "7 days",
        "predecessors": "",
        "level": 1,
        "resource": 1,
        "cost": 100
    },
    {
        "taskNumber": 2,
        "name": "Prepare for deployment",
        "duration": "1 days",
        "predecessors": "1",
        "level": 2,
        "resource": null,
        "cost": null
    },
    ....
]



[SpeadJS 스키마(Schema) 세팅]


아래와 같이 SpreadJS의 DataManager에 Table을 추가하고 해당 테이블을 schema 속성을 Level로 설정해주면, 레벨 값을 기반으로 계층을 표현합니다.


  • type: "Level"          // 계층 구조를 레벨 값으로 그리겠다는 속성 설정
  • column: "level"     // JSON 데이터의 "level" 값을 기반으로 레벨 설정

  var myTable1 = dataManager.addTable("myTable1", {
    batch: true,
    remote: {
      read: {
        url: "https://developer.mescius.com/spreadjs/demos/server/api/Gantt_level"
      }
    },
    schema: {
      hierarchy: {
        type: "Level",
        column: "level"
      }
    }
  });


[결과화면]




ChildrenPath 계층 구조


객체 내의 ChildrenPath(JSON Object 배열)를 기반으로 데이터 구조를 설계하여 간트(Gantt)에서 작업(Task) 사이의 계층을 표현할 수 있습니다.


[JSON 데이터 샘플]


아래 샘플에서 children은 해당 작업의 하위 작업 객체(Object)를 나타냅니다. 

[
    {
        "taskNumber": 1,
        "name": "Plan for Project Server 2013 deployment",
        "duration": "7 days",
        "predecessors": "",
        "resource": 1,
        "cost": 100
    },
    {
        "taskNumber": 2,
        "name": "Prepare for deployment",
        "duration": "1 days",
        "predecessors": "1",
        "resource": null,
        "cost": null,
        "children": [
            {
                "taskNumber": 3,
                "name": "Create users and groups in the Active Directory service",
                "duration": "1 day",
                "predecessors": "",
                "resource": 1,
                "cost": 200
            },
            {
                "taskNumber": 4,
                "name": "Configure SQL Server and Analysis Services",
                "duration": "3 days",
                "predecessors": "3",
                "resource": null,
                "cost": null,
                "children": [
                    {
                        "taskNumber": 5,
                        "name": "Configure SQL Server network settings",
                        "duration": "1 day",
                        "predecessors": "",
                        "resource": 1,
                        "cost": 350
                    },
            ....
    }
]


[SpeadJS 스키마(Schema) 세팅]


아래와 같이 SpreadJS의 DataManager에 Table을 추가하고 해당 테이블을 schema 속성을 Childrenpath로 설정해주면, JSON 데이터의 구조를 기반으로 계층을 표현합니다.


  • type: "ChildrenPath"  // 계층 구조를 children 객체를 기준으로 그리겠다는 속성 설정
  • column: "children"    // JSON 데이터의 "children"라는 이름의 객체를 하위 작업으로 지정

  var myTable1 = dataManager.addTable("myTable1", {
    batch: true,
    remote: {
      read: {
        url: "https://developer.mescius.com/spreadjs/demos/server/api/Gantt_Children"
      }
    },
    schema: {
      hierarchy: {
        type: "ChildrenPath",
        column: "children"
      }
    }
  });


[결과화면]






지금 바로 SpreadJS를 다운로드하여 직접 테스트해보세요!

spjs.png

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.