summaryrefslogtreecommitdiff
path: root/blockly/accessible/workspace.component.js
blob: 25573502089fc67996722b5df2294cb6a37bfd8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
 * AccessibleBlockly
 *
 * Copyright 2016 Google Inc.
 * https://developers.google.com/blockly/
 *
 * Licensed under the Apache License, Version 2.0 (the 'License');
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an 'AS IS' BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @fileoverview Angular2 Component that details how a Blockly.Workspace is
 * rendered in AccessibleBlockly.
 * @author madeeha@google.com (Madeeha Ghori)
 */

blocklyApp.WorkspaceComponent = ng.core
  .Component({
    selector: 'blockly-workspace',
    template: `
    <label>
      <h3 #workspaceTitle id="blockly-workspace-title">{{'WORKSPACE'|translate}}</h3>
    </label>

    <div id="blockly-workspace-toolbar" (keydown)="onWorkspaceToolbarKeypress($event)">
      <span *ngFor="#buttonConfig of toolbarButtonConfig">
        <button (click)="buttonConfig.action()"
                class="blocklyTree blocklyWorkspaceToolbarButton">
          {{buttonConfig.text}}
        </button>
      </span>
      <button id="clear-workspace" (click)="clearWorkspace()"
              [attr.aria-disabled]="isWorkspaceEmpty()"
              class="blocklyTree blocklyWorkspaceToolbarButton">
        {{'CLEAR_WORKSPACE'|translate}}
      </button>
    </div>

    <div *ngIf="workspace">
      <ol #tree *ngFor="#block of workspace.topBlocks_; #i = index"
          tabindex="0" role="tree" class="blocklyTree blocklyWorkspaceTree"
          [attr.aria-activedescendant]="getActiveDescId(tree.id)"
          [attr.aria-labelledby]="workspaceTitle.id"
          (keydown)="onKeypress($event, tree)">
        <blockly-workspace-tree [level]=1 [block]="block" [tree]="tree" [isTopLevel]="true">
        </blockly-workspace-tree>
      </ol>
    </div>
    `,
    directives: [blocklyApp.WorkspaceTreeComponent],
    pipes: [blocklyApp.TranslatePipe]
  })
  .Class({
    constructor: [
        blocklyApp.TreeService, blocklyApp.UtilsService,
        function(_treeService, _utilsService) {
      // ACCESSIBLE_GLOBALS is a global variable defined by the containing
      // page. It should contain a key, toolbarButtonConfig, whose
      // corresponding value is an Array with two keys: 'text' and 'action'.
      // The first is the text to display on the button, and the second is the
      // function that gets run when the button is clicked.
      this.toolbarButtonConfig =
          ACCESSIBLE_GLOBALS && ACCESSIBLE_GLOBALS.toolbarButtonConfig ?
          ACCESSIBLE_GLOBALS.toolbarButtonConfig : [];
      this.workspace = blocklyApp.workspace;
      this.treeService = _treeService;
      this.utilsService = _utilsService;
    }],
    clearWorkspace: function() {
      this.workspace.clear();
    },
    getActiveDescId: function(treeId) {
      return this.treeService.getActiveDescId(treeId);
    },
    onWorkspaceToolbarKeypress: function(e) {
      this.treeService.onWorkspaceToolbarKeypress(
          e, document.activeElement.id);
    },
    onKeypress: function(e, tree) {
      this.treeService.onKeypress(e, tree);
    },
    isWorkspaceEmpty: function() {
      return this.utilsService.isWorkspaceEmpty();
    }
  });