ズーム

ガントシートはガントチャート領域を拡大または縮小して、必要に応じてチャートの表示範囲を変更することができます。

表示倍率 zoomFactorは、タイムスケールの表示倍率を示す数値です。 これを変更するには、タイムスケールのzoom関数を呼び出します。 拡大/縮小 タイムスケールを拡大/縮小することができます。 自動ズーム また、タイムスケールの各層の目盛りのラベルに従って、タイムスケールを適切な倍率に自動的にズームすることもできる。 指定した表示倍率に変更 タイムスケールを特定の倍率に拡大または縮小することができます。 次のコードでは、タイムスケールをズームして、ビューポートにターゲットの日付範囲を表示します。 タイムスケールは最も近い目盛りで調整されることに注意してください。 タイムスケールの単位の調整 ズーム倍率に応じて、タイムスケールの階層の単位を適切な値に調整するかどうかを boolean値で設定します。デフォルト値はtrueです: timescale.zoomIn(adjustTierUnit); timescale.zoomOut(adjustTierUnit); timescale.zoomTo(zoomFactor, adjustTierUnit); timescale.zoomToRange(startDate, endDate, adjustTierUnit);
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ import { Component, NgModule, enableProdMode } from '@angular/core'; import { bootstrapApplication, BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { FormsModule } from '@angular/forms'; import { SpreadSheetsModule } from '@mescius/spread-sheets-angular'; import GC from '@mescius/spread-sheets'; import "@mescius/spread-sheets-tablesheet"; import "@mescius/spread-sheets-ganttsheet"; import '@mescius/spread-sheets-resources-ja'; GC.Spread.Common.CultureManager.culture("ja-jp"); import './styles.css'; declare let SplitView: any; @Component({ standalone: true, imports: [SpreadSheetsModule, BrowserModule, FormsModule], selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { spread: GC.Spread.Sheets.Workbook; ganttSheet: GC.Spread.Sheets.GanttSheet; myTable: any; adjustTierUnit = true; zoomFactor = "1"; zoomToType = "0"; hostStyle = { width: '100%', height: '100%' }; initSpread($event: any) { this.spread = $event.spread; let spread = this.spread; spread.suspendPaint(); spread.clearSheets(); this.initDataSource(spread); this.initGanttSheet(spread); spread.resumePaint(); initSplitView(spread); } initDataSource(spread: GC.Spread.Sheets.Workbook) { let tableName = "Gantt_Id"; let baseApiUrl = getBaseApiUrl(); let apiUrl = baseApiUrl + "/" + tableName; let dataManager = spread.dataManager(); this.myTable = dataManager.addTable("myTable", { batch: true, remote: { read: { url: apiUrl } }, schema: { hierarchy: { type: "Parent", column: "parentId" }, columns: { id: { isPrimaryKey: true }, taskNumber: { dataType: "rowOrder" } } } }); } initGanttSheet(spread: GC.Spread.Sheets.Workbook) { let ganttSheet = spread.addSheetTab(0, "GanttSheet", GC.Spread.Sheets.SheetType.ganttSheet); this.ganttSheet = ganttSheet; let view = this.myTable.addView("ganttView", [ { 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 } ]); view.fetch().then(function() { ganttSheet.bindGanttView(view); }).then(function() { ganttSheet.project.timescale.zoomOut(); }); } tierUnit() { this.adjustTierUnit = !this.adjustTierUnit; } zoomAuto() { this.ganttSheet.project.timescale.zoomAuto(); syncPanel(this.ganttSheet); } zoomIn() { this.ganttSheet.project.timescale.zoomIn(this.adjustTierUnit); syncPanel(this.ganttSheet); } zoomOut() { this.ganttSheet.project.timescale.zoomOut(this.adjustTierUnit); syncPanel(this.ganttSheet); } zoomTo() { let factor = Number(this.zoomFactor); if (!isNaN(factor)) { this.ganttSheet.project.timescale.zoomTo(factor, this.adjustTierUnit); syncPanel(this.ganttSheet); } } zoomToRange() { let zoomToType = this.zoomToType; let project = this.ganttSheet.project; if (zoomToType === "0") { let task = this.ganttSheet.getActiveTask(); if (task && task.finish && task.start) { project.timescale.zoomToRange(task.start, task.finish); } } else if (zoomToType === "1") { let startDate = Math.min.apply(null, project.tasks.filter(function(t: any) { return t.start }).map(function(t: any) { return t.start.valueOf() })); let finishDate = Math.max.apply(null, project.tasks.filter(function(t: any) { return t.finish }).map(function(t: any) { return t.finish.valueOf() })); project.timescale.zoomToRange(new Date(startDate), new Date(finishDate)); } syncPanel(this.ganttSheet); } } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + 'server/api'; } function syncPanel(ganttSheet: GC.Spread.Sheets.GanttSheet) { let zoomFactorInput = document.getElementById("zoom-factor"); zoomFactorInput.value = ganttSheet.project.timescale.zoomFactor; } function initSplitView(spread: any) { let host = document.getElementById("split-view"); let content = host.getElementsByClassName("split-content")[0]; let panel = host.getElementsByClassName("split-panel")[0]; new SplitView({ host: host, content: content, panel: panel, refreshContent: function() { spread.refresh(); } }); } enableProdMode(); bootstrapApplication(AppComponent);
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ja/angular/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/spread/source/splitView/splitView.css"> <!-- Polyfills --> <script src="$DEMOROOT$/ja/angular/node_modules/core-js/client/shim.min.js"></script> <script src="$DEMOROOT$/ja/angular/node_modules/zone.js/fesm2015/zone.min.js"></script> <!-- SystemJS --> <script src="$DEMOROOT$/ja/angular/node_modules/systemjs/dist/system.js"></script> <script src="systemjs.config.js"></script> <!-- plugins --> <script src="$DEMOROOT$/spread/source/splitView/SplitView.js"></script> <script> // workaround to load 'rxjs/operators' from the rxjs bundle System.import('rxjs').then(function (m) { System.import('@angular/compiler'); System.set(SystemJS.resolveSync('rxjs/operators'), System.newModule(m.operators)); System.import('$DEMOROOT$/ja/lib/angular/license.ts'); System.import('./src/app.component'); }); </script> </head> <body> <app-component></app-component> </body> </html>
<div id="split-view" class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets split-content" [hostStyle]="hostStyle" (workbookInitialized)="initSpread($event)"> <gc-worksheet> </gc-worksheet> </gc-spread-sheets> <div class="options-container split-panel"> <div class="option-row option-title"> ガントチャート領域をズームする </div> <div class="option-block"> <div class="option-row"> <label class="option-checkbox active" id="adjust-tier-unit" [ngClass]="{'active': adjustTierUnit}" (click)="tierUnit()">単位を調整する</label> <div class="option-info">* ズーム時にタイムスケールの期間単位を切り替える</div> </div> </div> <div class="option-block"> <div class="option-row"> <input type="button" id="zoom-auto" class="option-button" value="自動ズーム" (click)="zoomAuto()" /> </div> <div class="option-row"> <input type="button" id="zoom-in" class="option-button" value="拡大" (click)="zoomIn()" /> </div> <div class="option-row"> <input type="button" id="zoom-out" class="option-button" value="縮小" (click)="zoomOut()" /> </div> </div> <div class="option-block"> <div class="option-row input-box"> <label for="zoom-factor">ズーム倍率</label> <input type="text" id="zoom-factor" [(ngModel)]="zoomFactor"/> <div class="option-info valid">* 有効値: 数値</div> </div> <div class="option-row"> <input type="button" id="zoom-to" class="option-button" value="指定倍率にズーム" (click)="zoomTo()" /> </div> <div class="option-row selection-box"> <label for="zoom-to-type">ズーム範囲</label> <select id="zoom-to-type" [(ngModel)]="zoomToType"> <option value="0">選択したタスク</option> <option value="1">プロジェクト全体</option> </select> </div> <div class="option-row"> <input type="button" id="zoom-to-range" class="option-button" value="指定範囲にズーム" (click)="zoomToRange()" /> </div> </div> </div> </div>
.option-block { background: #fff; padding: 8px; margin: 12px 0; border-radius: 4px; border: 1px dashed #82bc00; box-shadow: 0px 0 6px 0 rgba(0,0,0,0.1); } .option-block.toggle { border: 1px dotted #f7a711; } .option-row { font-size: 14px; box-sizing: border-box; padding: 4px 0; } .option-title { font-weight: bold; color: #656565; } .option-info { font-size: 12px; color: #919191; margin-top: 6px; font-weight: normal; } .option-info.valid { color: #82bc00; } .option-info.toggle { color: #f7a711; } .option-button { width: 100%; padding: 0; line-height: 20px; background: #82bc00; color: #fff; transition: 0.3s; cursor: pointer; outline: none; border-radius: 4px; box-sizing: border-box; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); border: none; } .option-button:hover { background: #82bc00; color: #fff; box-shadow: 0 3px 8px 0 rgba(0,0,0,0.4); } .option-checkbox { background: #fff; border: 1px dashed #f7a711; color: #f7a711; padding: 2px 4px; transition: 0.3s; box-sizing: border-box; cursor: pointer; } .option-checkbox.active { color: #fff; background: #f7a711; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); border-radius: 4px; } .selection-box { position: relative; } .selection-box > select { text-align: left; width: 100%; height: 20px; padding: 0; line-height: 20px; background: transparent; border: none; border-bottom: 2px solid #656565; color: #656565; transition: 0.3s; cursor: pointer; outline: none; box-sizing: border-box; } .selection-box > select > option { background: white; } .selection-box > select:focus { border-bottom: 2px solid #82bc00; color: #82bc00; box-shadow: 0 2px 6px 0 rgba(0,0,0,0.3); } .selection-box > label { position: absolute; cursor: pointer; font-size: 12px; color: #fff; background: #656565; padding: 0 4px; right: 0; top: 6px; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); } .input-box { position: relative; } .input-box > input[type=text] { width: 100%; background: transparent; border: none; color: #656565; border-bottom: 2px solid #656565; outline: none; box-sizing: border-box; transition: 0.3s; } .input-box > input[type=text]:focus { color: #82bc00; border-bottom: 2px solid #82bc00; } .input-box > label { cursor: pointer; position: absolute; right: 0; top: 5px; font-size: 12px; color: #fff; background: #656565; padding: 0 4px; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); }
(function (global) { System.config({ transpiler: 'ts', typescriptOptions: { tsconfig: true }, meta: { 'typescript': { "exports": "ts" }, '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'core-js': 'npm:core-js/client/shim.min.js', 'zone': 'npm:zone.js/fesm2015/zone.min.js', 'rxjs': 'npm:rxjs/dist/bundles/rxjs.umd.min.js', '@angular/core': 'npm:@angular/core/fesm2022', '@angular/common': 'npm:@angular/common/fesm2022/common.mjs', '@angular/compiler': 'npm:@angular/compiler/fesm2022/compiler.mjs', '@angular/platform-browser': 'npm:@angular/platform-browser/fesm2022/platform-browser.mjs', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/fesm2022/platform-browser-dynamic.mjs', '@angular/common/http': 'npm:@angular/common/fesm2022/http.mjs', '@angular/router': 'npm:@angular/router/fesm2022/router.mjs', '@angular/forms': 'npm:@angular/forms/fesm2022/forms.mjs', 'jszip': 'npm:jszip/dist/jszip.min.js', 'typescript': 'npm:typescript/lib/typescript.js', 'ts': './plugin.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js', 'tslib':'npm:tslib/tslib.js', '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-resources-ja': 'npm:@mescius/spread-sheets-resources-ja/index.js', '@mescius/spread-sheets-tablesheet': 'npm:@mescius/spread-sheets-tablesheet/index.js', '@mescius/spread-sheets-ganttsheet': 'npm:@mescius/spread-sheets-ganttsheet/index.js', '@mescius/spread-sheets-angular': 'npm:@mescius/spread-sheets-angular/fesm2020/mescius-spread-sheets-angular.mjs', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'ts', meta: { "*.component.ts": { loader: "system.component-loader.js" } } }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, "node_modules/@angular": { defaultExtension: 'mjs' }, "@mescius/spread-sheets-angular": { defaultExtension: 'mjs' }, '@angular/core': { defaultExtension: 'mjs', main: 'core.mjs' } } }); })(this);