iw/static/ckeditor/plugins/extimage/plugin.js

394 lines
13 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Ext.define('CK.view.ImageList' ,{
extend: 'Ext.grid.Panel',
alias: 'widget.imagelist',
hideHeaders: true,
columns: [{
text: 'Preview',
width: 84,
dataIndex: 'Attachment_id',
renderer: function(value) {
return Ext.String.format('<img src="{0}" width="64" height="64"></img>', '/att/'+this.up('window').wiki+'/'+value+'?thumbnail=yes');
}
},{
text: 'Filename',
dataIndex: 'Filename',
flex: 1
},{
text: 'Modified',
dataIndex: 'Modified',
width: 120
},{
xtype: 'actioncolumn',
width: 40,
items: [{
iconCls: 'delete-col',
tooltip: 'Delete Image',
handler: function(grid, rowIndex, colIndex) {
var store = grid.getStore();
var rec = store.getAt(rowIndex);
Ext.Msg.confirm('Delete the item?', 'Are you sure you want to delete the image '+rec.data.Filename, function(button) {
if (button === 'yes') {
// Will be wiki/attachment_id
rec.setId(rec.get('Attachment_id'));
store.remove(rec);
store.sync();
} else {
// Nothing really
}
});
}
}]
}],
listeners: {
itemdblclick: function(dv, record, item, index, e) {
var zonepanel = Ext.getCmp('dropzonepanel');
var win = zonepanel.up('window');
var wiki = win.wiki;
var editor = win.editor;
// Add link to image
var img = editor.document.createElement('img');
img.setAttribute ('src','/att/'+wiki+'/'+record.data.Attachment_id);
editor.insertElement (img);
// Close window
zonepanel.up('window').destroy();
}
}
});
Ext.define('CK.view.extimageWindow', {
extend: 'Ext.window.Window',
alias: 'widget.extimageWindow',
height: 400,
width: 500,
title: 'Image selection',
collapsible: false,
modal: true,
layout: 'fit',
border: 0,
defaults: {
border: 0
},
items: [
{
xtype: 'panel',
layout: 'border',
items: [
{
region: 'center',
xtype: 'tabpanel',
layout: 'vbox',
border: 0,
items: [
{
title: 'Upload new image',
margin: 10,
defaults: {
border: 0
},
border: 0,
items: [
{
html: '<div id="drop_zone">Drop image file here</div>',
id: 'dropzonepanel',
},{
xtype: 'panel',
id: 'orpanel',
html: 'or...',
padding: '10px 0 10px 0',
},{
xtype: 'filefield',
id: 'filefieldpanel',
name: 'file',
width: 450,
margin: '5px 0 5px 0',
buttonText: 'Select Image...',
listeners: {
change: function(field, value, opts) {
var zonepanel = Ext.getCmp('dropzonepanel');
var elem = document.getElementById(field.fileInputEl.id);
var file = elem.files[0];
zonepanel.up('window').down('panel').uploadNew(file, null);
}
}
}
]
},{
title: 'Browse from gallery',
border: 0,
scroll: 'both',
layout: 'fit',
items: [{xtype: 'imagelist'}],
},{
title: 'Link external image',
border: 0,
layout: {
type: 'vbox',
align: 'center',
pack: 'center'
},
items: [{
width: 450,
height: 100,
border: 0,
layout: 'hbox',
items: [{
xtype: 'textfield',
id: 'imageUrlField',
width: 400,
},{
xtype: 'button',
margin: '0 0 0 5px',
text: 'Add',
handler : function() {
var url = Ext.getCmp('imageUrlField').value;
var win = this.up('window');
var editor = win.editor;
// Add link to image
var img = editor.document.createElement('img');
img.setAttribute ('src', url);
editor.insertElement (img);
// Close window
win.destroy();
}
}
]
}]
}
]
}],
listeners: {
afterrender: function(win, opts) {
var me = this;
var dropElem = win.down('#dropzonepanel').getEl();
dropElem.on('dragover', me.dragover);
dropElem.on('drop', me.drop);
}
},
dragover: function(evt, el, o) {
evt.stopPropagation();
evt.preventDefault();
},
uploadNew: function(file) {
var zonepanel = Ext.getCmp('dropzonepanel');
var win = zonepanel.up('window');
var wiki = win.wiki;
var editor = win.editor;
var reader = new FileReader();
reader.onloadend = function(evt) {
var uuidstr = Ext.data.IdGenerator.get('uuid').generate();
var now = new Date();
var newAttachment = Ext.create('IW.model.Attachment', {
Attachment_id: uuidstr,
Wiki_id: wiki,
Attachment: evt.target.result,
Modified: now.toJSON(),
Filename: file.name,
});
newAttachment.proxy.url = '/api/attachments/'+wiki+'/'+uuidstr;
newAttachment.save({
success: function(record, operation) {
// Add link to image
var img = editor.document.createElement('img');
img.setAttribute ('src','/att/'+wiki+'/'+uuidstr);
editor.insertElement (img);
// Close window
zonepanel.up('window').destroy();
},
failure: function(record, operation) {
//handle failure(s) here
}
});
};
reader.readAsDataURL(file); // Safest with JSON
},
drop: function(evt, el, o) {
evt.stopPropagation();
evt.preventDefault();
var cmp = this.cmp,
browserEvent = evt.browserEvent,
dataTransfer = browserEvent.dataTransfer,
files = dataTransfer.files,
numFiles = files.length,
file;
var zonepanel = Ext.getCmp('dropzonepanel');
// If dropped multiple, handle only the first file...
if (numFiles > 0) {
file = files[0];
zonepanel.update ('<div id="drop_zone">'+file.name+'</div>');
zonepanel.up('window').down('panel').uploadNew(file, evt);
}
}
}
],
initComponent: function() {
this.callParent(arguments);
// Can this be done with less code?
var newAttachmentStore = Ext.create('IW.store.Attachments', {
proxy: {
type: 'rest',
url: '/api/attachments/'+this.wiki+'/',
reader: {
type: 'json',
successProperty: 'success'
}
}
});
var grid = this.down('grid');
grid.reconfigure(newAttachmentStore);
grid.store.load();
// Can this be done otherwise?
/*
grid.on('itemdblclick', function() { 
console.log('lol')
}, this);
*/
}
});
Ext.define('CK.view.extimagePropertiesWindow', {
extend: 'Ext.window.Window',
alias: 'widget.extimagePropertiesWindow',
height: 200,
width: 400,
title: 'Image properties',
collapsible: false,
modal: true,
layout: 'fit',
border: 0,
defaults: {
border: 0
},
items: [
{
xtype: 'panel',
layout: 'border',
padding: '5px 10px 5px 10px',
items: [{
region: 'center',
xtype: 'panel',
layout: 'vbox',
border: 0,
items: [{
xtype: 'textfield',
fieldLabel: 'Width',
id: 'propFormWidth',
width: 370,
},{
xtype: 'textfield',
fieldLabel: 'Height',
id: 'propFormHeight',
width: 370,
},{
xtype: 'textfield',
fieldLabel: 'Description',
id: 'propFormDesc',
width: 370,
}
]
}]
}
],
initComponent: function() {
this.callParent(arguments);
if (this.element.hasAttribute('width')) {
Ext.getCmp('propFormWidth').setValue(this.element.getAttribute('width'));
}
if (this.element.hasAttribute('height')) {
Ext.getCmp('propFormHeight').setValue(this.element.getAttribute('height'));
}
if (this.element.hasAttribute('alt')) {
Ext.getCmp('propFormDesc').setValue(this.element.getAttribute('alt'));
}
},
buttons: [
{
text: 'Save',
handler: function() {
this.up('window').element.setAttribute('width', Ext.getCmp('propFormWidth').getValue());
this.up('window').element.setAttribute('height', Ext.getCmp('propFormHeight').getValue());
this.up('window').element.setAttribute('alt', Ext.getCmp('propFormDesc').getValue());
this.up('window').destroy();
}
},
{
text: 'Cancel',
handler: function() {
this.up('window').destroy();
}
}
]
});
CKEDITOR.plugins.add( 'extimage', {
icons: 'extimage',
init: function( editor ) {
//Plugin logic goes here.
editor.addCommand( 'insertImage', {
allowedContent: 'img[!src,alt,width,height]',
exec: function( editor ) {
var extWin = Ext.widget('extimageWindow', {
wiki: editor.wiki,
editor: editor
});
extWin.show();
if (window.File && window.FileReader && window.FileList && window.Blob) {
//console.log('Great success! All the File APIs are supported.');
} else {
//console.log('The File APIs are not fully supported in this browser.');
}
}
});
editor.ui.addButton( 'extimage', {
label: 'Insert Image',
command: 'insertImage',
toolbar: 'insert'
});
// Context menu for image properties
editor.addCommand( 'imageProperties', {
exec: function (editor) {
var selection = editor.getSelection();
var element = selection.getSelectedElement();
var propWin = Ext.widget('extimagePropertiesWindow', {
editor: editor,
selection: selection,
element: element
});
propWin.show();
}
});
if ( editor.contextMenu ) {
editor.addMenuGroup( 'imgGroup' );
editor.addMenuItem( 'imgItem', {
label: 'Image Properties',
icon: this.path + 'icons/extimage.png',
command: 'imageProperties',
group: 'imgGroup'
});
editor.contextMenu.addListener( function( element ) {
if ( element.getAscendant( 'img', true ) ) {
return { imgItem: CKEDITOR.TRISTATE_OFF };
}
});
}
}
});