blob: 5ff4321cef77f14a27743fec7fb1c8cd98db43fe [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/* global wysihtml, wysihtmlParserRules */
rava.bind('.file', {
callbacks: {
created() {
const field = this;
const close = field.closest('form').querySelector('a.close');
function setProgress(m, progress) {
const meter = m;
meter.innerText = `${Math.round(progress)}%`;
meter.value = Math.round(progress);
}
function uploadFile(meter, action, file) {
const formData = new FormData();
formData.append('*', file);
formData.append('*@TypeHint', 'sling:File');
const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('loadstart', () => {
setProgress(meter, 0);
}, false);
xhr.upload.addEventListener('progress', (event) => {
const percent = (event.loaded / event.total) * 100;
setProgress(meter, percent);
}, false);
xhr.upload.addEventListener('load', () => {
meter.classList.add('is-info');
}, false);
xhr.addEventListener('readystatechange', (event) => {
let status; let text; let
readyState;
try {
readyState = event.target.readyState;
text = event.target.responseText;
status = event.target.status;
} catch (e) {
meter.classList.add('is-danger');
}
if (readyState === 4) {
meter.classList.remove('is-info');
if (status === 200 && text) {
meter.classList.add('is-success');
} else {
meter.classList.add('is-danger');
console.warn('Failed to upload %s, recieved message %s', file.name, text); // eslint-disable-line no-console
}
}
}, false);
xhr.open('POST', action, true);
xhr.send(formData);
}
function handleFile(scope, file) {
const it = document.createElement('div');
const ctr = scope.closest('.control').querySelector('.file-item-container');
let meter = null;
it.innerHTML = document.querySelector('.file-item-template').innerHTML;
meter = it.querySelector('.progress');
it.querySelector('.file-item-name').innerText = file.name;
ctr.classList.remove('is-hidden');
ctr.appendChild(it);
uploadFile(meter, scope.closest('form').action, file);
}
field.addEventListener('dragover', (event) => {
event.preventDefault();
}, false);
field.addEventListener('dragenter', (event) => {
event.preventDefault();
field.classList.add('is-primary');
}, false);
field.addEventListener('dragleave', (event) => {
event.preventDefault();
if(!field.contains(event.fromElement)){
field.classList.remove('is-primary');
}
}, false);
field.addEventListener('drop', (event) => {
event.preventDefault();
field.classList.remove('is-primary');
if (event.dataTransfer.items) {
const { items } = event.dataTransfer;
for (let i = 0; i < items.length; i++) { // eslint-disable-line no-plusplus
if (items[i].kind === 'file') {
handleFile(field, items[i].getAsFile());
}
}
} else {
const { files } = event.dataTransfer;
for (let i = 0; i < files.length; i++) { // eslint-disable-line no-plusplus
handleFile(field, files[i]);
}
}
}, false);
field.closest('form').querySelector('button[type=submit]').remove();
close.innerText = 'Done';
close.addEventListener('click', () => {
window.Sling.CMS.ui.reloadContext();
});
field.querySelector('input').addEventListener('change', (event) => {
const { files } = event.target;
for (let i = 0; i < files.length; i++) { // eslint-disable-line no-plusplus
handleFile(field, files[i]);
}
});
},
},
});
/* Support for updating the namehint when creating a component */
rava.bind('.namehint', {
callbacks: {
created() {
const field = this;
this.closest('.Form-Ajax').querySelector('select[name="sling:resourceType"]').addEventListener('change', (evt) => {
const resourceType = evt.target.value.split('/');
field.value = resourceType[resourceType.length - 1];
});
},
},
});
/* Support for repeating form fields */
rava.bind('.repeating', {
callbacks: {
created() {
const ctr = this;
this.querySelectorAll('.repeating__add').forEach((el) => {
el.addEventListener('click', (event) => {
event.stopPropagation();
event.preventDefault();
const node = ctr.querySelector('.repeating__template > .repeating__item').cloneNode(true);
ctr.querySelector('.repeating__container').appendChild(node);
});
});
},
},
});
rava.bind('.repeating__item', {
events: {
':scope .repeating__remove': {
click(event) {
event.stopPropagation();
event.preventDefault();
this.remove();
},
},
},
});
rava.bind('.rte', {
callbacks: {
created() {
new wysihtml.Editor(this.querySelector('.rte-editor'), { // eslint-disable-line no-new, new-cap
toolbar: this.querySelector('.rte-toolbar'),
parserRules: wysihtmlParserRules,
});
},
},
});