Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
H5PEditor.metadataChangelogWidget = function (semantics, params, $wrapper, parent) {
2
  if (!params.changes) {
3
    params.changes = [];
4
  }
5
 
6
  var $ = H5PEditor.$;
7
 
8
  // State
9
  var state = {
10
    editing: false,
11
    newLog: false,
12
    currentLog: undefined
13
  };
14
 
15
  var widget = $('<div class="field h5p-metadata-changelog"></div>');
16
  H5PEditor.processSemanticsChunk(semantics, {}, widget, parent);
17
 
18
  // Get a reference to the fields:
19
  var changeField = H5PEditor.findField('change', parent);
20
  var dateField = H5PEditor.findField('date', changeField);
21
  var authorField = H5PEditor.findField('author', changeField);
22
  var logField = H5PEditor.findField('log', changeField);
23
 
24
  var $form = changeField.$content;
25
  var $formFields = dateField.$item.add(authorField.$item).add(logField.$item);
26
 
27
  // Add description
28
  var $description = $('<div>', {
29
    'class': 'h5peditor-field-description',
30
    'text': H5PEditor.t('core', 'changelogDescription')
31
  });
32
  $form.append($description);
33
 
34
  var $cancelButton = $('<button>', {
35
    'class': 'h5p-metadata-button h5p-cancel',
36
    type: 'button',
37
    text: H5PEditor.t('core', 'cancel'),
38
    click: function () {
39
      resetForm();
40
      state.editing = false;
41
      state.currentLog = undefined;
42
      render();
43
    }
44
  });
45
 
46
  var $createLogButton = $('<button>', {
47
    'class': 'h5p-metadata-button inverted h5p-log-change',
48
    type: 'button',
49
    text: H5PEditor.t('core', 'logThisChange'),
50
    click: function () {
51
      var entry = validateForm(false);
52
 
53
      if (!entry.date || !entry.author || !entry.log) {
54
        return;
55
      }
56
 
57
      if (state.currentLog !== undefined) {
58
        params.changes[state.currentLog] = entry;
59
      }
60
      else {
61
        params.changes.push(entry);
62
        state.newLog = true;
63
      }
64
 
65
      state.editing = false;
66
      resetForm();
67
      render();
68
      state.currentLog = undefined;
69
    }
70
  });
71
 
72
  var $addLogButton = $('<button>', {
73
    'class': 'h5p-metadata-button inverted h5p-add-author',
74
    type: 'button',
75
    text: H5PEditor.t('core', 'addNewChange'),
76
    click: function () {
77
      state.editing = true;
78
      state.newLog = false;
79
      resetForm();
80
      render();
81
    }
82
  });
83
 
84
  var $buttons = $('<div class="h5p-metadata-changelog-buttons"></div>');
85
  $buttons.append($cancelButton);
86
  $buttons.append($createLogButton);
87
  $buttons.append($addLogButton);
88
  $form.append($buttons);
89
 
90
  var $newLogMessage = $('<div', {
91
    'class': 'h5p-metadata-new-log-message',
92
    text: H5PEditor.t('core', 'newChangeHasBeenLogged'),
93
    appendTo: $form
94
  });
95
 
96
  var $logWrapper = $('<div>', {
97
    'class': "h5p-metadata-logged-changes",
98
    appendTo: $form
99
  });
100
 
101
  widget.appendTo($wrapper);
102
  render();
103
 
104
  function resetForm() {
105
    dateField.$input.val('');
106
    logField.$input.val('');
107
    validateForm(true);
108
  }
109
 
110
  function render() {
111
    $newLogMessage.toggle(state.newLog);
112
    $description.toggle(!state.editing);
113
    $addLogButton.toggle(!state.editing);
114
    $cancelButton.toggle(state.editing);
115
    $createLogButton.toggle(state.editing);
116
    $formFields.toggle(state.editing);
117
 
118
    if (state.editing) {
119
      populateForm();
120
      if (!dateField.$input.hasClass('datepicker')) {
121
        dateField.$input.addClass('datepicker');
122
        setupDatePicker(dateField.$input);
123
      }
124
    }
125
    else {
126
      renderLogWrapper();
127
    }
128
 
129
    $logWrapper.toggleClass('editing', state.editing);
130
  }
131
 
132
  function renderLogWrapper() {
133
    $logWrapper.empty();
134
    $logWrapper.append('<span class="h5peditor-label h5p-metadata-log-wrapper-title">'+ H5PEditor.t('core', 'loggedChanges')  + '</span>');
135
 
136
    if (params.changes.length == 0) {
137
      $logWrapper.append($('<div class="h5peditor-field-description">' + H5PEditor.t('core', 'noChangesHaveBeenLogged') + '</div>'));
138
    }
139
    else {
140
      var logList = $('<div class="h5p-metadata-log-wrapper"></div>');
141
      $logWrapper.append(logList);
142
 
143
      for (var i = 0; i < params.changes.length; i++) {
144
        var log = params.changes[i];
145
 
146
        var dateWrapper = $('<div>', {
147
          'class': 'h5p-metadata-log-date',
148
          html: H5PEditor.htmlspecialchars(log.date)
149
        });
150
 
151
        var logDescription = $('<div>', {
152
          'class': 'h5p-metadata-log-description',
153
          html: H5PEditor.htmlspecialchars(log.log)
154
        });
155
 
156
        var authorWrapper = $('<div>', {
157
          'class': 'h5p-metadata-log-author',
158
          html: 'by ' + H5PEditor.htmlspecialchars(log.author) // TODO - translate
159
        });
160
 
161
        var $descriptionWrapper = $('<div class="h5p-metadata-description-wrapper"></div>');
162
        $descriptionWrapper.append(logDescription);
163
        $descriptionWrapper.append(authorWrapper);
164
 
165
        var logButtons = $('<div class="h5p-metadata-log-buttons">' +
166
         '<button type="button" class="h5p-metadata-edit h5p-metadata-icon-button"></button>' +
167
         '<button type="button" class="h5p-metadata-delete h5p-metadata-icon-button"></button>' +
168
        '</div>');
169
 
170
        logButtons.find('.h5p-metadata-delete').click(function () {
171
          // Ask for confirmation
172
          if (confirm(H5PEditor.t('core', 'confirmDeleteChangeLog'))) {
173
            var wrapper = $(this).closest('.h5p-metadata-log');
174
            var index = $(wrapper).data('index');
175
            deleteLog(index);
176
          }
177
        });
178
 
179
        logButtons.find('.h5p-metadata-edit').click(function () {
180
          var wrapper = $(this).closest('.h5p-metadata-log');
181
          var index = $(wrapper).data('index');
182
 
183
          editLog(index);
184
        });
185
 
186
        var logContent = $('<div>', {
187
          'class': 'h5p-metadata-log',
188
          'data-index': i
189
        });
190
        logContent.append(dateWrapper);
191
        logContent.append($descriptionWrapper);
192
        logContent.append(logButtons);
193
 
194
        logList.prepend(logContent);
195
      }
196
    }
197
  }
198
 
199
  function editLog(index) {
200
    state.editing = true;
201
    state.currentLog = index;
202
    state.newLog = false;
203
    render();
204
  }
205
 
206
  function deleteLog(index) {
207
    params.changes.splice(index, 1);
208
    render();
209
  }
210
 
211
  function validateForm(optional) {
212
    dateField.field.optional = optional;
213
    authorField.field.optional = optional;
214
    logField.field.optional = optional;
215
 
216
    return {
217
      date: dateField.validate(),
218
      author: authorField.validate(),
219
      log: logField.validate()
220
    };
221
  }
222
 
223
  function populateForm() {
224
    if (state.currentLog !== undefined) {
225
      validateForm(true);
226
 
227
      var log = params.changes[state.currentLog];
228
      dateField.$input.val(log.date);
229
 
230
      // Unescape in case it comes from backend
231
      var unescaper = document.createElement('div');
232
 
233
      unescaper.innerHTML = H5PEditor.htmlspecialchars(log.author);
234
      authorField.$input.val(unescaper.textContent);
235
 
236
      unescaper.innerHTML = H5PEditor.htmlspecialchars(log.log);
237
      logField.$input.val(unescaper.textContent);
238
    }
239
  }
240
 
241
  /**
242
   * Setup the datepicker. Loads the script if not already loaded
243
   */
244
  function setupDatePicker($dateInput) {
245
    var initDateField = function () {
246
      $dateInput.Zebra_DatePicker({
247
        format: 'd-m-y G:i:s',
248
        onClose: function () {
249
          dateField.validate();
250
        }
251
      });
252
    };
253
 
254
    // Make sure datepicker.js is only loaded once
255
    $dateInput.Zebra_DatePicker ? initDateField() : loadDatePickerLib(initDateField);
256
  }
257
 
258
  /**
259
   * Load the datepicker JS lib
260
   *
261
   * @param {Function} callback
262
   */
263
  function loadDatePickerLib(callback) {
264
    $.ajax({
265
      url: H5PEditor.basePath + 'libs/zebra_datepicker.min.js',
266
      dataType: 'script',
267
      success: callback,
268
      error: function (r,e) {
269
        console.warn('error loading libraries: ', e);
270
      },
271
      async: true
272
    });
273
  }
274
};