AdminTools.showNotes = function() { if (!window.userNotesWindow) { userNotesWindow = new MODx.Window({ height: 640, minHeight: 600, width: 1200, padding: '5px', title: _("admintools_notes"), stateful: false, items: [{ xtype: 'panel', id: 'admintools-notes-panel', height: 548, autoWidth: true, layout: 'border', items: [{ region: 'center', //title: 'Центральная панель', id: 'admintools-notes-panel1', autoScroll: true, unstyled: true, layout: 'anchor', bodyStyle: 'background-color:#fff;', height: 250, items: [{ xtype: 'admintools-notes-grid', layout: 'anchor', anchor: '98%' }] //width: 400 }, { region: 'south', id: 'admintools-notes-panel2', split: true, forceLayout: true, autoScroll: true, header: false, useSplitTips: true, unstyled: true, collapsed: false, collapsible: false, padding: '5px', layout: 'anchor', bodyStyle: 'background-color:#fafafa;', height: 250, items: [{ //xtype: Ext.ComponentMgr.types['modx-texteditor'] ? 'modx-texteditor' : 'textarea', xtype: 'htmleditor', cls: 'admintools-note text', id: 'admintool-notes-text', readOnly: true, anchor: '100% 97%', style: 'background-color: #fff', enableSourceEdit: false, //enableKeyEvents: true, listeners: { render: function () { this.el.on('keydown', function (e) { this.fireEvent('sync', this, this.el.getValue()); }, this, {buffer: 500}); }, sync: function (sender, html) { var e = Ext.EventObject; if (e.button > 0) { if (!AdminTools.currentNote.isDirty) AdminTools.currentNote.setDirty(); } } } }] //width: 400 }] }], buttonAlign: 'left', buttons: [{ text: _("save"), id: 'admintools_btn_save', hidden: true, handler: function () { MODx.Ajax.request({ url: adminToolsSettings.config.connector_url, params: { action: 'mgr/notes/updatetext', id: AdminTools.currentNote.id, text: AdminTools.readPanel.getEditor().getValue() //AdminTools.currentNote.text }, listeners: { success: { fn: function (r) { AdminTools.currentNote.sync().clearDirty(true); var row = Ext.getCmp('admintools-notes-grid').store.getById(AdminTools.currentNote.id); row.set('text', AdminTools.readPanel.getEditor().getValue()); row.commit(); }, scope: this }, failure: { fn: function (r) { console.log(r); } } } }); } }, { text: _("cancel"), id: 'admintools_btn_cancel', hidden: true, handler: function () { AdminTools.currentNote.clearDirty(false); AdminTools.readPanel.getEditor().setValue(AdminTools.currentNote.text); } }, '->', { text: _("admintools_close"), id: 'admintools_btn_close', handler: function () { userNotesWindow.hide(); }, scope: this }], listeners: { /*hide: { fn: function () { setTimeout(function () { userNotesWindow.destroy() }, 200); } },*/ beforehide: { fn: function () { if (AdminTools.currentNote.isDirty) { Ext.MessageBox.alert(_('admintools_attention'), _("admintools_note_is_dirty")); return false; } } }, resize: { fn: function (el, w, h) { Ext.getCmp('admintools-notes-panel').setHeight(h - 92); } } } }); } userNotesWindow.show(Ext.EventObject.target); }; AdminTools.grid.Notes = function (config) { config = config || {}; if (!config.id) { config.id = 'admintools-notes-grid'; } Ext.applyIf(config, { url: adminToolsSettings.config.connector_url, fields: ['id', 'title', 'text', 'private', 'username', 'createdon', 'createdby', 'url', 'tags', 'actions'], columns: this.getColumns(config), tbar: this.getTopBar(config), sm: new Ext.grid.RowSelectionModel(), baseParams: { action: 'mgr/notes/getlist' }, listeners: { rowDblClick: function (grid, rowIndex, e) { this.updateNote(null, e, grid.store.getAt(rowIndex)); }, rowClick: function (grid, rowIndex, e) { if (AdminTools.currentNote.isDirty) { Ext.MessageBox.alert(_('admintools_attention'), _("admintools_note_is_dirty")); Ext.getCmp('admintools-notes-grid').selModel.selectRow(AdminTools.currentNote.rowIndex); return false; } var row = grid.store.getAt(rowIndex), editor = AdminTools.readPanel.getEditor(); AdminTools.currentNote.set({title: row.data.title, text: row.data.text, id: row.data.id, rowIndex: rowIndex, user: row.data.createdby}); editor.setValue(row.data.text); editor.setReadOnly(false); }, rowcontextmenu: function (grid, rowIndex, e) { } }, viewConfig: { forceFit: true, enableRowBody: true, autoFill: true, showPreview: true, scrollOffset: 0, getRowClass: function (rec, ri, p) { return !rec.data.private ? 'admintools-private-note' : ''; } }, paging: true, pageSize: 20, remoteSort: true //autoHeight: true }); AdminTools.grid.Notes.superclass.constructor.call(this, config); // Clear selection on grid refresh this.store.on('load', function () { AdminTools.currentNote.reset(); if (this._getSelectedIds().length) { this.getSelectionModel().clearSelections(); } }, this); this.store.on('beforeload', function (e) { if (AdminTools.currentNote.isDirty) { Ext.MessageBox.alert(_('admintools_attention'), _("admintools_note_is_dirty")); return false; } }, this); }; Ext.extend(AdminTools.grid.Notes, MODx.grid.Grid, { windows: {}, getMenu: function (grid, rowIndex) { var ids = this._getSelectedIds(); var row = grid.getStore().getAt(rowIndex); var menu = AdminTools.utils.getMenu(row.data['actions'], this, ids); this.addContextMenuItem(menu); }, createNote: function (btn, e) { var w = MODx.load({ xtype: 'admintools-note-create-window', id: Ext.id(), record: {editedby: '', editedon: ''}, listeners: { success: { fn: function () { this.refresh(); }, scope: this }, hide: { fn: function () { setTimeout(function () { w.destroy() }, 200); } } } }); w.reset(); w.setValues({private: false}); w.show(e.target); }, updateNote: function (btn, e, row) { if (AdminTools.currentNote.isDirty) { Ext.MessageBox.alert(_('admintools_attention'), _("admintools_note_is_dirty")); return false; } if (typeof(row) != 'undefined') { this.menu.record = row.data; } else if (!this.menu.record) { return false; } var id = this.menu.record.id, editor = AdminTools.readPanel.getEditor(); //TODO: Отражать в заголовке окна title заметки AdminTools.currentNote.set({title: this.menu.record.title, text: this.menu.record.text, id: id, user: this.menu.record.createdby}); editor.setValue(this.menu.record.text); editor.setReadOnly(false); MODx.Ajax.request({ url: this.config.url, params: { action: 'mgr/notes/get', id: id }, listeners: { success: { fn: function (r) { var w = MODx.load({ xtype: 'admintools-note-update-window', id: Ext.id(), record: r.object, listeners: { success: { fn: function (r) { //this.refresh(); var note = r.a.result.object; if (AdminTools.currentNote.id && AdminTools.currentNote.id == note.id) { AdminTools.readPanel.getEditor().setValue(note.text); AdminTools.currentNote.sync(); } var row = Ext.getCmp('admintools-notes-grid').store.getById(note.id); row.set('text', note.text); if (note.url == 'http://') note.url = ''; if (note.url) { row.set('url', '' + note.url + ''); } else { row.set('url', ''); } row.set('private', note.private); row.set('title', note.title); row.set('tags', note.tags); row.commit(); }, scope: this }, hide: { fn: function () { setTimeout(function () { w.destroy() }, 200); } } } }); w.reset(); w.setValues(r.object); w.show(e.target); }, scope: this } } }); }, removeNote: function (act, btn, e) { var ids = this._getSelectedIds(); if (!ids.length) { return false; } MODx.msg.confirm({ title: ids.length > 1 ? _('admintools_notes_remove') : _('admintools_note_remove'), text: ids.length > 1 ? _('admintools_notes_remove_confirm') : _('admintools_note_remove_confirm'), url: this.config.url, params: { action: 'mgr/notes/remove', ids: Ext.util.JSON.encode(ids) }, listeners: { success: { fn: function (r) { this.refresh(); }, scope: this } } }); return true; }, download:function(){ MODx.Ajax.request({ url: adminToolsSettings.config.connector_url, params: { action: 'mgr/notes/export' }, listeners: { success: { fn: function (result) { location.href = adminToolsSettings.config.connector_url+"?action=mgr/notes/download&HTTP_MODAUTH="+MODx.siteId; }, scope: this }, failure: { fn: function (result) { //panel.el.unmask(); MODx.msg.alert(_('_error'), result.message); }, scope: this } } }); }, upload:function(){ var input = document.getElementById('admintool_upload_notes'); if (!input) { input = document.createElement('input'); input.type = 'file'; input.id = 'admintool_upload_notes'; input.style = 'display:none'; document.body.appendChild(input); input.addEventListener('change', this.handleFile, false); } input.click(); }, handleFile: function(e) { var grid = this; var file = e.target.files[0]; var reader = new FileReader(); reader.onload = function(e) { var content = e.target.result; MODx.Ajax.request({ url: adminToolsSettings.config.connector_url, params: { action: 'mgr/notes/upload', content: content }, listeners: { success: { fn: function () { Ext.getCmp('admintools-notes-grid').refresh(); }, scope: this }, failure: { fn: function (result) { //panel.el.unmask(); MODx.msg.alert(_('_error'), result.message); }, scope: this } } }); }; reader.readAsText(file); }, getColumns: function (config) { return [{ header: 'ID', dataIndex: 'id', sortable: true, hidden: true, fixed: true, width: 70 }, { header: _('admintools_notes_title'), dataIndex: 'title', sortable: true, width: 250 }, { header: _('admintools_notes_url'), dataIndex: 'url', sortable: false, width: 120 }, { header: _('admintools_notes_tags'), dataIndex: 'tags', sortable: false, width: 120 }, { header: _('admintools_user'), dataIndex: 'username', sortable: true, width: 90 }, { header: _('admintools_notes_createdon'), dataIndex: 'createdon', sortable: true, fixed: true, width: 140 }, { header: _('admintools_notes_private'), dataIndex: 'private', renderer: AdminTools.utils.renderBoolean, sortable: true, fixed: true, width: 70 }, { header: _('admintools_grid_actions'), dataIndex: 'actions', renderer: AdminTools.utils.renderActions, sortable: false, width: 70, fixed: true, id: 'actions' }, { header: _('admintools_notes_text'), dataIndex: 'text', sortable: false, hidden: true, width: 50 }, { header: _('admintools_user'), dataIndex: 'createdby', sortable: true, hidden: true, width: 10 }]; }, getTopBar: function (config) { return [{ xtype: 'buttongroup', columns: 3, items: [{ text: '', handler: this.createNote, // style: {marginRight: '5px'}, tooltip: _('admintools_create_note'), tooltipType: 'title', scope: this }, { text: '', handler: this.download, tooltip: _('admintools_export_notes'), tooltipType: 'title', // style: {marginRight: '5px'}, scope: this }, { text: '', handler: this.upload, tooltip: _('admintools_import_notes'), tooltipType: 'title', scope: this }] }, '->', { xtype: 'admintools-combo-wheresearch', name: 'wheresearch', width: 150, emptyText: _('admintools_search_where'), style: {marginRight: '20px'}, editable: false, id: config.id + '-where-search' }, { xtype: 'textfield', name: 'searchQuery', width: 200, id: config.id + '-search-field', emptyText: _('admintools_grid_search'), style: {backgroundColor:'#fff'}, listeners: { render: { fn: function (tf) { tf.getEl().addKeyListener(Ext.EventObject.ENTER, function () { this._search(); }, this); }, scope: this } } }, { xtype: 'button', id: config.id + '-search-btn', text: '', listeners: { click: {fn: this._search, scope: this} } }, { xtype: 'button', id: config.id + '-search-clear', text: '', listeners: { click: {fn: this._clearSearch, scope: this} } }, { xtype: 'tbspacer', width: 2 }] }, onClick: function (e) { var elem = e.getTarget(); if (elem.nodeName == 'BUTTON') { var row = this.getSelectionModel().getSelected(); if (typeof(row) != 'undefined') { var action = elem.getAttribute('action'); if (action == 'showMenu') { var ri = this.getStore().find('id', row.id); return this._showMenu(this, ri, e); } else if (typeof this[action] === 'function') { this.menu.record = row.data; return this[action](this, e); } } } return this.processEvent('click', e); }, _getSelectedIds: function () { var ids = []; var selected = this.getSelectionModel().getSelections(); for (var i in selected) { if (!selected.hasOwnProperty(i)) { continue; } ids.push(selected[i]['id']); } return ids; }, _search: function (tf, nv, ov) { this.store.baseParams.searchQuery = Ext.getCmp(this.config.id + '-search-field').getValue(); this.store.baseParams.wheresearch = Ext.getCmp(this.config.id + '-where-search').getValue(); this.getBottomToolbar().changePage(1); AdminTools.currentNote.reset(); //this.refresh(); }, _clearSearch: function (btn, e) { this.store.baseParams.searchQuery = ''; Ext.getCmp(this.config.id + '-search-field').setValue(''); AdminTools.currentNote.reset(); this.getBottomToolbar().changePage(1); //this.refresh(); } }); Ext.reg('admintools-notes-grid', AdminTools.grid.Notes); /** ******************* Dialogs ********************** **/ AdminTools.window.CreateNote = function (config) { config = config || {}; if (!config.id) { config.id = 'admintools-note-create-window'; } Ext.applyIf(config, { title: _('admintools_create_note'), width: 900, modal: true, maximizable: false, autoHeight: true, url: adminToolsSettings .config.connector_url, action: 'mgr/notes/add', fields: this.getFields(config), keys: [{ key: Ext.EventObject.ENTER, shift: true, fn: function () { this.submit() }, scope: this }] }); AdminTools.window.CreateNote.superclass.constructor.call(this, config); }; Ext.extend(AdminTools.window.CreateNote, MODx.Window, { getFields: function (config) { return [{ xtype: 'hidden', name: 'id', id: config.id + '-id' }, { xtype: 'textfield', fieldLabel: _('admintools_notes_title'), name: 'title', id: config.id + '-title', anchor: '100%', allowBlank: false }, { xtype: 'textfield', fieldLabel: _('admintools_notes_url'), emptyText: 'http://', name: 'url', id: config.id + '-url', anchor: '100%', allowBlank: true }, { xtype: 'textfield', fieldLabel: _('admintools_notes_tags'), name: 'tags', id: config.id + '-tags', anchor: '100%', allowBlank: true }, { xtype: 'htmleditor', fieldLabel: _('admintools_notes_text'), name: 'text', id: config.id + '-text', enableSourceEdit: false, height: 250, style: 'background-color: #fff', anchor: '100%' }, { layout: 'column' ,border: false ,anchor: '100%' ,items: [{ columnWidth: .5 ,layout: 'form' ,defaults: { msgTarget: 'qtip' } ,border:false ,items: [{ xtype: 'xcheckbox', boxLabel: _('admintools_notes_private'), name: 'private', disabled: adminToolsSettings.currentUser !== AdminTools.currentNote.user && AdminTools.currentNote.id, id: config.id + '-private' }] },{ columnWidth: .5 ,layout: 'form' ,defaults: { msgTarget: 'qtip' } ,border:false ,items: [{ //xtype: '', //boxLabel: _('admintools_notes_editedby'), html: _('admintools_notes_editedby') + ': ' + config.record.editedby + '. ' + _('admintools_notes_editedon') + ': ' + config.record.editedon, style: {marginTop: '20px', textAlign: 'right'} }] }] }]; } }); Ext.reg('admintools-note-create-window', AdminTools.window.CreateNote); // Update Dialog AdminTools.window.UpdateNote = function (config) { config = config || {}; if (!config.id) { config.id = 'admintools-note-update-window'; } Ext.applyIf(config, { title: _('admintools_note_edit'), action: 'mgr/notes/update' }); AdminTools.window.UpdateNote.superclass.constructor.call(this, config); }; Ext.extend(AdminTools.window.UpdateNote, AdminTools.window.CreateNote); Ext.reg('admintools-note-update-window', AdminTools.window.UpdateNote); /** ************************************************* **/ Ext.onReady(function() { AdminTools.currentNote = { id: 0, text: '', title: '', isDirty: false, rowIndex: null, user: 0, set: function (data) { //text, id, rowIndex, user this.text = data.text ? data.text : ''; this.title = data.title ? data.title : ''; this.id = data.id ? data.id : 0; this.user = data.user ? data.user : 0; this.rowIndex = data.rowIndex ? data.rowIndex : null; }, setDirty: function () { this.isDirty = true; Ext.getCmp('admintools_btn_save').setVisible(true); Ext.getCmp('admintools_btn_cancel').setVisible(true); userNotesWindow.setTitle(userNotesWindow.title + ' (*)'); return this; }, clearDirty: function (save) { this.isDirty = false; Ext.getCmp('admintools_btn_save').setVisible(false); Ext.getCmp('admintools_btn_cancel').setVisible(false); userNotesWindow.setTitle(userNotesWindow.title.replace(' (*)', '')); return this; }, reset: function () { var editor = AdminTools.readPanel.getEditor(); editor.setValue(''); editor.setReadOnly(true); this.id = 0; this.text = ''; this.isDirty = false; this.rowIndex = null; return this; }, sync: function () { this.text = AdminTools.readPanel.getEditor().getValue(); return this; } }; AdminTools.readPanel = { editor: null, getEditor: function () { if (!this.editor) { this.editor = Ext.getCmp('admintool-notes-text'); } return this.editor; } /*collapse: function () { var panel = Ext.getCmp('admintools-notes-panel2'), that = this; if (panel.collapsed) { panel.expand(true); if (AdminTools.currentNote.id) { setTimeout(function () { //this.editor = Ext.getCmp('admintool-notes-text'); that.getEditor().setValue(AdminTools.currentNote.text); }, 300); } } else { AdminTools.currentNote.set(that.getEditor().getValue()); panel.collapse(true); //panel.setVisible(false); } }*/ }; var userMenuList = document.querySelector('#limenu-user ul.modx-subnav'); var newLi = document.createElement('li'); newLi.id = 'admintools-notes'; newLi.innerHTML = '' + _('admintools_notes') + ' ' + _('admintools_notes_desc') + ''; userMenuList.insertBefore(newLi, userMenuList.lastChild); });