File: schema-management-dialog.js

package info (click to toggle)
openrefine 3.9.5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,440 kB
  • sloc: javascript: 106,758; java: 91,946; xml: 6,634; sh: 614; makefile: 78; python: 71; sql: 59
file content (101 lines) | stat: -rw-r--r-- 3,823 bytes parent folder | download | duplicates (2)
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
95
96
97
98
99
100
101
function SchemaManagementDialog() {
  this.launch();
}

SchemaManagementDialog.prototype.launch = function () {
  const frame = $(DOM.loadHTML("wikidata", "scripts/dialogs/schema-management-dialog.html"));
  const elmts = this.elmts = DOM.bind(frame);
  elmts.dialogHeader.text($.i18n("wikibase-schema-management-dialog/dialog-header"));
  elmts.closeButton.text($.i18n("wikibase-schema/close-button"));
  elmts.importLabel.text($.i18n("wikibase-schema-management-dialog/import"));

  this.activeWikibase =  WikibaseManager.getSelectedWikibaseName();
  this.populateDialog();

  let level = DialogSystem.showDialog(frame);

  elmts.closeButton.on('click',function () {
    DialogSystem.dismissUntil(level - 1);
  });
  let self = this;
  elmts.fileInput.on('change', async function () {
    const file = event.target.files.item(0)
    const text = await file.text();
    
    elmts.errorField.empty();
    // validate JSON structure
    Refine.postCSRF(
      "command/wikidata/parse-wikibase-schema",
      { template: text },
      function(data) {
        // success
        const parsedTemplate = JSON.parse(text);
        if (data.object_type === 'template') {
          WikibaseTemplateManager.addTemplate(self.activeWikibase, parsedTemplate.name, parsedTemplate.schema);
        } else {
          // legacy case: importing a schema generated before OpenRefine 3.7.
          // We need to additionally prompt the user for a name.
          let name = prompt($.i18n('wikibase-schema-management-dialog/enter-new-schema-name'));
          if (name) {
             WikibaseTemplateManager.addTemplate(self.activeWikibase, name, parsedTemplate);
          }
        }
        WikibaseTemplateManager.saveTemplates();
        elmts.fileInput.val('');
        self.populateDialog();
      },
      "json",
      function(error) {
        elmts.errorField.text($.i18n('wikibase-schema-management-dialog/invalid-schema'));
      }
    );

  });
};

SchemaManagementDialog.prototype.populateDialog = function () {
  this.elmts.templateList.empty();
  let templates = WikibaseTemplateManager.getTemplates(this.activeWikibase);

  for (let template of templates) {
    let templateName = template.name;

    const templateItemDOM = $(DOM.loadHTML("wikidata", "scripts/dialogs/schema-list-item.html"));
    let _elmts = DOM.bind(templateItemDOM);
    _elmts.templateName.text(templateName);

    _elmts.renameTemplate.text($.i18n('wikibase-schema-management-dialog/rename'));
    _elmts.downloadTemplate.text($.i18n('wikibase-schema-management-dialog/export'));
    _elmts.deleteTemplate.text($.i18n('wikibase-schema-management-dialog/delete'));

    _elmts.deleteTemplate.on('click', (event) => {
      this.deleteTemplate(this.activeWikibase, templateName);
    });
    _elmts.renameTemplate.on('click', (event) => {
      this.renameTemplate(this.activeWikibase, templateName);
    });
    let dataUrl = 'data:application/json,'+encodeURI(JSON.stringify(template));
    let name = template.name.replace(/[^\p{Letter}0-9]/giu, '_')+'.json';
    _elmts.downloadTemplate
        .attr('download', name)
        .attr('href', dataUrl);

    this.elmts.templateList.append(templateItemDOM);
  }
};

SchemaManagementDialog.prototype.deleteTemplate = function (wikibaseName, templateName) {
  WikibaseTemplateManager.deleteTemplate(wikibaseName, templateName);
  WikibaseTemplateManager.saveTemplates();
  this.populateDialog();
};

SchemaManagementDialog.prototype.renameTemplate = function (wikibaseName, templateName) {
  let newName = prompt($.i18n('wikibase-schema-management-dialog/enter-new-schema-name'), templateName);
  if (newName && newName.trim()) {
    WikibaseTemplateManager.renameTemplate(wikibaseName, templateName, newName.trim());
    WikibaseTemplateManager.saveTemplates();
    this.populateDialog();
  }
};