Ext.onReady(function () { if (Ext.firefoxVersion >= 18) { var noArgs = []; var callOverrideParent = function () { var method = callOverrideParent.caller.caller; // skip callParent (our caller) try { } catch (e) { } // FF 18 fix return method.$owner.prototype[method.$name].apply(this, arguments); }; Ext.override = function (target, overrides) { if (target.$isClass) { target.override(overrides); } else if (typeof target == 'function') { Ext.apply(target.prototype, overrides); } else { var owner = target.self, name, value; if (owner && owner.$isClass) { // if (instance of Ext.define'd class) for (name in overrides) { if (overrides.hasOwnProperty(name)) { value = overrides[name]; if (typeof value == 'function') { value.$name = name; value.$owner = owner; value.$previous = target.hasOwnProperty(name) ? target[name] : callOverrideParent; } target[name] = value; } } } else { Ext.apply(target, overrides); } } return target; }; Ext.apply(Ext.Base, { callParent: function (args) { var method, superMethod = (method = this.callParent.caller) && (method.$previous || ((method = method.$owner ? method : method.caller) && method.$owner.superclass[method.$name])); try { } catch (e) { } return superMethod.apply(this, args || noArgs); }, callSuper: function (args) { var method, superMethod = (method = this.callSuper.caller) && ((method = method.$owner ? method : method.caller) && method.$owner.superclass[method.$name]); try { } catch (e) { } // Firefox 18 fix return superMethod.apply(this, args || noArgs); }, statics: function () { var self = this.self, method = this.statics.caller; try { } catch (e) { } // Firefox 18 fix if (!method) return self; return method.$owner; } }); Ext.apply(Ext.Error, { raise: function (err) { err = err || {}; if (Ext.isString(err)) { err = { msg: err }; } var msg, method = this.raise.caller; try { } catch (e) { } // Firefox 18 fix if (method) { if (method.$name) { err.sourceMethod = method.$name; } if (method.$owner) { err.sourceClass = method.$owner.$className; } } if (Ext.Error.handle(err) !== true) { msg = Ext.Error.prototype.toString.call(err); Ext.log({ msg: msg, level: 'error', dump: err, stack: true }); throw new Ext.Error(err); } } }); } }); ;(function(Manager, global) { Manager.isCreated = function(className) { var existCache = this.existCache, i, ln, part, root, parts; if (this.classes[className] || existCache[className]) { return true; } root = global; parts = this.parseNamespace(className); for (i = 0, ln = parts.length; i < ln; i++) { part = parts[i]; if (typeof part != 'string') { root = part; } else { if (!root || !root[part]) { return false; } root = root[part]; } } if (/^.*\.apps\./.test(className) && typeof root != 'function') { return false; } existCache[className] = true; this.triggerCreated(className); return true; }; Manager.createOverride = function(className, data, createdFn) { var me = this, overriddenClassName = data.override, requires = data.requires, uses = data.uses, check = true, classReady = function () { var cls, temp; if (requires) { temp = requires; requires = null; // do the real thing next time (which may be now) Ext.Loader.require(temp, classReady); } else { cls = me.get(overriddenClassName); if(data.override === 'Shopware.apps.Article.view.detail.Window') { check = me.checkOverride(cls, data); } delete data.override; delete data.requires; delete data.uses; if(!check) { data = { '_invalidPlugin': true, '_invalidClassName': className }; } else { data['_invalidPlugin'] = false; } Ext.override(cls, data); me.triggerCreated(className); if (uses) { Ext.Loader.addUsedClasses(uses); // get these classes too! } if (createdFn) { createdFn.call(cls); // last but not least! } } }; me.existCache[className] = true; me.onCreated(classReady, me, overriddenClassName); return me; }; Manager.checkOverride = function(cls, data) { var match = true, fnName, fn; for(fnName in data) { fn = data[fnName].toString(); if(fn.match(/createMainTabPanel/i)) { match = false; break; } } if(!match) { for(fnName in data) { fn = data[fnName].toString(); if(fn.match(/registerAdditionalTab/i)) { match = true; break; } } } return match; }; })(Ext.ClassManager, Ext.global); Ext.define('Ext.data.proxy.Server-Shopware', { override: 'Ext.data.proxy.Server', processResponse: function(success, operation, request, response, callback, scope) { var me = this, reader, result; if (success === true) { reader = me.getReader(); reader.applyDefaults = operation.action === 'read'; result = reader.read(me.extractResponseData(response)); if (result.success !== false) { Ext.apply(operation, { response: response, resultSet: result }); operation.commitRecords(result.records); operation.setCompleted(); operation.setSuccessful(); } else { operation.setException(result.message); me.fireEvent('exception', this, response, operation); } } else { if(response.status == 401) { window.location.reload() } else { me.setException(operation, response); me.fireEvent('exception', this, response, operation); Ext.MessageBox.alert(operation.error.status + ' - ' + operation.error.statusText, Ext.util.Format.stripTags(response.responseText)); } } if (typeof callback == 'function') { callback.call(scope || me, operation); } me.afterRequest(request, success); }, encodeFilters: function(filters) { var min = [], length = filters.length, i = 0; for (; i < length; i++) { min[i] = { property: filters[i].property, value : filters[i].value, operator: filters[i].operator, expression: filters[i].expression }; } return this.applyEncoding(min); } }); Ext.override(Ext.app.Application, { loadingMessage: '[0] wird geladen ...', addController: function(controller, skipInit) { if (Ext.isDefined(controller.name)) { var name = controller.name; delete controller.name; controller.id = controller.id || name; controller = Ext.create(name, controller); } var me = this, controllers = me.controllers; controllers.add(controller); if (!skipInit) { controller.init(); } return controller; }, removeController: function(controller, removeListeners) { removeListeners = removeListeners || true; var me = this, controllers = me.controllers; controllers.remove(controller); if (removeListeners) { var bus = me.eventbus; bus.uncontrol([controller.id]); } }, addSubApplication: function(subapp, skipInit, fn, showLoadMask) { skipInit = (skipInit === undefined) ? false : true; subapp.app = this; if(subapp.hasOwnProperty('showLoadMask')) { showLoadMask = subapp.showLoadMask; } showLoadMask = (showLoadMask === undefined) ? true : showLoadMask; if(showLoadMask) { this.moduleLoadMask = new Ext.LoadMask(Ext.getBody(), { msg: Ext.String.format(this.loadingMessage, (subapp.localizedName) ? subapp.localizedName : subapp.name), hideModal: true }); this.moduleLoadMask.show(); } fn = fn || Ext.emptyFn; Ext.require(subapp.name, Ext.bind(function() { this.addController(subapp, skipInit); fn(subapp); }, this)); }, getActiveWindows: function(deprecated) { var activeWindows = []; if (deprecated === undefined) { deprecated = true; } Ext.each(Ext.WindowManager.zIndexStack, function (item) { if (typeof(item) !== 'undefined') { var className = item.$className; if ((className == 'Ext.window.Window' || className == 'Enlight.app.Window' || className == 'Ext.Window' || (deprecated && className == 'Shopware.apps.Deprecated.view.main.Window')) && className != "Ext.window.MessageBox") { activeWindows.push(item); } className = item.alternateClassName; if ((className == 'Ext.window.Window' || className == 'Enlight.app.Window' || className == 'Ext.Window' || (deprecated && className == 'Shopware.apps.Deprecated.view.main.Window')) && className != "Ext.window.MessageBox") { activeWindows.push(item); } } }); return activeWindows; } }); Ext.override(Ext.app.Controller, { getController: function(name) { if(this.subApplication) { return this.subApplication.getController(name); } return this.callParent(arguments); }, getStore: function(name) { if(this.subApplication) { return this.subApplication.getStore(name); } return this.callParent(arguments); }, getModel: function(model) { if(this.subApplication) { return this.subApplication.getModel(model); } return this.callParent(arguments); }, getView: function(view) { if(this.subApplication) { return this.subApplication.getView(view); } return this.callParent(arguments); }, control: function(selectors, listeners) { var me = this; if(me.subApplication) { me.subApplication.control(selectors, listeners, me); } else { me.application.control(selectors, listeners, me); } }, getRef: function(ref, info, config) { this.refCache = this.refCache || {}; info = info || {}; config = config || {}; Ext.apply(info, config); if (info.forceCreate) { return Ext.ComponentManager.create(info, 'component'); } var me = this, cached; me.refCache[ref] = cached = me.getActiveReference(info.selector); if (!cached && info.autoCreate) { me.refCache[ref] = cached = Ext.ComponentManager.create(info, 'component'); } if (cached) { cached.on('beforedestroy', function() { me.refCache[ref] = null; }); } return cached; }, getActiveReference: function(selector) { var me = this, subApp = me.subApplication, refs = Ext.ComponentQuery.query(selector), windowManager, activeRef; if(!subApp) { return refs[0]; } windowManager = subApp.windowManager; if(!windowManager) { return refs[0]; } activeRef = windowManager.getActive(); var returnRef = me.getActiveWindowReference(refs, activeRef); if(returnRef) { return returnRef; } Ext.each(refs, function(ref) { if(returnRef) return false; var win = ref.up('window'); if(!win) return false; var foundedWindow = me.getActiveWindowReference(win, activeRef); if(foundedWindow) { returnRef = ref; return false; } }); return returnRef || refs[0]; }, getActiveWindowReference: function(refs, activeRef) { var returnRef = false; Ext.each(refs, function(ref) { if(returnRef) { return false; } if(ref === activeRef) { returnRef = ref; return false; } }); return returnRef; } }); (function() { var requestMap = {}; var getRequestKey = Ext.bind(function(path, files) { files = (typeof files == 'string') ? [files] : files; return path + ',' + files.join(','); }, Ext.Loader); var abortAsyncRequest = Ext.bind(function(requestInfo) { switch(requestInfo.mode) { case 'xhr': Ext.Ajax.abort(requestInfo.identifier); this.numPendingFiles -= requestInfo.fileCount; break; default: Ext.Error.raise("Unknown requestInfo type. Can not abort"); } }, Ext.Loader); var cleanIfAsyncRequestExists = Ext.bind(function(requestKey) { if (requestMap.hasOwnProperty(requestKey)) { abortAsyncRequest(requestMap[requestKey]); delete requestMap[requestKey]; } }, Ext.Loader); var loadNamespacedClasses = Ext.bind(function(namespaces) { var host = window.location.protocol + "//" + window.location.hostname; Ext.iterate(namespaces, function(key, namespace){ var path = namespace.path, cacheKey, disableCachingValue = this.getConfig('disableCachingValue'), requestMethod = "post", tmpPath, maxLength = maxParameterLength - 50, files = []; if (maxLength <= 0) { maxLength = 1950; } if (namespace.files.length <= 1 && namespace.files[0].indexOf('?file') !== -1) { path += namespace.files[0]; requestMethod = "get"; } else { tmpPath = path; tmpPath += "?f="; files = []; Ext.each(namespace.files, function (file) { file = file.replace(/^model\//, 'm/'); file = file.replace(/^controller\//, 'c/'); file = file.replace(/^view\//, 'v/'); files.push(file); }); tmpPath += files.join('|'); if (tmpPath.length + host.length < maxLength) { requestMethod = "get"; path = tmpPath; } } if (!this.getConfig('caching')) { path += (requestMethod === 'get') ? '&' : '?'; path += this.getConfig('disableCachingParam') + '=' + disableCachingValue; } cacheKey = getRequestKey(path, namespace.files); if (this.syncModeEnabled) { cleanIfAsyncRequestExists(cacheKey); } else { if (requestMap.hasOwnProperty(cacheKey)) { return; } } var xhr = Ext.Ajax.request({ url: path, method: requestMethod, disableCaching: false, async: !this.syncModeEnabled, params: (requestMethod === 'get') ? (null) : ({ 'file[]': namespace.files }), scope: this, success: function(response) { try { Ext.globalEval(response.responseText + "\n//@ sourceURL=" + path); } catch(err) { Shopware.app.Application.fireEvent('Ext.Loader:evalFailed', err, response, namespace, requestMethod); } this.onFilesLoaded(namespace.classNames); if (requestMap.hasOwnProperty(cacheKey)) { delete requestMap[cacheKey]; } }, failure: function(xhr) { Shopware.app.Application.fireEvent('Ext.Loader:xhrFailed', xhr, namespace, requestMethod); cleanIfAsyncRequestExists(cacheKey); } }); if (!this.syncModeEnabled) { requestMap[cacheKey] = { mode: 'xhr', identifier: xhr, fileCount: namespace.files.length }; } }, this); }, Ext.Loader); Ext.Loader.getPath = function(className, prefix) { var path = '', paths = this.config.paths, suffix = this.config.suffixes[prefix] !== undefined ? this.config.suffixes[prefix] : '.js'; if (prefix.length > 0) { if (prefix === className) { return paths[prefix]; } path = paths[prefix]; className = className.substring(prefix.length + 1); } if (path.length > 0) { path = path.replace(/\/+$/, '') + '/'; } return [path.replace(/\/\.\//g, '/'), className.replace(/\./g, "/") + suffix]; }; Ext.Loader.config.disableCaching = false; Ext.Loader.config.caching = true; Ext.Loader.requestQueue = []; Ext.Loader.require = function(expressions, fn, scope, excludes) { var Manager = Ext.ClassManager; var filePath, expression, exclude, className, excluded = {}, excludedClassNames = [], possibleClassNames = [], possibleClassName, classNames = [], namespaces = {}, separatedPath, prefix, i, j, ln, subLn; if(!this.getConfig('disableCachingValue')) { this.setConfig('disableCachingValue', Ext.Date.now()); } if(this.getConfig('disableCaching')) { this.setConfig('caching', false); this.setConfig('disableCaching', false); } var disableCachingValue = this.getConfig('disableCachingValue'), disableCaching = !this.getConfig('caching'); expressions = Ext.Array.from(expressions); excludes = Ext.Array.from(excludes); fn = fn || Ext.emptyFn; scope = scope || Ext.global; for (i = 0, ln = excludes.length; i < ln; i++) { exclude = excludes[i]; if (typeof exclude === 'string' && exclude.length > 0) { excludedClassNames = Manager.getNamesByExpression(exclude); for (j = 0, subLn = excludedClassNames.length; j < subLn; j++) { excluded[excludedClassNames[j]] = true; } } } for (i = 0, ln = expressions.length; i < ln; i++) { expression = expressions[i]; if (typeof expression === 'string' && expression.length > 0) { possibleClassNames = Manager.getNamesByExpression(expression); for (j = 0, subLn = possibleClassNames.length; j < subLn; j++) { possibleClassName = possibleClassNames[j]; if (!excluded.hasOwnProperty(possibleClassName) && !Manager.isCreated(possibleClassName)) { Ext.Array.include(classNames, possibleClassName); } } } } if (!this.config.enabled) { if (classNames.length > 0) { Ext.Error.raise({ sourceClass: "Ext.Loader", sourceMethod: "require", msg: "Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. " + "Missing required class" + ((classNames.length > 1) ? "es" : "") + ": " + classNames.join(', ') }); } } if (classNames.length === 0) { fn.call(scope); return this; } if (!this.syncModeEnabled) { this.queue.push({ requires: classNames, callback: fn, scope: scope }); } classNames = classNames.slice(); for (i = 0, ln = classNames.length; i < ln; i++) { className = classNames[i]; if (!this.isFileLoaded.hasOwnProperty(className) || !this.isFileLoaded[className]) { this.isFileLoaded[className] = false; prefix = this.getPrefix(className); separatedPath = this.getPath(className, prefix); filePath = separatedPath.join(''); this.numPendingFiles++; if(!namespaces[prefix]) { namespaces[prefix] = { 'prefix': prefix, 'path': separatedPath[0], 'files': [], 'classNames': [] }; } namespaces[prefix]['files'].push(separatedPath[1]); namespaces[prefix]['classNames'].push(className); } else { if (!this.syncModeEnabled) { this.refreshQueue(); } } } loadNamespacedClasses(namespaces); if (this.syncModeEnabled) { fn.call(scope); } return this; }; Ext.Loader.onFilesLoaded = function(classNames) { var me = this; Ext.iterate(classNames, function(className){ me.numLoadedFiles++; me.isFileLoaded[className] = true; me.numPendingFiles--; }); me.refreshQueue(); }; Ext.Loader.setPath = function(name, path, suffix, bulk) { this.config.paths[name] = path; if(this.config.suffixes === undefined) { this.config.suffixes = []; } if(suffix !== undefined) { this.config.suffixes[name] = suffix; } return this; }; })(); Ext.override(Ext.app.EventBus, { dispatch: function(ev, target, args) { var bus = this.bus, selectors = bus[ev], selector, controllers, id, events, event, i, ln; if(target && typeof(target.up) === 'function') { try { var win = (target.isMainWindow || target.isSubWindow ? target : target.up('window')); if(win && win.subApplication) { bus = win.subApplication.eventbus.bus; selectors = bus[ev]; } else { var pnl = target.up('panel') || target; if(pnl && pnl.subApplication) { bus = pnl.subApplication.eventbus.bus; selectors = bus[ev]; } } } catch(e) { } } if (selectors) { for (selector in selectors) { if (selectors.hasOwnProperty(selector) && target.is(selector)) { controllers = selectors[selector]; for (id in controllers) { if (controllers.hasOwnProperty(id)) { events = controllers[id]; for (i = 0, ln = events.length; i < ln; i++) { event = events[i]; if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) { return false; } } } } } } } return true; }, uncontrol: function(controllerArray) { var me = this, bus = me.bus, deleteThis, idx; Ext.iterate(bus, function(ev, controllers) { Ext.iterate(controllers, function(query, controller) { deleteThis = false; Ext.iterate(controller, function(controlName) { idx = controllerArray.indexOf(controlName); if (idx >= 0) { deleteThis = true; } }); if (deleteThis) { delete controllers[query]; } }); }); } }); Ext.override(Ext.button.Button, { dataSuffix: 'action', afterRender: function() { var me = this; me.callOverridden(arguments); if(me.action) { var dom = me.getEl().dom.children[0].children[0]; dom.setAttribute('data-' + me.dataSuffix, me.action); } }, initComponent: function() { var me = this; me.callParent(arguments); me.addEvents( 'click', 'toggle', 'mouseover', 'mouseout', 'menushow', 'menuhide', 'menutriggerover', 'menutriggerout' ); if (me.menu) { me.split = true me.menu = Ext.menu.Manager.get(me.menu); if(me.menuCls && me.menuCls.length) { me.menu.setUI('default shopware-ui'); me.menu.addCls(me.menuCls); } me.menu.ownerCt = me; } if (me.url) { me.href = me.url; } if (me.href && !me.hasOwnProperty('preventDefault')) { me.preventDefault = false; } if (Ext.isString(me.toggleGroup)) { me.enableToggle = true; } }, showMenu: function() { var me = this; if (me.rendered && me.menu) { if (me.tooltip && me.getTipAttr() != 'title') { Ext.tip.QuickTipManager.getQuickTip().cancelShow(me.btnEl); } if (me.menu.isVisible()) { me.menu.hide(); } if(me.menu && me.menuOffset) { me.menu.showBy(me.el, me.menuAlign, me.menuOffset); } else { me.menu.showBy(me.el, me.menuAlign); } } return me; } }); Ext.define('Ext.LoadMask-Shopware', { override: 'Ext.LoadMask', _delayedTask: null, hideLoadingMsg: false, hideModal: false, bindComponent: function(comp){ var me = this, listeners = { scope: this, resize: me.sizeMask, added: me.onComponentAdded, removed: me.onComponentRemoved }, hierarchyEventSource = Ext.container.Container.hierarchyEventSource; me.hideLoadingMsg = comp.hideLoadingMsg || false; if (comp.floating) { listeners.move = me.sizeMask; me.activeOwner = comp; } else if (comp.ownerCt) { me.onComponentAdded(comp.ownerCt); } else { me.preventBringToFront = true; } me.mon(comp, listeners); me.mon(hierarchyEventSource, { show: me.onContainerShow, hide: me.onContainerHide, expand: me.onContainerExpand, collapse: me.onContainerCollapse, scope: me }); }, bindStore : function(store, initial) { var me = this; me.hideLoadingMsg = me.hideLoadingMsg || false; if(!me.hideLoadingMsg) { me.mixins.bindable.bindStore.apply(me, arguments); } store = me.store; if (store && store.isLoading() && !me.hideLoadingMsg) { me.onBeforeLoad(); } }, initComponent: function() { var me = this; try { me.callOverridden(arguments); } catch(err) { } if(me.delay && me.delay > 0) { me._delayedTask = new Ext.util.DelayedTask(function() { me.hide(); }); me._delayedTask.delay(me.delay); } }, hide: function() { try { this.callOverridden(arguments); } catch(err) { } if(this._delayedTask) { this._delayedTask.cancel(); this._delayedTask = null; } }, show: function() { var me = this; if (this.isElement) { this.ownerCt.mask(this.useMsg ? this.msg : '', this.msgCls); this.fireEvent('show', this); if(me.hideModal) { var mask = Ext.get(Ext.getBody().query('.x-mask')[0]); mask.hide(); } return; } return this.callParent(arguments); } }); Ext.override(Ext.form.Field, { supportText: '', helpText: '', helpWidth: null, helpTitle: null, helpTooltipDelay: 250, helpTooltipDismissDelay: 10000, supportTextEl: null, helpIconEl: null, afterRender: function () { var me = this; me.callParent(arguments); if(me.helpText) { me.createHelp(); } if(me.supportText) { me.createSupport(); } }, createSupport:function () { var me = this, row = new Ext.Element(document.createElement('tr')), fillCell = new Ext.Element(document.createElement('td')), cell = new Ext.Element(document.createElement('td')), supportText = new Ext.Element(document.createElement('div')); supportText.set({ cls: Ext.baseCSSPrefix +'form-support-text' }); if(me.supportText) { supportText.update(me.supportText); } supportText.appendTo(cell); var element = me.getEl().select('tbody'); if(element.elements.length > 1) { element = element.elements[0]; } if(me.fieldLabel || !me.hideEmptyLabel) { fillCell.appendTo(row); } cell.appendTo(row); if(me.helpText) { var tmpCell = new Ext.Element(document.createElement('td')); tmpCell.appendTo(row); } row.appendTo(element); me.supportTextEl = supportText; return supportText; }, createHelp:function () { var me = this, helpIcon = new Ext.Element(document.createElement('span')), row = new Ext.Element(document.createElement('td')); row.set({ width: 24, valign: 'top' }); helpIcon.set({ cls: Ext.baseCSSPrefix + 'form-help-icon' }); helpIcon.appendTo(row); Ext.tip.QuickTipManager.register({ target:helpIcon, cls: Ext.baseCSSPrefix + 'form-tooltip', title:(me.helpTitle) ? me.helpTitle : '', text:me.helpText, width:(me.helpWidth) ? me.helpWidth : 225, anchorToTarget: true, anchor: 'right', anchorSize: { width: 24, height: 24 }, defaultAlign: 'tr', showDelay: me.helpTooltipDelay, dismissDelay: me.helpTooltipDismissDelay }); row.appendTo(this.inputRow); this.helpIconEl = helpIcon; return helpIcon; } }); Ext.override(Ext.toolbar.Paging, { getPagingItems: function() { var me = this; return [{ itemId: 'first', tooltip: me.firstText, overflowText: me.firstText, iconCls: Ext.baseCSSPrefix + 'tbar-page-first', action: 'firstPage', disabled: true, handler: me.moveFirst, scope: me },{ itemId: 'prev', tooltip: me.prevText, overflowText: me.prevText, iconCls: Ext.baseCSSPrefix + 'tbar-page-prev', action: 'prevPage', disabled: true, handler: me.movePrevious, scope: me }, '-', me.beforePageText, { xtype: 'numberfield', itemId: 'inputItem', name: 'inputItem', cls: Ext.baseCSSPrefix + 'tbar-page-number', allowDecimals: false, minValue: 1, hideTrigger: true, enableKeyEvents: true, selectOnFocus: true, submitValue: false, width: me.inputItemWidth, margins: '-1 2 3 2', listeners: { scope: me, keydown: me.onPagingKeyDown, blur: me.onPagingBlur } },{ xtype: 'tbtext', itemId: 'afterTextItem', text: Ext.String.format(me.afterPageText, 1) }, '-', { itemId: 'next', tooltip: me.nextText, overflowText: me.nextText, iconCls: Ext.baseCSSPrefix + 'tbar-page-next', action: 'nextPage', disabled: true, handler: me.moveNext, scope: me },{ itemId: 'last', tooltip: me.lastText, overflowText: me.lastText, iconCls: Ext.baseCSSPrefix + 'tbar-page-last', action: 'lastPage', disabled: true, handler: me.moveLast, scope: me }, '-', { itemId: 'refresh', tooltip: me.refreshText, overflowText: me.refreshText, iconCls: Ext.baseCSSPrefix + 'tbar-loading', action: 'refreshPage', handler: me.doRefresh, scope: me }]; }, doRefresh : function(){ var me = this, current = me.store.currentPage, refreshButton = me.child('#refresh'); if(refreshButton) { refreshButton.disable(); } if (me.fireEvent('beforechange', me, current) !== false) { me.store.loadPage(current); } } }); Ext.override(Ext.Template, { re: /[{\[]([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?[}\]]/g }); Ext.override(Ext.String, { format: function(format) { var formatRe = /[{\[](\d+)[}\]]/g; var args = Ext.Array.toArray(arguments, 1); return format.replace(formatRe, function(m, i) { return args[i]; }); } }); Ext.override(Ext.form.Basic, { loadRecord: function(record) { var me = this; if(record && record.associations && record.associations.length) { var data = record.getAssociatedData(), values = Ext.clone(record.data); Ext.each(record.associations.items, function(item) { if(!Ext.isObject(item)) { return; } if (data[item.name] !== Ext.undefined) { var model = Ext.create(item.associatedName, data[item.name][0]); Ext.each(model.fields.keys, function(key) { values[item.associationKey + '[' + key + ']'] = model.data[key]; }); } }); me.setValues(values); } if(record) { me.callOverridden(arguments); } else { me._record = undefined; me.reset(); } me.fireEvent('recordchange', me, record); }, updateRecord: function(record) { record = record || this._record; var values = this.getValues(), fields = record.fields, data = {}, associationModel, associationUpdated; record.associations.each(function(association) { var associationStore = record[association.storeName]; associationUpdated = false; if (!(associationStore instanceof Ext.data.Store)) { associationStore = Ext.create('Ext.data.Store', { model: association.associatedName }); } if (associationStore.getCount() > 0) { associationModel = associationStore.first() } else { associationModel = Ext.create(association.associatedName); } Ext.each(associationModel.fields.keys, function(key) { var fieldName = association.associationKey + '['+ key +']'; if (fieldName in values) { associationModel.set(key, values[fieldName]); associationUpdated = true; delete values[fieldName]; } }); if (associationStore.getCount() === 0 && associationUpdated) { associationStore.add(associationModel); } record[association.storeName] = associationStore; }); fields.each(function(field) { var name = field.name; if (name in values) { data[name] = values[name]; } }); record.beginEdit(); record.set(data); record.endEdit(); return this; } }); Ext.define('Ext.data.writer.Json-Shopware', { override: 'Ext.data.writer.Json', getRecordData: function (record) { var me = this, data, associationData; data = me.getRecordFieldData(record); if (record.associations && record.associations.length > 0) { me.setRecordAssociationData(record, data); } return data; }, getRecordFieldData: function(record) { var data = {}; Ext.each(record.fields.keys, function(key) { data[key] = record.data[key]; }); return data; }, setRecordAssociationData: function(record, data) { var me = this, associationStores, associatedData; record.associations.each(function(association) { var associationStore = record[association.storeName]; if (associationStore instanceof Ext.data.Store && associationStore.getCount() > 0) { data[association.associationKey] = []; associationStore.each(function(associatedRecord) { if (associatedRecord instanceof Ext.data.Model) { associatedData = me.getRecordFieldData(associatedRecord); if (associatedRecord.associations && associatedRecord.associations.length > 0) { me.setRecordAssociationData(associatedRecord, associatedData); } data[association.associationKey].push(associatedData); } }); } else { data[association.associationKey] = []; } }); } }); Ext.override(Ext.grid.column.Action, { dataSuffix: 'action', constructor: function(config) { var me = this, cfg = Ext.apply({}, config), items = cfg.items || [me], l = items.length, i, item; delete cfg.items; me.callParent([cfg]); me.items = items; me.renderer = function(v, meta) { v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : ''; meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell'; for (i = 0; i < l; i++) { item = items[i]; item.disable = Ext.Function.bind(me.disableAction, me, [i]); item.enable = Ext.Function.bind(me.enableAction, me, [i]); var dataString = ''; if (item.action) { dataString = ' data-' + me.dataSuffix + '="' + item.action + '" '; } v += '' + (item.altText || me.altText) + ''; } return v; }; } }); Ext.override(Ext.view.BoundList, { dataSuffix: 'action', afterRender: function() { var me = this; me.callOverridden(arguments); if(me.el.dom && me.pickerField) { var dom = me.el.dom, value = me.action || me.pickerField.name; dom.setAttribute('data-' + me.dataSuffix, value); } } }); Ext.override(Ext.form.field.ComboBox, { dataSuffix: 'action', valueSuffix: '-table', afterRender: function() { var me = this; me.callOverridden(arguments); if(me.el.dom) { var dom = me.el.dom, value = (me.listConfig) ? me.listConfig.action : me.name; dom.setAttribute('data-' + me.dataSuffix, value + me.valueSuffix); } } }); Ext.override(Ext.tree.Panel, { animate: Ext.isChrome, initComponent: function() { var me = this; me.animate = Ext.isChrome; me.callOverridden(arguments); } }); Ext.override(Ext.panel.Panel, { animCollapse: Ext.isChrome, initComponent: function() { var me = this; me.animCollapse = Ext.isChrome; me.callOverridden(arguments); }, ghost: function(cls, windowMoving) { var me = this, ghostPanel = me.ghostPanel, box = me.getBox(), header; if (!ghostPanel) { ghostPanel = new Ext.panel.Panel({ renderTo: document.body, floating: { shadow: false }, frame: me.frame && !me.alwaysFramed, alwaysFramed: me.alwaysFramed, overlapHeader: me.overlapHeader, headerPosition: me.headerPosition, baseCls: me.baseCls, cls: me.baseCls + '-ghost ' + (cls ||'') }); me.ghostPanel = ghostPanel; } ghostPanel.floatParent = me.floatParent; if (me.floating) { ghostPanel.setZIndex(Ext.Number.from(me.el.getStyle('zIndex'), (windowMoving) ? -10 : 0)); } else { if(!windowMoving) { ghostPanel.toFront(); } } if (!(me.preventHeader || (me.header === false))) { header = ghostPanel.header; if (header) { header.suspendLayouts(); Ext.Array.forEach(header.query('tool'), header.remove, header); header.resumeLayouts(); } ghostPanel.addTool(me.ghostTools()); ghostPanel.setTitle(me.title); ghostPanel.setIconCls(me.iconCls); } ghostPanel.el.show(); ghostPanel.setPagePosition(box.x, box.y); Ext.defer(function() { ghostPanel.setSize(box.width, box.height); }, 10, me); me.el.hide(); return ghostPanel; }, unghost: function(show, matchPosition, windowMoving) { var me = this; if (!me.ghostPanel) { return; } if (show !== false) { me.el.show(); if (matchPosition !== false) { me.setPagePosition(me.ghostPanel.el.getXY()); if (me.hideMode == 'offsets') { delete me.el.hideModeStyles; } } if(!windowMoving) { Ext.defer(me.focus, 10, me); } } me.ghostPanel.el.hide(); }, }); Ext.override(Ext.ZIndexManager, { _showModalMask: function(comp) { var me = this, zIndex = comp.el.getStyle('zIndex') - 4, maskTarget = comp.floatParent ? comp.floatParent.getTargetEl() : comp.container, viewSize = maskTarget.getBox(), viewport = Shopware.app.Application.viewport; if (maskTarget.dom === document.body) { viewSize.height = Math.max(document.body.scrollHeight, Ext.dom.Element.getDocumentHeight()) + 1000; viewSize.width = Math.max(document.body.scrollWidth, viewSize.width); } if (!me.mask && !Shopware.app.Application.globalMask) { var body = Ext.getBody(); if(viewport) { body = viewport.getActiveDesktop().getEl(); } me.mask = body.createChild({ cls: Ext.baseCSSPrefix + 'mask' }); me.mask.setVisibilityMode(Ext.Element.DISPLAY); me.mask.on('click', me._onMaskClick, me); Shopware.app.Application.globalMask = me.mask; } me.mask = me.mask || Shopware.app.Application.globalMask; me.mask.insertAfter(comp.el); me.mask.maskTarget = maskTarget; maskTarget.addCls(Ext.baseCSSPrefix + 'body-masked'); me.mask.setBox(viewSize); me.mask.setStyle('zIndex', zIndex); me.mask.show(); }, register : function(comp, skipGlobalRegister, skipInit) { var me = this; skipInit = skipInit || false; skipGlobalRegister = skipGlobalRegister || false; if (comp.zIndexManager && !skipGlobalRegister) { comp.zIndexManager.unregister(comp); } if(!skipInit) { comp.zIndexManager = me; } me.list[comp.id] = comp; me.zIndexStack.push(comp); comp.on('hide', me.onComponentHide, me); } }); Ext.override(Ext.MessageBox, { afterRender: function() { var me = this, toolbar = me.dockedItems.getAt(1); toolbar.addCls('shopware-toolbar'); toolbar.setUI('shopware-ui'); Ext.each(me.msgButtons, function(button) { if(button.itemId === 'ok' || button.itemId === 'yes') { button.addCls('primary') } else { button.addCls('secondary'); } }); me.callOverridden(arguments); } }) Ext.override(Ext.grid.RowEditor, { getFloatingButtons: function() { var me = this, cssPrefix = Ext.baseCSSPrefix, btnsCss = cssPrefix + 'grid-row-editor-buttons', plugin = me.editingPlugin, btns; if (!me.floatingButtons) { btns = me.floatingButtons = new Ext.Container({ renderTpl: [ '
', '
', '
', '
', '
', '{%this.renderContainer(out,values)%}' ], width: 200, renderTo: me.el, baseCls: btnsCss, layout: { type: 'hbox', align: 'middle' }, defaults: { flex: 1, margins: '0 1 0 1' }, items: [{ itemId: 'update', xtype: 'button', cls: 'primary small', handler: plugin.completeEdit, scope: plugin, text: me.saveBtnText, disabled: !me.isValid, minWidth: Ext.panel.Panel.prototype.minButtonWidth }, { xtype: 'button', handler: plugin.cancelEdit, scope: plugin, cls: 'secondary small', text: me.cancelBtnText, minWidth: Ext.panel.Panel.prototype.minButtonWidth }] }); me.mon(btns.el, { mousedown: Ext.emptyFn, click: Ext.emptyFn, stopEvent: true }); } return me.floatingButtons; } }) Ext.override(Ext.picker.Date, { beforeRender: function () { var me = this; me.callOverridden(); if(me.todayBtn) { me.todayBtn.addCls('small').addCls('secondary'); } } }); Ext.define('Ext.data.association.HasMany-Shopware', { override: 'Ext.data.association.HasMany', lazyLoading: true, relation: undefined, storeClass: undefined, field: undefined, createStore: function() { var that = this, associatedModel = that.associatedModel, storeName = that.storeName, foreignKey = that.foreignKey, primaryKey = that.primaryKey, filterProperty = that.filterProperty, autoLoad = that.autoLoad, storeConfig = that.storeConfig || {}; return function() { var me = this, config, filter, modelDefaults = {}; if (me[storeName] === undefined) { if (filterProperty) { filter = { property : filterProperty, value : me.get(filterProperty), exactMatch: true }; } else { filter = { property : foreignKey, value : me.get(primaryKey), exactMatch: true }; } modelDefaults[foreignKey] = me.get(primaryKey); config = Ext.apply({}, storeConfig, { model : associatedModel, filters : [filter], remoteFilter : false, modelDefaults: modelDefaults, association : that }); if (that.hasOwnProperty('storeClass')) { config.extraParams = { id: me.get(primaryKey), association: that.associationKey }; me[storeName] = Ext.create(that.storeClass, config); } else { me[storeName] = Ext.data.AbstractStore.create(config); if (autoLoad) { me[storeName].load(); } } } return me[storeName]; }; } }); Ext.define('Enlight.app.Window', { ui: 'default', width: 800, height: 600, maximizable: true, minimizable: true, stateful: true, border: false, minimized: false, focusable: true, hideOnClose: true, forceToFront: false, extend: 'Ext.window.Window', requires: [ 'Ext.WindowManager' ], footerButton: true, isWindowOnFront: false, activeCls: Ext.baseCSSPrefix + 'window-active', isMainWindow: false, isSubWindow: false, onAfterRenderComponent: function() { var me = this, subApp = me.subApplication || me.subApp, windowManager, windowCount; if(!subApp) { return; } windowManager = subApp.windowManager; windowCount = windowManager.subWindows.getCount(); windowManager.register(me, true, true); if(windowManager.zIndexStack.length == 1) { var mainWindow = me; mainWindow.isMainWindow = true; windowManager.mainWindow = mainWindow; mainWindow.on({ beforeclose: me.onBeforeDestroyMainWindow, scope: me }); } else { if(!windowManager.multipleSubWindows && windowCount == 1) { if(Ext.isDefined(Ext.global.console)) { Ext.global.console.warn('Enlight.app.Window: The sub application is configured to only support one opened sub window at once.'); } } this.$subWindowId = Ext.id(); windowManager.subWindows.add(this.$subWindowId, this); me.isSubWindow = true; me.on({ scope: me, beforedestroy: function() { windowManager.subWindows.removeAtKey(this.$subWindowId); } }); } windowManager.bringToFront(me); }, onBeforeDestroyMainWindow: function () { var me = this, subApp = me.subApplication, windowManager, count, subWindows, subWindowConfirmationBlackList = [ 'Shopware.apps.Category', 'Shopware.apps.Voucher' ]; if (!subApp.hasOwnProperty('windowManager') || !subApp.windowManager) { return true; } windowManager = subApp.windowManager; count = windowManager.subWindows.getCount(); if (!count) { if (Ext.isFunction(me.hide)) { me.hide(); return true; } } subWindows = windowManager.subWindows.items; if (Ext.Array.contains(subWindowConfirmationBlackList, me.subApplication.$className)) { me.closeSubWindows(subWindows, windowManager); return true; } Ext.Msg.confirm('Modul schließen', 'Sollen alle Unterfenster vom "' + me.title + '"-Modul geschlossen werden?', function (button) { if (button == 'yes') { me.closeSubWindows(subWindows, windowManager); me.destroy(); } }); return false; }, initComponent: function() { var me = this; me.subApplication = me.initialConfig.subApp || this.subApp; delete this.subApp; if(!me.preventHeader) { me.constrain = true; me.isWindow = true; } me.on({ dragstart: me.onMoveStart, dragend: me.onMoveEnd }, me); var viewport = Shopware.app.Application.viewport; if(viewport && Shopware.apps.Index && me.forceToFront == false) { var activeDesktop = viewport.getActiveDesktop(), activeEl = activeDesktop.getEl(); me.desktop = activeDesktop; me.desktopPosition = viewport.getActiveDesktopPosition(); me.renderTo = activeEl; me.constrainTo = activeEl; } else { me.renderTo = Ext.getBody(); } if(!me.footerButton) { me.maximizable = false; me.minimizable = false; } if(me.forceToFront) { me.minimizable = false; } me.callParent(arguments); me.isWindowOnFront = true; me.center(); }, afterShow: function() { var me = this; me.callParent(arguments); Ext.Function.defer(function() { window.scrollTo(0, 0); }, 10); if(me.forceToFront) { var el = me.getEl(), elDom; if(!el) { return false; } elDom = el.dom; el.dom.style.zIndex = "999999"; } }, afterRender: function() { var me = this; me.callParent(arguments); me.onAfterRenderComponent.call(me); if(me.footerButton) { Shopware.WindowManagement.addItem(me.title, me); } }, minimize: function() { this.fireEvent('minimize', this); this.minimized = true; this.hide(); if(this._toolbarBtn) { this._toolbarBtn.toggle(false, true); } }, doClose: function() { var me = this; if(me.hideOnClose) { me.hideOnClose = false; me.hide(me.animateTarget, me.doClose, me); } if (me.hidden) { me.fireEvent('close', me); if (me.closeAction == 'destroy') { this.destroy(); } } else { me.hide(me.animateTarget, me.doClose, me); } if(this._toolbarBtn) { Shopware.WindowManagement.removeItem(this._toolbarBtn); } }, onMoveStart: function() { var me = this, activeWindows = Shopware.app.Application.getActiveWindows(), viewport = Shopware.app.Application.viewport; if(viewport) { me.hiddenLayer = viewport.getHiddenLayer(); me.hiddenLayer.setStyle('z-index', '9999999'); me.hiddenLayer.appendTo(Ext.getBody()); } Ext.each(activeWindows, function(window) { if(window != me) { if(window.$className !== 'Shopware.apps.Deprecated.view.main.Window') { window.ghost('', true); } } }); }, onMoveEnd: function() { var me = this, activeWindows = Shopware.app.Application.getActiveWindows(), viewport = Shopware.app.Application.viewport; Ext.each(activeWindows, function(window) { if(!window.minimized && window != me) { if(window.$className !== 'Shopware.apps.Deprecated.view.main.Window') { window.unghost(true, true, true); } } }); Ext.WindowManager.bringToFront(me); if(viewport) { viewport.jumpTo(me.desktopPosition, true); me.hiddenLayer.setStyle('z-index', null); Ext.removeNode(me.hiddenLayer.dom); } }, onMouseDown: function() { var me = this, subApp = me.subApplication || me.subApp, windowManager = subApp.windowManager; try { windowManager.bringToFront(me); } catch(e) {} me.callParent(arguments); }, fitContainer: function() { var me = this, parent = me.floatParent, container = parent ? parent.getTargetEl() : me.container, size = container.getViewSize(false); size.height = size.height - 20; me.setSize(size); me.setPosition.apply(me, [0, 0]); }, maximize: function() { var me = this; if (!me.maximized) { me.expand(false); if (!me.hasSavedRestore) { me.restoreSize = me.getSize(); me.restorePos = me.getPosition(true); } if (me.maximizable) { me.header.tools.maximize.hide(); me.header.tools.restore.show(); } me.maximized = true; me.el.disableShadow(); if (me.dd) { me.dd.disable(); } if (me.resizer) { me.resizer.disable(); } if (me.collapseTool) { me.collapseTool.hide(); } me.el.addCls(Ext.baseCSSPrefix + 'window-maximized'); me.container.addCls(Ext.baseCSSPrefix + 'window-maximized-ct'); me.syncMonitorWindowResize(); me.fitContainer(); me.fireEvent('maximize', me); } return me; }, restore: function() { var me = this, header = me.header, tools = header.tools; if (me.maximized) { delete me.hasSavedRestore; me.removeCls(Ext.baseCSSPrefix + 'window-maximized'); if (tools.restore) { tools.restore.hide(); } if (tools.maximize) { tools.maximize.show(); } if (me.collapseTool) { me.collapseTool.show(); } me.maximized = false; me.setPosition(me.restorePos); me.setSize(me.restoreSize); delete me.restorePos; delete me.restoreSize; me.el.enableShadow(true); if (me.dd) { me.dd.enable(); if (header) { header.addCls(header.indicateDragCls) } } if (me.resizer) { me.resizer.enable(); } me.container.removeCls(Ext.baseCSSPrefix + 'window-maximized-ct'); me.syncMonitorWindowResize(); me.doConstrain(); me.fireEvent('restore', me); } return me; }, closeSubWindows: function(subWindows, windowManager) { Ext.each(subWindows, function(subWindow) { if(subWindow) { windowManager.subWindows.removeAtKey(subWindow.$subWindowId); subWindow.destroy(); } }); } }); Ext.define('Enlight.app.SubWindow', { extend: 'Enlight.app.Window', alias: 'widget.subwindow', footerButton: false, isSubWindow: true }); Ext.define('Enlight.app.SubApplication', { extend: 'Ext.app.Controller', requires: [ 'Ext.ModelManager', 'Ext.data.Model', 'Ext.data.StoreManager', 'Ext.ComponentManager', 'Ext.app.EventBus', 'Ext.ZIndexManager', 'Enlight.app.Window' ], scope : undefined, beforeLaunch : Ext.emptyFn, launch : Ext.emptyFn, initControllers: true, eventbus: null, multipleSubWindows: true, constructor: function(config){ config = config || {}; var me = this, controllers = Ext.Array.from(config.controllers); me.eventbus = Ext.create('Ext.app.EventBus'); me.windowManager = Ext.create('Ext.ZIndexManager'); me.windowManager.multipleSubWindows = me.multipleSubWindows; Ext.apply(config, { documentHead : Ext.getHead(), id : config.id }); Ext.apply(me, { appControllers : (controllers.length) ? controllers : me.controllers, controllers : Ext.create('Ext.util.MixedCollection'), stores : Ext.create('Ext.util.MixedCollection'), eventbus : me.eventbus, windowManager : me.windowManager }); me.callParent(arguments); }, init: function() { var me = this; Shopware.app.Application.fireEvent('subAppLoaded', me); me.onBeforeLaunch(); }, addController: function(controller, skipInit) { var me = this, app = me.app, controllers = me.controllers, prefix = Ext.Loader.getPrefix(controller.name); controller.application = app; controller.subApplication = me; controller.id = controller.id || controller.name; if (prefix === '' || prefix === controller.name) { controller.name = this.name + '.controller.' + controller.name; } if (Ext.isDefined(controller.name)) { var name = controller.name; delete controller.name; controller = Ext.create(name, controller); } controller.$controllerId = Ext.id() controllers.add(controller.$controllerId, controller); if (!skipInit) { controller.init(); } return controller; }, removeController: function(controller, removeListeners) { removeListeners = removeListeners || true; var me = this, controllers = me.controllers; var key = controllers.indexOf(controller); controllers.removeAt(key); if (removeListeners) { var bus = me.eventbus; bus.uncontrol([controller.id]); } }, addSubApplication: function(subapp) { var me = this, app = me.app, subapps = app.subApplications; subapp.$subAppId = Ext.id(); subapps.add(subapp.$subAppId, subapp); return subapp; }, removeSubApplication: function(subapp) { var me = this, app = me.app, subapps = app.subApplications; var key = subapps.indexOf(subapp); subapps.removeAt(key); }, onBeforeLaunch: function() { var me = this, app = me.app, controllers = me.appControllers, windowManager = me.windowManager, controller, cmp; if(!windowManager.hasOwnProperty('mainWindow')) { windowManager.mainWindow = null; } if(!windowManager.hasOwnProperty('subWindows')) { windowManager.subWindows = Ext.create('Ext.util.MixedCollection'); } if (app) { Ext.each(controllers, function(controlName) { controller = me.addController({ name: controlName }, !me.initControllers); }); delete me.appControllers; Ext.applyIf(app, { subApplications : Ext.create('Ext.util.MixedCollection') }); me.addSubApplication(me); } if(Shopware.app.Application.moduleLoadMask) { Shopware.app.Application.moduleLoadMask.hide(); } me.beforeLaunch.call(me.scope || me); cmp = me.launch.call(me.scope || me); if (cmp) { me.cmp = cmp; me.cmp.on('destroy', me.handleSubAppDestroy, me, { single: true }); } }, handleSubAppDestroy: function(cmp) { var me = this, controllers = me.controllers; controllers.each(function(controller) { me.removeController(controller); }); me.removeSubApplication(me); me.eventbus = null; me.windowManager = null; me = null; }, getModuleClassName: function(name, type) { var namespace = Ext.Loader.getPrefix(name); if (namespace.length > 0 && namespace !== name) { return name; } return this.name + '.' + type + '.' + name; }, getController: function(name) { var controller = this.controllers.findBy(function(item) { if(item.id === name) { return true; } }, this); if (!controller) { return this.addController({ name: name}); } return controller; }, getStore: function(name) { var store = this.stores.get(name); if (!store) { store = Ext.StoreManager.get(name); if(store && !store.autoLoad) { store = null; } } if (!store) { store = Ext.create(this.getModuleClassName(name, 'store'), { application: this, storeId: name, id: name }); this.stores.add(store); } return store; }, getModel: function(model) { model = this.getModuleClassName(model, 'model'); return Ext.ModelManager.getModel(model); }, getView: function(view) { view = this.getModuleClassName(view, 'view'); var cls = Ext.ClassManager.get(view); cls.prototype.subApp = this; return cls; }, control: function(selectors, listeners, controller) { if(this.hasOwnProperty('eventbus') && this.eventbus) { this.eventbus.control(selectors, listeners, controller); } else { return false; } }, setAppWindow: function(win) { var me = this; if(win.isSubWindow) { win.isSubWindow = false; me.windowManager.subWindows.removeAtKey(win.$subWindowId); delete win.$subWindowId; } if(me.cmp) { me.un('beforeclose', me.cmp.onBeforeDestroyMainWindow, me); me.un('destory', me.handleSubAppDestroy, me); } me.cmp = win; me.cmp.on({ destroy: me.handleSubAppDestroy, scope: me }); me.cmp.on({ beforeclose: me.cmp.onBeforeDestroyMainWindow, scope: me.cmp }); win.mainWindow = true; me.windowManager.bringToFront(win); return me.windowManager.mainWindow = win; } }); Ext.Class.registerPreprocessor('shopware.subappLoader', function(cls, data, hooks, fn) { var className = Ext.getClassName(cls), match = className.match(/^(Shopware|Enlight)\.controller\.|(.*)\.apps\./), requires = [], modules = ['model', 'view', 'store', 'controller'], prefix; if (!data.hasOwnProperty('extend') || data.extend.prototype.$className != 'Enlight.app.SubApplication' || match === null) { return true; } var i, ln, module, items, j, subLn, item; if(data.name === undefined) { data.name = className; } if(data.loadPath !== undefined) { Ext.Loader.setPath(data.name, data.loadPath, '', data.bulkLoad); } for (i = 0,ln = modules.length; i < ln; i++) { module = modules[i]; items = Ext.Array.from(data[module + 's']); for (j = 0,subLn = items.length; j < subLn; j++) { item = items[j]; prefix = Ext.Loader.getPrefix(item); if (prefix === '' || prefix === item) { requires.push(data.name + '.' + module + '.' + item); } else { requires.push(item); } } } Ext.require(requires, Ext.pass(fn, [cls, data, hooks], this)); return false; }, true, 'after', 'loader'); Ext.define('Enlight.app.Controller', { extend: 'Ext.app.Controller', getController: function(name) { return this.subApplication.getController(name); }, getStore: function(name) { return this.subApplication.getStore(name); }, getModel: function(model) { return this.subApplication.getModel(model); }, getView: function(view) { return this.subApplication.getView(view); }, getEventBus: function() { return this.subApplication.eventbus; }, control: function(selectors, listeners) { var me = this; if(me.subApplication) { me.subApplication.control(selectors, listeners, me); } else { me.application.control(selectors, listeners, me); } } }); Ext.define('Ext.util.FileUpload', { extend:'Ext.container.Container', alternateClassName: [ 'Ext.FileUpload', 'Shopware.app.FileUpload' ], alias:'widget.html5fileupload', padding:20, requestURL: null, supportsFileAPI: !!window.FileReader, showInput:true, checkAmount: true, maxAmount: 3, maxAmountErrorFunction: Ext.emptyFn, checkType: true, validTypes: [ 'gif', 'png', 'tiff', 'jpeg', 'jpg', 'jpe', 'rar', 'zip', 'tar' ], validTypeErrorFunction: Ext.emptyFn, checkSize: false, maxSize: 2097152, maxSizeErrorFunction: Ext.emptyFn, afterUploadFunction: Ext.emptyFn, fileInputConfig:{ name:'images[]', fieldLabel: 'Bild(er) auswählen', buttonText:'Bild(er) selektieren', labelStyle:'font-weight: 700', labelWidth:125, allowBlank:true, width: 450, buttonConfig: { cls: 'secondary small', iconCls: 'sprite-inbox-image' } }, inputConfig: {}, dropZoneTpl: [ '
', '', '', "{actualQuantity} " + "{snippet name=file_upload/progress_bar_text default='from' namespace='backend/component/file_upload'}von{/snippet}" + " {totalQuantity} ", '', '{text}', '', '
' ], dropZoneCls:'-dropzone', dropZoneOverCls:'dropzone-over', dropZoneDropCls:'dropzone-drop', dropZoneText: 'oder drag & drop die Dateien hier rein', dropItemCls: 'dropzone-item', dropItemImageCls: 'dropzone-item-image', dropItemInfoCls: 'dropzone-item-info', dropItemTpl: [ '
', '

Name: {name:ellipsis(30)}

', '

Größe: {size}kB

', '
' ], progressBarCls: 'dropzone-item-progress-bar', progressBarTpl: [ '' ], initial: true, fileField: 'fileId', enablePreviewImage: true, previewEnabledCls: 'preview-image-displayed', showLegacyBrowserNotice: false, hideOnLegacy: false, snippets: { uploadReady: 'Dateien hochgeladen', messageText: '[0] Dateien hochgeladen', messageTitle: 'Medienverwaltung', legacyMessage: "Ihr Browser unterstützt nicht die benötigten Funktionen für einen Drag&Drop-Upload. ", maxUploadSizeTitle: 'Die Datei ist zu groß', maxUploadSizeText: "Die selektierte Datei überschreitet die maximal erlaubte Uploadgröße. Bitte wählen Sie eine andere Datei aus.", blackListTitle:'Blacklist', blackListMessage:"Die Datei [0] ist nicht erlaubt!" }, initComponent:function () { var me = this; me.items = me.items || []; if (!me.requestURL) { Ext.Error.raise(me.$className + ' needs the property "requestURL"'); } if (me.supportsFileAPI) { me.dropZone = me.createDropZone(); me.items.push(me.dropZone); } else { me.showInput = true; me.enablePreviewImage = false; if(me.hideOnLegacy) { me.showInput = false; me.showLegacyBrowserNotice = false; me.hidden = true; } } if (me.showInput) { if(me.showLegacyBrowserNotice) { me.fileInputConfig.supportText = me.snippets.legacyMessage; } me.fileInput = me.createFileInputField(); me.items.push(me.fileInput); } if(me.maxSizeErrorFunction == Ext.emptyFn) { me.maxSizeErrorFunction = me.maxSizeErrorCallback; } me.addEvents('fileUploaded', 'uploadReady'); me.callParent(arguments); }, createDropZone:function () { var me = this, dropZone, text; text = Ext.create('Ext.Component', { renderTpl: me.createDropZoneTemplate(), renderData: { text: me.dropZoneText } }); dropZone = Ext.create('Ext.container.Container', { focusable: false, cls: me.baseCls + me.dropZoneCls, items: [ text ] }); me.on('afterrender', me.createDropZoneEvents, me); return dropZone; }, maxSizeErrorCallback: function() { var me = this; Ext.Msg.alert(me.snippets.maxUploadSizeTitle, me.snippets.maxUploadSizeText); me.dropZone.removeAll(); var text = Ext.create('Ext.Component', { renderTpl: me.dropZoneTpl, tpl : me.dropZoneTpl, renderData: { text: me.dropZoneText } }); me.dropZone.add(text); me.fireEvent('uploadReady'); }, createDropZoneTemplate: function() { var me = this; return new Ext.XTemplate( '
', '', '', "{actualQuantity} " + "{snippet name=file_upload/progress_bar_text default='from' namespace='backend/component/file_upload'}von{/snippet}" + " {totalQuantity} ", '', '{text}', '', '
' ); }, createDropZoneEvents:function () { var me = this, el = me.dropZone.getEl().dom; el.addEventListener('dragenter', function (event) { me.dropZone.getEl().addCls(me.dropZoneOverCls); event.preventDefault(); event.stopPropagation(); }, false); el.addEventListener('dragover', function (event) { event.preventDefault(); event.stopPropagation(); }, false); el.addEventListener('dragleave', function (event) { var target = event.target; if (target && target === el) { me.dropZone.getEl().removeCls(me.dropZoneOverCls); } event.preventDefault(); event.stopPropagation(); }, false); el.addEventListener('drop', function (event) { var dropEl = me.dropZone.getEl(), files; event.preventDefault(); event.stopPropagation(); if (dropEl.hasCls(me.dropZoneOverCls)) { dropEl.removeCls(me.dropZoneOverCls); } dropEl.addCls(me.dropZoneDropCls); if (event.dataTransfer && event.dataTransfer.files) { files = event.dataTransfer.files; } me.iterateFiles(files); }, false); }, createFileInputField:function () { var me = this, file, el, ret; var config = Ext.apply(me.inputConfig, me.fileInputConfig); config.name = me.fileField; file = me.inputFileCmp = Ext.create('Ext.form.field.File', config); ret = file; file.on('afterrender', function () { el = file.fileInputEl.dom; if(!me.showLegacyBrowserNotice) { el.setAttribute('multiple', 'multiple'); el.setAttribute('size', '5'); } }, me); if(Ext.isIE || Ext.isSafari) { me.form = Ext.create('Ext.form.Panel', { unstyled: true, layout: 'anchor', url: me.requestURL, items: [ file ] }); ret = me.form; } file.on('change', function(field) { var fileField = field.getEl().down('input[type=file]').dom; if(Ext.isIE || Ext.isSafari) { me.form.getForm().submit({ method: 'POST', success: function() { me.fireEvent('uploadReady', null); } }); return false; } Ext.each(fileField.files, function(file) { var timeout = window.setTimeout(function() { me.uploadFile(file, 0, null, fileField.files.length); clearTimeout(timeout); timeout = null; }, 10); }); }, me); return ret; }, iterateFiles:function (files) { var me = this; if (typeof(files) === 'undefined') { return false; } if(me.checkAmount) { if(files.length > me.maxAmount) { if(me.maxAmountErrorFunction) { me.maxAmountErrorFunction.call(); } return false; } } if (me.enablePreviewImage) { for (var i = 0, l = files.length; i < l; i++) { me.createPreviewImage(files[i]); } } else { me.createPreview(files); } }, createPreview: function(files) { var me = this; if(me.dropZone !== Ext.undefined) { me.dropZone.removeAll(); var text = Ext.create('Ext.Component', { renderTpl: me.dropZoneTpl, tpl: me.dropZoneTpl, renderData: { actualQuantity: '0', totalQuantity: files.length, text: me.snippets.uploadReady } }); text.addClass('small-padding'); var progressBar = Ext.create('Ext.Component', { cls: me.progressBarCls, tpl: me.progressBarTpl }); progressBar.update({ percent: 0 }); progressBar.value = 0; var infoPnl = Ext.create('Ext.panel.Panel', { ui: 'plain', cls: me.dropItemCls, items: [ progressBar ] }); me.dropZone.add(text); me.dropZone.add(infoPnl); } Ext.each(files, function(file) { var timeout = window.setTimeout(function() { me.uploadFile(file, progressBar, text, files.length); clearTimeout(timeout); timeout = null; }, 10); }); }, createPreviewImage: function (file) { var reader = new FileReader, img, me = this; reader.onload = (function() { return function(event) { var format, progressBar, kbValue, info, infoPnl; if(me.checkType) { format = file.type; format = format.replace(/(.*\/)/i, ''); if(!me.in_array(format, me.validTypes)) { if(me.validTypeErrorFunction) { me.validTypeErrorFunction.call(); } return false; } } if(me.checkSize && me.maxSize < file.size) { if(me.maxSizeErrorFunction) { me.maxSizeErrorFunction.call(me, file.size); } return false; } if(me.initial) { me.dropZone.removeAll(); me.initial = false; } progressBar = Ext.create('Ext.Component', { cls: me.progressBarCls, tpl: me.progressBarTpl }); progressBar.update({ percent: 0 }); progressBar.addClass(me.previewEnabledCls); kbValue = ~~(file.size / 1000); info = Ext.create('Ext.Component', { renderTpl: me.dropItemTpl, columnWidth: .7, renderData: { infoCls: me.dropItemInfoCls, name: file.name, size: kbValue }, items: [ progressBar ] }); if((/image/i).test(file.type)) { img = Ext.create('Ext.container.Container', { cls: me.dropItemImageCls, layout: 'column', items: [{ xtype: 'image', columnWidth: .3, src: event.target.result }, info ] }); } else { img = Ext.create('Ext.container.Container', { cls: me.dropItemImageCls, layout: 'column', items: [{ xtype: 'container', cls: 'ico-package', columnWidth: .3 }, info ] }); } infoPnl = Ext.create('Ext.panel.Panel', { ui: 'plain', cls: me.dropItemCls, items: [ img, progressBar ] }); me.dropZone.add(infoPnl); me.uploadFile(file, progressBar, infoPnl); } }(img)); reader.readAsDataURL(file); }, uploadFile: function (file, progressBar, infoText, count) { var xhr = new XMLHttpRequest(), me = this; progressBar = progressBar || 0; infoText = infoText || null; xhr.open("post", me.requestURL, false); xhr.addEventListener('load', function(e) { var target = e.target, response = Ext.decode(target.responseText); if (response.success == false && response.blacklist == true) { Shopware.Notification.createGrowlMessage(me.snippets.blackListTitle, Ext.String.format(me.snippets.blackListMessage, response.extension)); } if(me.checkSize && me.maxSize < file.size) { if(me.maxSizeErrorFunction) { me.maxSizeErrorFunction.call(me, file.size); } return false; } if (me.enablePreviewImage) { progressBar.update({ percent: 100 }); } else { if(Ext.isNumeric(progressBar)) { progressBar++; } else { progressBar.value++; progressBar.update( { percent: (progressBar.value / count) * 100 } ); } if(infoText) { infoText.tpl = me.createDropZoneTemplate(); infoText.renderTpl = me.createDropZoneTemplate(); try { infoText.update({ actualQuantity: progressBar.value, totalQuantity: count, text: me.snippets.uploadReady }); } catch(e) { } } } if (target.readyState === 4 && target.status === 200) { try { me.fireEvent('fileUploaded', target); } catch(e) { } } if (infoText && progressBar.value === count) { if(me.dropZone !== Ext.undefined) { me.dropZone.removeAll(); var text = Ext.create('Ext.Component', { renderTpl: me.dropZoneTpl, tpl : me.dropZoneTpl, renderData: { text: me.dropZoneText } }); me.dropZone.add(text); } me.fireEvent('uploadReady', target); if (response.success) { Shopware.Msg.createGrowlMessage(me.snippets.messageTitle, Ext.String.format(me.snippets.messageText, count), 'Media-Manager'); }else{ Ext.Msg.alert(me.snippets.maxUploadSizeTitle, me.snippets.maxUploadSizeText); } } else { me.fireEvent('uploadReady', target); } }, false); var formData = new FormData(); formData.append(this.fileField, file); xhr.send(formData); }, in_array: function(needle, haystack, argStrict) { var key = '', strict = !! argStrict; if (strict) { for (key in haystack) { if (haystack[key] === needle) { return true; } } } else { for (key in haystack) { if (haystack[key] == needle) { return true; } } } return false; } }); Ext.define('Enlight.app.WindowManagement', { alternateClassName: [ 'Shopware.app.WindowManagement', 'Shopware.WindowManagement' ], singleton: true, extend: 'Ext.app.Controller', requires: [ 'Ext.WindowManager' ], defaultCls: 'footer-btn', defaultIconCls: 'closeable', initial: true, view: null, footer: null, viewport: null, init: function(footer) { var me = this; if(me.initial) { me.view = Ext.create('Ext.container.Container', { cls: 'window-management-holder', autoScroll: true }); me.footer = footer; me.viewport = footer.ownerCt; me.footer.add(me.view); me.inital = false; } footer.on('afterrender', me.onFooterRendered, me); me.callParent(arguments); }, addItem: function(text, view) { var btn, me = this; if(!me.view) { return btn; } view = view || {}; btn = Ext.create('Ext.button.Button', { cls: me.defaultCls, iconCls: me.defaultIconCls, text: text || 'Window', responsibleView: view, handler: me.onButtonClick }); view._toolbarBtn = btn; me.view.add(btn); me.setActiveItem(btn); view.on('destroy', function() { if(view._toolbarBtn) { view._toolbarBtn.destroy(); } }, me); return btn; }, setActiveItem: function(btn) { if(this.view.items.items && this.view.items.items.length > 0) { Ext.each(this.view.items.items, function(item) { item.toggle(false, true); }); } btn.toggle(true, true); return btn; }, removeItem: function(btn) { this.view.remove(btn, true); return true; }, removeAt: function(key) { this.view.remove(key, true); return true; }, getAt: function(key) { return this.view.items.items[key]; }, getAllItems: function() { return this.view.items.items; }, removeAllItems: function() { this.view.removeAll(true); return true; }, onButtonClick: function(btn, e) { if(!btn.responsibleView) { return false; } var view = btn.responsibleView, viewport = Shopware.app.Application.viewport, icn = btn.btnIconEl, minHeight = icn.getY(), maxHeight = icn.getY() + icn.getHeight(), minWidth = icn.getX(), maxWidth = icn.getX() + icn.getWidth(); if(e.getY() >= minHeight && e.getY() <= maxHeight && e.getX() >= minWidth && e.getX() <= maxWidth) { if(view.closeAction == 'destroy') { view.destroy(); } else { view.hide(); } return false; } if(viewport.getActiveDesktopPosition() !== view.desktop) { viewport.jumpTo(view.desktopPosition); } if(view.minimized) { view.show(); btn.toggle(true, true); view.minimized = false; } var isModal = false; Ext.each(Ext.WindowManager.zIndexStack, function(item) { if(item && item.modal && item.modal === true && item.getEl().isVisible()) { isModal = true; } }); if(!isModal) { Ext.WindowManager.bringToFront(view); } Shopware.app.WindowManagement.setActiveItem(btn); }, onFooterRendered: function(cmp) { this.viewport = cmp.ownerCt; }, minimizeAll: function() { var wins = this.getActiveWindows(); Ext.each(wins, function(win) { win.minimize(); }); return true; }, closeAll: function() { var wins = this.getActiveWindows(); Ext.each(wins, function(win) { win.destroy(); }); Shopware.app.WindowManagement.removeAllItems(); return true; }, stackVertical: function() { var activeWindows = this.getActiveWindows(), viewport = Shopware.app.WindowManagement.viewport, footer = Shopware.app.WindowManagement.footer, size = viewport.getSize(), count, windowHeight, footerSize = footer.getSize(); count = activeWindows.length; windowHeight = (Ext.Element.getViewportHeight() - (footerSize.height * 2)) / count; Ext.each(activeWindows, function(window, index) { window.setSize({ width: size.width, height: windowHeight }); window.setPosition(0, windowHeight * index); }); return true; }, stackHorizontal: function() { var activeWindows = this.getActiveWindows(), viewport = Shopware.app.WindowManagement.viewport, footer = Shopware.app.WindowManagement.footer, size = viewport.getSize(), count, windowWidth, footerSize = footer.getSize(); count = activeWindows.length; windowWidth = (Ext.Element.getViewportWidth()) / count; Ext.each(activeWindows, function(window, index) { window.setSize({ width: windowWidth, height: size.height - (footerSize.height * 2) }); window.setPosition(windowWidth * index, 0); window.show(); }); return true; }, getActiveWindows: function () { var activeWindows = []; Ext.each(Shopware.app.Application.subApplications.items, function (subApp) { if(!subApp.windowManager || !subApp.windowManager.hasOwnProperty('zIndexStack')) { return; } Ext.each(subApp.windowManager.zIndexStack, function (item) { if (typeof(item) !== 'undefined' && item.$className === 'Ext.window.Window' || item.$className === 'Shopware.apps.Deprecated.view.main.Window' || item.$className === 'Enlight.app.Window' || item.$className == 'Ext.Window' && item.$className !== "Ext.window.MessageBox") { activeWindows.push(item); } if (item.alternateClassName === 'Ext.window.Window' || item.alternateClassName === 'Shopware.apps.Deprecated.view.main.Window' || item.alternateClassName === 'Enlight.app.Window' || item.alternateClassName == 'Ext.Window' && item.$className !== "Ext.window.MessageBox") { activeWindows.push(item); } }); }); return activeWindows; } }); Ext.define('Enlight.app.SubWindow', { extend: 'Enlight.app.Window', alias: 'widget.subwindow', footerButton: false, isSubWindow: true }); Ext.define('Ext.ux.DataView.DragSelector', { requires: ['Ext.dd.DragTracker', 'Ext.util.Region'], init: function(dataview) { this.dataview = dataview; dataview.mon(dataview, { beforecontainerclick: this.cancelClick, scope: this, render: { fn: this.onRender, scope: this, single: true } }); }, reInit: function() { this.destroy(); this.init(this.dataview); }, destroy: function() { if (this.proxy) { this.proxy.destroy(); this.proxy = null; } }, onRender: function() { this.tracker = Ext.create('Ext.dd.DragTracker', { dataview: this.dataview, el: this.dataview.el, dragSelector: this, onBeforeStart: this.onBeforeStart, onStart: this.onStart, onDrag : this.onDrag, onEnd : this.onEnd }); this.dragRegion = Ext.create('Ext.util.Region'); }, onBeforeStart: function(e) { return e.target == this.dataview.getEl().dom; }, onStart: function(e) { var dragSelector = this.dragSelector, dataview = this.dataview; this.dragging = true; dragSelector.fillRegions(); dragSelector.getProxy().show(); dataview.getSelectionModel().deselectAll(); }, cancelClick: function() { return !this.tracker.dragging; }, onDrag: function(e) { var dragSelector = this.dragSelector, selModel = dragSelector.dataview.getSelectionModel(), dragRegion = dragSelector.dragRegion, bodyRegion = dragSelector.bodyRegion, proxy = dragSelector.getProxy(), regions = dragSelector.regions, length = regions.length, startXY = this.startXY, currentXY = this.getXY(), minX = Math.min(startXY[0], currentXY[0]), minY = Math.min(startXY[1], currentXY[1]), width = Math.abs(startXY[0] - currentXY[0]), height = Math.abs(startXY[1] - currentXY[1]), region, selected, i; Ext.apply(dragRegion, { top: minY, left: minX, right: minX + width, bottom: minY + height }); dragRegion.constrainTo(bodyRegion); proxy.setRegion(dragRegion); for (i = 0; i < length; i++) { region = regions[i]; selected = dragRegion.intersect(region); if (selected) { selModel.select(i, true); } else { selModel.deselect(i); } } }, onEnd: Ext.Function.createDelayed(function(e) { var dataview = this.dataview, selModel = dataview.getSelectionModel(), dragSelector = this.dragSelector; this.dragging = false; dragSelector.getProxy().hide(); }, 1), getProxy: function() { if (!this.proxy) { this.proxy = this.dataview.getEl().createChild({ tag: 'div', cls: 'x-view-selector' }); } return this.proxy; }, fillRegions: function() { var dataview = this.dataview, regions = this.regions = []; dataview.all.each(function(node) { regions.push(node.getRegion()); }); this.bodyRegion = dataview.getEl().getRegion(); } }); Ext.define('Ext.ux.DataView.LabelEditor', { extend: 'Ext.Editor', alignment: 'tl-tl', completeOnEnter: true, cancelOnEsc: true, shim: false, autoSize: { width: 'boundEl', height: 'field' }, labelSelector: 'x-editable', requires: [ 'Ext.form.field.Text' ], constructor: function(config) { config.field = config.field || Ext.create('Ext.form.field.Text', { allowBlank: false, selectOnFocus:true }); this.callParent([config]); }, init: function(view) { this.view = view; this.mon(view, 'render', this.bindEvents, this); this.on('complete', this.onSave, this); }, bindEvents: function() { this.mon(this.view.getEl(), { click: { fn: this.onClick, scope: this } }); }, onClick: function(e, target) { var me = this, item, record; if (Ext.fly(target).hasCls(me.labelSelector) && !me.editing && !e.ctrlKey && !e.shiftKey) { e.stopEvent(); item = me.view.findItemByChild(target); record = me.view.store.getAt(me.view.indexOf(item)); me.startEdit(target, record.data[me.dataIndex]); me.activeRecord = record; } else if (me.editing) { me.field.blur(); e.preventDefault(); } }, onSave: function(ed, value) { this.activeRecord.set(this.dataIndex, value); } }); Ext.define('Ext.ux.form.field.BoxSelect', { extend:'Ext.form.field.ComboBox', alias: ['widget.comboboxselect', 'widget.boxselect'], requires: ['Ext.selection.Model', 'Ext.data.Store'], multiSelect: true, forceSelection: true, selectOnFocus: true, triggerOnClick: true, createNewOnEnter: false, createNewOnBlur: false, encodeSubmitValue: false, stacked: false, pinList: true, grow: true, growMin: false, growMax: false, componentLayout: 'boxselectfield', initComponent: function() { var me = this, typeAhead = me.typeAhead; if (typeAhead && !me.editable) { Ext.Error.raise('If typeAhead is enabled the combo must be editable: true -- please change one of those settings.'); } Ext.apply(me, { typeAhead: false }); me.callParent(arguments); me.typeAhead = typeAhead; me.selectionModel = new Ext.selection.Model({ store: me.valueStore, mode: 'MULTI', onSelectChange: function(record, isSelected, suppressEvent, commitFn) { commitFn(); } }); if (!Ext.isEmpty(me.delimiter) && me.multiSelect) { me.delimiterEndingRegexp = new RegExp(String(me.delimiter).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$"); } }, initEvents: function() { var me = this; me.callParent(arguments); if (!me.enableKeyEvents) { me.mon(me.inputEl, 'keydown', me.onKeyDown, me); } me.mon(me.itemList, 'click', me.onItemListClick, me); me.mon(me.selectionModel, 'selectionchange', me.applyMultiselectItemMarkup, me); }, bindStore: function(store, initial) { var me = this; if (me.oldStore) { me.mun(me.store, 'beforeload', me.onBeforeLoad, me); if (me.valueStore) { me.mun(me.valueStore, 'datachanged', me.applyMultiselectItemMarkup, me); me.valueStore = null; } me.oldStore = null; } me.oldStore = true; me.callParent(arguments); if (me.store) { if(me.valueStore) { me.valueStore = Ext.StoreManager.get(me.valueStore); } else { me.valueStore = new Ext.data.Store({ model: me.store.model, proxy: { type: 'memory' } }); } me.mon(me.valueStore, 'datachanged', me.applyMultiselectItemMarkup, me); me.mon(me.store, 'beforeload', me.onBeforeLoad, me); } }, createPicker: function() { var me = this, picker = me.callParent(arguments); me.mon(picker, { 'beforerefresh': me.onBeforeListRefresh, 'show': function(pick) { var listEl = picker.listEl, ch = listEl.getHeight(); if (ch > picker.maxHeight) { listEl.setHeight(picker.maxHeight); } }, scope: me }); return picker; }, onDestroy: function() { var me = this; Ext.destroyMembers(me, 'selectionModel', 'valueStore'); me.callParent(arguments); }, afterRender: function() { var me = this; if (Ext.supports.Placeholder && me.inputEl && me.emptyText) { delete me.inputEl.dom.placeholder; } if (me.stacked === true) { me.itemList.addCls('x-boxselect-stacked'); } if (me.grow) { if (Ext.isNumber(me.growMin) && (me.growMin > 0)) { me.itemList.applyStyles('min-height:'+me.growMin+'px'); } if (Ext.isNumber(me.growMax) && (me.growMax > 0)) { me.itemList.applyStyles('max-height:'+me.growMax+'px'); } } me.applyMultiselectItemMarkup(); me.callParent(arguments); }, findRecord: function(field, value) { var ds = this.store, rec = false, idx; if (ds.snapshot) { idx = ds.snapshot.findIndexBy(function(rec) { return rec.get(field) === value; }); rec = (idx !== -1) ? ds.snapshot.getAt(idx) : false; } else { idx = ds.findExact(field, value); rec = (idx !== -1) ? ds.getAt(idx) : false; } return rec; }, onBeforeLoad: function() { this.ignoreSelection++; }, onLoad: function() { var me = this, valueField = me.valueField, valueStore = me.valueStore, changed = false; if (valueStore) { if (!Ext.isEmpty(me.value) && (valueStore.getCount() == 0)) { me.setValue(me.value, false, true); } valueStore.suspendEvents(); valueStore.each(function(rec) { var r = me.findRecord(valueField, rec.get(valueField)), i = r ? valueStore.indexOf(rec) : -1; if (i >= 0) { valueStore.removeAt(i); valueStore.insert(i, r); changed = true; } }); valueStore.resumeEvents(); if (changed) { valueStore.fireEvent('datachanged', valueStore); } } me.callParent(arguments); me.ignoreSelection = Ext.Number.constrain(me.ignoreSelection - 1, 0); me.alignPicker(); }, isFilteredRecord: function(record) { var me = this, store = me.store, valueField = me.valueField, storeRecord, filtered = false; storeRecord = store.findExact(valueField, record.get(valueField)); filtered = ((storeRecord === -1) && (!store.snapshot || (me.findRecord(valueField, record.get(valueField)) !== false))); filtered = filtered || (!filtered && (storeRecord === -1) && (me.forceSelection !== true) && (me.valueStore.findExact(valueField, record.get(valueField)) >= 0)); return filtered; }, doRawQuery: function() { var me = this, rawValue = me.inputEl.dom.value; if (me.multiSelect) { rawValue = rawValue.split(me.delimiter).pop(); } this.doQuery(rawValue, false, true); }, onBeforeListRefresh: function() { this.ignoreSelection++; }, onListRefresh: function() { this.callParent(arguments); this.ignoreSelection = Ext.Number.constrain(this.ignoreSelection - 1, 0); }, onListSelectionChange: function(list, selectedRecords) { var me = this, valueStore = me.valueStore, mergedRecords = [], i; if ((me.ignoreSelection <= 0) && me.isExpanded) { valueStore.each(function(rec) { if (Ext.Array.contains(selectedRecords, rec) || me.isFilteredRecord(rec)) { mergedRecords.push(rec); } }); mergedRecords = Ext.Array.merge(mergedRecords, selectedRecords); i = Ext.Array.intersect(mergedRecords, valueStore.getRange()).length; if ((i != mergedRecords.length) || (i != me.valueStore.getCount())) { me.setValue(mergedRecords, false); if (!me.multiSelect || !me.pinList) { Ext.defer(me.collapse, 1, me); } if (valueStore.getCount() > 0) { me.fireEvent('select', me, valueStore.getRange()); } } me.inputEl.focus(); if (!me.pinList) { me.inputEl.dom.value = ''; } if (me.selectOnFocus) { me.inputEl.dom.select(); } } }, syncSelection: function() { var me = this, picker = me.picker, valueField = me.valueField, pickStore, selection, selModel; if (picker) { pickStore = picker.store; selection = []; if (me.valueStore) { me.valueStore.each(function(rec) { var i = pickStore.findExact(valueField, rec.get(valueField)); if (i >= 0) { selection.push(pickStore.getAt(i)); } }); } me.ignoreSelection++; selModel = picker.getSelectionModel(); selModel.deselectAll(); if (selection.length > 0) { selModel.select(selection); } me.ignoreSelection = Ext.Number.constrain(me.ignoreSelection - 1, 0); } }, alignPicker: function() { var me = this, picker, isAbove, aboveSfx = '-above'; if(me.itemList) { var itemBox = me.itemList.getBox(false, true); } if (this.isExpanded) { picker = me.getPicker(); var pickerScrollPos = picker.getTargetEl().dom.scrollTop; if (me.matchFieldWidth) { picker.setSize(itemBox.width, picker.store && picker.store.getCount() ? null : 0); } if (picker.isFloating()) { picker.alignTo(me.itemList, me.pickerAlign, me.pickerOffset); isAbove = picker.el.getY() < me.inputEl.getY(); me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls + aboveSfx); picker.el[isAbove ? 'addCls' : 'removeCls'](picker.baseCls + aboveSfx); } } }, getCursorPosition: function() { var cursorPos; if (Ext.isIE) { cursorPos = document.selection.createRange(); cursorPos.collapse(true); cursorPos.moveStart("character", -this.inputEl.dom.value.length); cursorPos = cursorPos.text.length; } else { cursorPos = this.inputEl.dom.selectionStart; } return cursorPos; }, hasSelectedText: function() { var sel, range; if (Ext.isIE) { sel = document.selection; range = sel.createRange(); return (range.parentElement() == this.inputEl.dom); } else { return this.inputEl.dom.selectionStart != this.inputEl.dom.selectionEnd; } }, onKeyDown: function(e, t) { var me = this, key = e.getKey(), rawValue = me.inputEl.dom.value, valueStore = me.valueStore, selModel = me.selectionModel, stopEvent = false, rec, i; if (me.readOnly || me.disabled || !me.editable) { return; } if ((valueStore.getCount() > 0) && ((rawValue == '') || ((me.getCursorPosition() === 0) && !me.hasSelectedText()))) { if ((key == e.BACKSPACE) || (key == e.DELETE)) { if (selModel.getCount() > 0) { me.valueStore.remove(selModel.getSelection()); } else { me.valueStore.remove(me.valueStore.last()); } me.setValue(me.valueStore.getRange()); selModel.deselectAll(); stopEvent = true; } else if ((key == e.RIGHT) || (key == e.LEFT)) { if ((selModel.getCount() === 0) && (key == e.LEFT)) { selModel.select(valueStore.last()); stopEvent = true; } else if (selModel.getCount() > 0) { rec = selModel.getLastFocused() || selModel.getLastSelected(); if (rec) { i = valueStore.indexOf(rec); if (key == e.RIGHT) { if (i < (valueStore.getCount() - 1)) { selModel.select(i + 1, e.shiftKey); stopEvent = true; } else if (!e.shiftKey) { selModel.deselect(rec); stopEvent = true; } } else if ((key == e.LEFT) && (i > 0)) { selModel.select(i - 1, e.shiftKey); stopEvent = true; } } } } else if (key == e.A && e.ctrlKey) { selModel.selectAll(); stopEvent = e.A; } me.inputEl.focus(); } if (stopEvent) { me.preventKeyUpEvent = stopEvent; e.stopEvent(); return; } if (me.isExpanded && (key == e.ENTER) && me.picker.highlightedItem) { me.preventKeyUpEvent = true; } if (me.enableKeyEvents) { me.callParent(arguments); } if (!e.isSpecialKey() && !e.hasModifier()) { me.selectionModel.deselectAll(); me.inputEl.focus(); } }, onKeyUp: function(e, t) { var me = this, rawValue = me.inputEl.dom.value, rec; if (me.preventKeyUpEvent) { e.stopEvent(); if ((me.preventKeyUpEvent === true) || (e.getKey() === me.preventKeyUpEvent)) { delete me.preventKeyUpEvent; } return; } if (me.multiSelect && (me.delimiterEndingRegexp && me.delimiterEndingRegexp.test(rawValue)) || ((me.createNewOnEnter === true) && e.getKey() == e.ENTER)) { rawValue = rawValue.replace(me.delimiterEndingRegexp, ''); if (!Ext.isEmpty(rawValue)) { rec = me.valueStore.findExact(me.valueField, rawValue); if (rec >= 0) { rec = me.valueStore.getAt(rec); } else { rec = me.store.findExact(me.valueField, rawValue); if (rec >= 0) { rec = me.store.getAt(rec); } else { rec = false; } } if (!rec && !me.forceSelection) { rec = {}; rec[me.valueField] = rawValue; rec[me.displayField] = rawValue; rec = new me.valueStore.model(rec); } if (rec) { me.collapse(); me.setValue(me.valueStore.getRange().concat(rec)); me.inputEl.dom.value = ''; me.inputEl.focus(); } } } me.callParent([e,t]); Ext.Function.defer(me.alignPicker, 10, me); }, onTypeAhead: function() { var me = this, displayField = me.displayField, inputElDom = me.inputEl.dom, record = me.store.findRecord(displayField, inputElDom.value), boundList = me.getPicker(), newValue, len, selStart; if (record) { newValue = record.get(displayField); len = newValue.length; selStart = inputElDom.value.length; boundList.highlightItem(boundList.getNode(record)); if (selStart !== 0 && selStart !== len) { inputElDom.value = newValue; me.selectText(selStart, newValue.length); } } }, onItemListClick: function(evt, el, o) { var me = this, itemEl = evt.getTarget('.x-boxselect-item'), closeEl = itemEl ? evt.getTarget('.x-boxselect-item-close') : false; if (me.readOnly || me.disabled) { return; } evt.stopPropagation(); if (itemEl) { if (closeEl) { me.removeByListItemNode(itemEl); } else { me.toggleSelectionByListItemNode(itemEl, evt.shiftKey); } me.inputEl.focus(); } else if (me.triggerOnClick) { me.onTriggerClick(); } }, getMultiSelectItemMarkup: function() { var me = this; if (!me.multiSelectItemTpl) { if (!me.labelTpl) { me.labelTpl = Ext.create('Ext.XTemplate', '{[values.' + me.displayField + ']}' ); } else if (Ext.isString(me.labelTpl)) { me.labelTpl = Ext.create('Ext.XTemplate', me.labelTpl); } me.multiSelectItemTpl = [ '', '
  • ', ' selected', '', '" qtip="{[typeof values === "string" ? values : values.' + me.displayField + ']}">' , '
    {[typeof values === "string" ? values : this.getItemLabel(values)]}
    ', '
    ' , '
  • ' , '
    ', { compile: true, disableFormats: true, isSelected: function(value) { var i = me.valueStore.findExact(me.valueField, value); if (i >= 0) { return me.selectionModel.isSelected(me.valueStore.getAt(i)); } }, getItemLabel: function(values) { return me.getTpl('labelTpl').apply(values); } } ]; } return this.getTpl('multiSelectItemTpl').apply(Ext.Array.pluck(this.valueStore.getRange(), 'data')); }, applyMultiselectItemMarkup: function() { var me = this, itemList = me.itemList, item; if (itemList) { while ((item = me.inputElCt.prev()) != null) { item.remove(); } me.inputElCt.insertHtml('beforeBegin', me.getMultiSelectItemMarkup()); } }, getRecordByListItemNode: function(itemEl) { var me = this, itemIdx = 0, searchEl = me.itemList.dom.firstChild; while (searchEl && searchEl.nextSibling) { if (searchEl == itemEl) { break; } itemIdx++; searchEl = searchEl.nextSibling; } itemIdx = (searchEl == itemEl) ? itemIdx : false; if (itemIdx === false) { return false; } return me.valueStore.getAt(itemIdx); }, toggleSelectionByListItemNode: function(itemEl, keepExisting) { var me = this, rec = me.getRecordByListItemNode(itemEl); if (rec) { if (me.selectionModel.isSelected(rec)) { me.selectionModel.deselect(rec); } else { me.selectionModel.select(rec, keepExisting); } } }, removeByListItemNode: function(itemEl) { var me = this, rec = me.getRecordByListItemNode(itemEl); if (rec) { me.valueStore.remove(rec); me.setValue(me.valueStore.getRange()); } }, getRawValue: function() { var me = this, inputEl = me.inputEl, result; me.inputEl = false; result = me.callParent(arguments); me.inputEl = inputEl; return result; }, setRawValue: function(value) { var me = this, inputEl = me.inputEl, result; me.inputEl = false; result = me.callParent([value]); me.inputEl = inputEl; return result; }, addValue: function(valueMixed) { var me = this; if (valueMixed) { me.setValue(Ext.Array.merge(me.value, Ext.Array.from(valueMixed))); } }, removeValue: function(valueMixed) { var me = this; if (valueMixed) { me.setValue(Ext.Array.difference(me.value, Ext.Array.from(valueMixed))); } }, setValue: function(value, doSelect, skipLoad) { var me = this, valueStore = me.valueStore, valueField = me.valueField, record, len, i, valueRecord, h, unknownValues = []; if (Ext.isEmpty(value)) { value = null; } if (Ext.isString(value) && me.multiSelect) { value = value.split(me.delimiter); } value = Ext.Array.from(value); for (i = 0, len = value.length; i < len; i++) { record = value[i]; if (!record || !record.isModel) { valueRecord = valueStore.findExact(valueField, record); if (valueRecord >= 0) { value[i] = valueStore.getAt(valueRecord); } else { valueRecord = me.findRecord(valueField, record); if (!valueRecord) { if (me.forceSelection) { unknownValues.push(record); } else { valueRecord = {}; valueRecord[me.valueField] = record; valueRecord[me.displayField] = record; valueRecord = new me.valueStore.model(valueRecord); } } if (valueRecord) { value[i] = valueRecord; } } } } if ((skipLoad !== true) && (unknownValues.length > 0) && (me.queryMode === 'remote')) { var params = {}; params[me.valueField] = unknownValues.join(me.delimiter); me.store.load({ params: params, callback: function() { if(me.itemList) { me.itemList.unmask(); } me.setValue(value, doSelect, true); me.autoSize(); } }); return false; } if (!me.multiSelect && (value.length > 0)) { value = value[value.length - 1]; } me.callParent([value, doSelect]); }, getValueRecords: function() { return this.valueStore.getRange(); }, getSubmitData: function() { var me = this, val = me.callParent(arguments); if (me.multiSelect && me.encodeSubmitValue && val && val[me.name]) { val[me.name] = Ext.encode(val[me.name]); } return val; }, beforeBlur: function() { var me = this; me.doQueryTask.cancel(); me.assertValue(); me.collapse(); }, mimicBlur: function() { var me = this; if (me.selectOnTab && me.picker && me.picker.highlightedItem) { me.inputEl.dom.value = ''; } me.callParent(arguments); }, assertValue: function() { var me = this, rawValue = me.inputEl.dom.value, rec = !Ext.isEmpty(rawValue) ? me.findRecordByDisplay(rawValue) : false, value = false; if (!rec && !me.forceSelection && me.createNewOnBlur && !Ext.isEmpty(rawValue)) { value = rawValue; } else if (rec) { value = rec; } if (value) { me.addValue(value); } me.inputEl.dom.value = ''; me.collapse(); }, checkChange: function() { if (!this.suspendCheckChange && !this.isDestroyed) { var me = this, valueStore = me.valueStore, lastValue = me.lastValue, valueField = me.valueField, newValue = Ext.Array.map(Ext.Array.from(me.value), function(val) { if (val.isModel) { return val.get(valueField); } return val; }, this).join(this.delimiter); if (!me.isEqual(newValue, lastValue)) { valueStore.suspendEvents(); valueStore.removeAll(); if (Ext.isArray(me.valueModels)) { valueStore.add(me.valueModels); } valueStore.resumeEvents(); valueStore.fireEvent('datachanged', valueStore); me.lastValue = newValue; me.fireEvent('change', me, newValue, lastValue); me.onChange(newValue, lastValue) } } }, applyEmptyText : function() { var me = this, emptyText = me.emptyText, inputEl, isEmpty; if (me.rendered && emptyText) { isEmpty = Ext.isEmpty(me.value) && !me.hasFocus; inputEl = me.inputEl; if (isEmpty) { inputEl.dom.value = emptyText; inputEl.addCls(me.emptyCls); } else { if (inputEl.dom.value === emptyText) { inputEl.dom.value = ''; } inputEl.removeCls(me.emptyCls); } } }, preFocus : function(){ var me = this, inputEl = me.inputEl, emptyText = me.emptyText, isEmpty; if (emptyText && inputEl.dom.value === emptyText) { inputEl.dom.value = ''; isEmpty = true; inputEl.removeCls(me.emptyCls); } if (me.selectOnFocus || isEmpty) { inputEl.dom.select(); } }, onFocus: function() { var me = this, focusCls = me.focusCls, itemList = me.itemList; if (focusCls && itemList) { itemList.addCls(focusCls); } me.callParent(arguments); }, onBlur: function() { var me = this, focusCls = me.focusCls, itemList = me.itemList; if (focusCls && itemList) { itemList.removeCls(focusCls); } me.callParent(arguments); }, renderActiveError: function() { var me = this, invalidCls = me.invalidCls, itemList = me.itemList, hasError = me.hasActiveError(); if (invalidCls && itemList) { itemList[hasError ? 'addCls' : 'removeCls'](me.invalidCls + '-field'); } me.callParent(arguments); }, autoSize: function() { var me = this, height; if (me.rendered) { me.doComponentLayout(); if (me.grow) { height = me.getHeight(); if (height !== me.lastInputHeight) { me.alignPicker(); me.fireEvent('autosize', height); me.lastInputHeight = height; } } } return me; } }, function() { var useNewSelectors = !Ext.getVersion('extjs').isLessThan('4.0.5'), overrides = {}; if (useNewSelectors) { Ext.apply(overrides, { fieldSubTpl: [ '
    ', '', '', '', '
    ', { compiled: true, disableFormats: true } ], childEls: ['itemList', 'inputEl', 'inputElCt'] }); } else { Ext.apply(overrides, { fieldSubTpl: [ '
    ', '', '', '
    ', { compiled: true, disableFormats: true } ], renderSelectors: { itemList: 'ul.x-boxselect-list', inputEl: 'input.x-boxselect-input-field', inputElCt: 'li.x-boxselect-input' } }); } Ext.override(this, overrides); }); Ext.define('Ext.ux.layout.component.field.BoxSelectField', { alias: ['layout.boxselectfield'], extend: 'Ext.layout.component.field.Field', type: 'boxselectfield', beforeLayout: function(width, height) { var me = this, owner = me.owner, lastValue = this.lastValue, value = Ext.encode(owner.value); this.lastValue = value; return me.callParent(arguments) || (owner.grow && value !== lastValue); }, sizeBodyContents: function(width, height) { var me = this, owner = me.owner, triggerWrap = owner.triggerWrap, triggerWidth = owner.getTriggerWidth(), itemList, inputEl, inputElCt, lastEntry, listBox, listWidth, inputWidth; if (owner.hideTrigger || owner.readOnly || triggerWidth > 0) { itemList = owner.itemList; me.setElementSize(itemList, Ext.isNumber(width) ? width - triggerWidth : width, height); triggerWrap.setWidth(triggerWidth); inputEl = owner.inputEl; inputElCt = owner.inputElCt; listBox = itemList.getBox(true, true); listWidth = listBox.width; if ((owner.grow && owner.growMax && (itemList.dom.scrollHeight > (owner.growMax - 25))) || (owner.isFixedHeight() && (itemList.dom.scrollHeight > itemList.dom.clientHeight))) { listWidth = listWidth - Ext.getScrollbarSize().width; } inputWidth = listWidth - 10; lastEntry = inputElCt.dom.previousSibling; if (lastEntry) { inputWidth = inputWidth - (lastEntry.offsetLeft + Ext.fly(lastEntry).getWidth() + Ext.fly(lastEntry).getPadding('lr')); } if (inputWidth < 35) { inputWidth = listWidth - 10; } if (inputWidth >= 0) { me.setElementSize(inputEl, inputWidth); if (owner.hasFocus) { inputElCt.scrollIntoView(itemList); } } } } }); Ext.define('Ext.ux.RowExpander', { extend: 'Ext.AbstractPlugin', requires: [ 'Ext.grid.feature.RowBody', 'Ext.grid.feature.RowWrap' ], alias: 'plugin.rowexpander', rowBodyTpl: null, expandOnEnter: true, expandOnDblClick: true, selectRowOnExpand: false, rowBodyTrSelector: '.x-grid-rowbody-tr', rowBodyHiddenCls: 'x-grid-row-body-hidden', rowCollapsedCls: 'x-grid-row-collapsed', rowsExpanded: new Ext.util.MixedCollection(), renderer: function(value, metadata, record, rowIdx, colIdx) { if (colIdx === 0) { metadata.tdCls = 'x-grid-td-expander'; } return '
     
    '; }, constructor: function() { this.callParent(arguments); var grid = this.getCmp(); this.recordsExpanded = {}; if (!this.rowBodyTpl) { Ext.Error.raise("The 'rowBodyTpl' config is required and is not defined."); } var rowBodyTpl = Ext.create('Ext.XTemplate', this.rowBodyTpl), features = [{ ftype: 'rowbody', columnId: this.getHeaderId(), recordsExpanded: this.recordsExpanded, rowBodyHiddenCls: this.rowBodyHiddenCls, rowCollapsedCls: this.rowCollapsedCls, getAdditionalData: this.getRowBodyFeatureData, getRowBodyContents: function(data) { return rowBodyTpl.applyTemplate(data); } },{ ftype: 'rowwrap' }]; if (grid.features) { grid.features = features.concat(grid.features); } else { grid.features = features; } }, init: function(grid) { this.callParent(arguments); grid.headerCt.insert(0, this.getHeaderConfig()); grid.on('render', this.bindView, this, { single: true }); }, getHeaderId: function() { if (!this.headerId) { this.headerId = Ext.id(); } return this.headerId; }, getRowBodyFeatureData: function(data, idx, record, orig) { var o = Ext.grid.feature.RowBody.prototype.getAdditionalData.apply(this, arguments), id = this.columnId; o.rowBodyColspan = o.rowBodyColspan - 1; o.rowBody = this.getRowBodyContents(data); o.rowCls = this.recordsExpanded[record.internalId] ? '' : this.rowCollapsedCls; o.rowBodyCls = this.recordsExpanded[record.internalId] ? '' : this.rowBodyHiddenCls; o[id + '-tdAttr'] = ' valign="top" rowspan="2" '; if (orig[id+'-tdAttr']) { o[id+'-tdAttr'] += orig[id+'-tdAttr']; } return o; }, bindView: function() { var view = this.getCmp().getView(), viewEl; if (!view.rendered) { view.on('render', this.bindView, this, { single: true }); } else { viewEl = view.getEl(); if (this.expandOnEnter) { this.keyNav = Ext.create('Ext.KeyNav', viewEl, { 'enter' : this.onEnter, scope: this }); } if (this.expandOnDblClick) { view.on('itemdblclick', this.onDblClick, this); } this.view = view; } }, onEnter: function(e) { var view = this.view, ds = view.store, sm = view.getSelectionModel(), sels = sm.getSelection(), ln = sels.length, i = 0, rowIdx; for (; i < ln; i++) { rowIdx = ds.indexOf(sels[i]); this.toggleRow(rowIdx); } }, toggleRow: function(rowIdx) { var rowNode = this.view.getNode(rowIdx), row = Ext.get(rowNode), nextBd = Ext.get(row).down(this.rowBodyTrSelector), record = this.view.getRecord(rowNode), grid = this.getCmp(); if (row.hasCls(this.rowCollapsedCls)) { row.removeCls(this.rowCollapsedCls); nextBd.removeCls(this.rowBodyHiddenCls); this.rowsExpanded.add(rowIdx.id, rowIdx); this.recordsExpanded[record.internalId] = true; this.view.fireEvent('expandbody', rowNode, record, nextBd.dom); } else { row.addCls(this.rowCollapsedCls); nextBd.addCls(this.rowBodyHiddenCls); this.rowsExpanded.removeAtKey(rowIdx.id); this.recordsExpanded[record.internalId] = false; this.view.fireEvent('collapsebody', rowNode, record, nextBd.dom); } }, collapseAll: function() { var me = this; if (me.rowsExpanded.length === 0) { return; } me.rowsExpanded.each(function(item) { var rowNode = me.view.getNode(item), row = Ext.get(rowNode), nextBd = Ext.get(row).down(me.rowBodyTrSelector), record = me.view.getRecord(rowNode); row.addCls(me.rowCollapsedCls); nextBd.addCls(me.rowBodyHiddenCls); if (record !== Ext.undefined) { me.recordsExpanded[record.internalId] = false; me.view.fireEvent('collapsebody', rowNode, record, nextBd.dom); } }); me.rowsExpanded.clear(); }, onDblClick: function(view, cell, rowIdx, cellIndex, e) { this.toggleRow(rowIdx); }, getHeaderConfig: function() { var me = this, toggleRow = Ext.Function.bind(me.toggleRow, me), selectRowOnExpand = me.selectRowOnExpand; return { id: this.getHeaderId(), width: 24, sortable: false, resizable: false, draggable: false, hideable: false, menuDisabled: true, cls: Ext.baseCSSPrefix + 'grid-header-special', renderer: function(value, metadata) { metadata.tdCls = Ext.baseCSSPrefix + 'grid-cell-special'; return '
     
    '; }, processEvent: function(type, view, cell, recordIndex, cellIndex, e) { if (type == "mousedown" && e.getTarget('.x-grid-row-expander')) { var row = e.getTarget('.x-grid-row'); toggleRow(row); return selectRowOnExpand; } } }; } }); Ext.define('Ext.ux.form.MultiSelect', { extend: 'Ext.form.FieldContainer', mixins: { bindable: 'Ext.util.Bindable', field: 'Ext.form.field.Field' }, alternateClassName: 'Ext.ux.Multiselect', alias: ['widget.multiselectfield', 'widget.multiselect'], requires: ['Ext.panel.Panel', 'Ext.view.BoundList'], uses: ['Ext.view.DragZone', 'Ext.view.DropZone'], ddReorder: false, appendOnly: false, displayField: 'text', allowBlank: true, minSelections: 0, layout: 'fit', maxSelections: Number.MAX_VALUE, blankText: 'This field is required', minSelectionsText: 'Minimum {0} item(s) required', maxSelectionsText: 'Minimum {0} item(s) required', delimiter: ',', ignoreSelectChange: 0, initComponent: function(){ var me = this; me.bindStore(me.store, true); if (me.store.autoCreated) { me.valueField = me.displayField = 'field1'; if (!me.store.expanded) { me.displayField = 'field2'; } } if (!Ext.isDefined(me.valueField)) { me.valueField = me.displayField; } Ext.apply(me, me.setupItems()); me.callParent(); me.initField(); me.addEvents('drop'); }, setupItems: function() { var me = this; me.boundList = Ext.create('Ext.view.BoundList', { deferInitialRefresh: false, multiSelect: true, store: me.store, height: me.listHeight, overflowY:'auto', displayField: me.displayField, disabled: me.disabled, border: 0 }); me.boundList.getSelectionModel().on('selectionchange', me.onSelectChange, me); return { tbar: me.tbar, items: [{ xtype: 'panel', dockedItems: me.dockedItems, title: me.listTitle, items: me.boundList }] }; }, onSelectChange: function(selModel, selections){ if (!this.ignoreSelectChange) { this.setValue(selections); } }, getSelected: function(){ return this.boundList.getSelectionModel().getSelection(); }, isEqual: function(v1, v2) { var fromArray = Ext.Array.from, i = 0, len; v1 = fromArray(v1); v2 = fromArray(v2); len = v1.length; if (len !== v2.length) { return false; } for(; i < len; i++) { if (v2[i] !== v1[i]) { return false; } } return true; }, afterRender: function(){ var me = this; me.callParent(); if (me.selectOnRender) { ++me.ignoreSelectChange; me.boundList.getSelectionModel().select(me.getRecordsForValue(me.value)); --me.ignoreSelectChange; delete me.toSelect; } if (me.ddReorder && !me.dragGroup && !me.dropGroup){ me.dragGroup = me.dropGroup = 'MultiselectDD-' + Ext.id(); } if (me.draggable || me.dragGroup){ me.dragZone = Ext.create('Ext.view.DragZone', { view: me.boundList, ddGroup: me.dragGroup, dragText: '{0} Item{1}' }); } if (me.droppable || me.dropGroup){ me.dropZone = Ext.create('Ext.view.DropZone', { view: me.boundList, ddGroup: me.dropGroup, handleNodeDrop: function(data, dropRecord, position) { var view = this.view, store = view.getStore(), records = data.records, index; data.view.store.remove(records); index = store.indexOf(dropRecord); if (position === 'after') { index++; } store.insert(index, records); view.getSelectionModel().select(records); me.fireEvent('drop', me, records); } }); } }, isValid : function() { var me = this, disabled = me.disabled, validate = me.forceValidation || !disabled; return validate ? me.validateValue(me.value) : disabled; }, validateValue: function(value) { var me = this, errors = me.getErrors(value), isValid = Ext.isEmpty(errors); if (!me.preventMark) { if (isValid) { me.clearInvalid(); } else { me.markInvalid(errors); } } return isValid; }, markInvalid : function(errors) { var me = this, oldMsg = me.getActiveError(); me.setActiveErrors(Ext.Array.from(errors)); if (oldMsg !== me.getActiveError()) { me.updateLayout(); } }, clearInvalid : function() { var me = this, hadError = me.hasActiveError(); me.unsetActiveError(); if (hadError) { me.updateLayout(); } }, getSubmitData: function() { var me = this, data = null, val; if (!me.disabled && me.submitValue && !me.isFileUpload()) { val = me.getSubmitValue(); if (val !== null) { data = {}; data[me.getName()] = val; } } return data; }, getSubmitValue: function() { var me = this, delimiter = me.delimiter, val = me.getValue(); return Ext.isString(delimiter) ? val.join(delimiter) : val; }, getValue: function(){ return this.value; }, getRecordsForValue: function(value){ var me = this, records = [], all = me.store.getRange(), valueField = me.valueField, i = 0, allLen = all.length, rec, j, valueLen; for (valueLen = value.length; i < valueLen; ++i) { for (j = 0; j < allLen; ++j) { rec = all[j]; if (rec.get(valueField) == value[i]) { records.push(rec); } } } return records; }, setupValue: function(value){ var delimiter = this.delimiter, valueField = this.valueField, i = 0, out, len, item; if (Ext.isDefined(value)) { if (delimiter && Ext.isString(value)) { value = value.split(delimiter); } else if (!Ext.isArray(value)) { value = [value]; } for (len = value.length; i < len; ++i) { item = value[i]; if (item && item.isModel) { value[i] = item.get(valueField); } } out = Ext.Array.unique(value); } else { out = []; } return out; }, setValue: function(value){ var me = this, selModel = me.boundList.getSelectionModel(); value = me.setupValue(value); me.mixins.field.setValue.call(me, value); if (me.rendered) { ++me.ignoreSelectChange; selModel.deselectAll(); selModel.select(me.getRecordsForValue(value)); --me.ignoreSelectChange; } else { me.selectOnRender = true; } }, clearValue: function(){ this.setValue([]); }, onEnable: function(){ var list = this.boundList; this.callParent(); if (list) { list.enable(); } }, onDisable: function(){ var list = this.boundList; this.callParent(); if (list) { list.disable(); } }, getErrors : function(value) { var me = this, format = Ext.String.format, errors = [], numSelected; value = Ext.Array.from(value || me.getValue()); numSelected = value.length; if (!me.allowBlank && numSelected < 1) { errors.push(me.blankText); } if (numSelected < me.minSelections) { errors.push(format(me.minSelectionsText, me.minSelections)); } if (numSelected > me.maxSelections) { errors.push(format(me.maxSelectionsText, me.maxSelections)); } return errors; }, onDestroy: function(){ var me = this; me.bindStore(null); Ext.destroy(me.dragZone, me.dropZone); me.callParent(); }, onBindStore: function(store){ var boundList = this.boundList; if (boundList) { boundList.bindStore(store); } } }); Ext.define('Ext.ux.form.ItemSelector', { extend: 'Ext.ux.form.MultiSelect', alias: ['widget.itemselectorfield', 'widget.itemselector'], alternateClassName: ['Ext.ux.ItemSelector'], requires: [ 'Ext.button.Button', 'Ext.ux.form.MultiSelect' ], hideNavIcons:false, buttons: ['top', 'up', 'add', 'remove', 'down', 'bottom'], buttonsText: { top: "Move to Top", up: "Move Up", add: "Add to Selected", remove: "Remove from Selected", down: "Move Down", bottom: "Move to Bottom" }, initComponent: function() { var me = this; me.ddGroup = me.id + '-dd'; me.callParent(); me.bindStore(me.store); }, createList: function(){ var me = this; return Ext.create('Ext.ux.form.MultiSelect', { submitValue: false, flex: 1, dragGroup: me.ddGroup, dropGroup: me.ddGroup, store: { model: me.store.model, data: [] }, displayField: me.displayField, disabled: me.disabled, listeners: { boundList: { scope: me, itemdblclick: me.onItemDblClick, drop: me.syncValue } } }); }, setupItems: function() { var me = this; me.fromField = me.createList(); me.toField = me.createList(); return { layout: { type: 'hbox', align: 'stretch' }, items: [ me.fromField, { xtype: 'container', margins: '0 4', width: 22, layout: { type: 'vbox', pack: 'center' }, items: me.createButtons() }, me.toField ] }; }, createButtons: function(){ var me = this, buttons = []; if (!me.hideNavIcons) { Ext.Array.forEach(me.buttons, function(name) { buttons.push({ xtype: 'button', tooltip: me.buttonsText[name], handler: me['on' + Ext.String.capitalize(name) + 'BtnClick'], cls: Ext.baseCSSPrefix + 'form-itemselector-btn', iconCls: Ext.baseCSSPrefix + 'form-itemselector-' + name, navBtn: true, scope: me, margin: '4 0 0 0' }); }); } return buttons; }, getSelections: function(list){ var store = list.getStore(), selections = list.getSelectionModel().getSelection(); return Ext.Array.sort(selections, function(a, b){ a = store.indexOf(a); b = store.indexOf(b); if (a < b) { return -1; } else if (a > b) { return 1; } return 0; }); }, onTopBtnClick : function() { var list = this.toField.boundList, store = list.getStore(), selected = this.getSelections(list); store.suspendEvents(); store.remove(selected, true); store.insert(0, selected); store.resumeEvents(); list.refresh(); this.syncValue(); list.getSelectionModel().select(selected); }, onBottomBtnClick : function() { var list = this.toField.boundList, store = list.getStore(), selected = this.getSelections(list); store.suspendEvents(); store.remove(selected, true); store.add(selected); store.resumeEvents(); list.refresh(); this.syncValue(); list.getSelectionModel().select(selected); }, onUpBtnClick : function() { var list = this.toField.boundList, store = list.getStore(), selected = this.getSelections(list), i = 0, len = selected.length, index = store.getCount(); for (; i < len; ++i) { index = Math.min(index, store.indexOf(selected[i])); } if (index > 0) { store.suspendEvents(); store.remove(selected, true); store.insert(index - 1, selected); store.resumeEvents(); list.refresh(); this.syncValue(); list.getSelectionModel().select(selected); } }, onDownBtnClick : function() { var list = this.toField.boundList, store = list.getStore(), selected = this.getSelections(list), i = 0, len = selected.length, index = 0; for (; i < len; ++i) { index = Math.max(index, store.indexOf(selected[i])); } if (index < store.getCount() - 1) { store.suspendEvents(); store.remove(selected, true); store.insert(index + 2 - len, selected); store.resumeEvents(); list.refresh(); this.syncValue(); list.getSelectionModel().select(selected); } }, onAddBtnClick : function() { var me = this, fromList = me.fromField.boundList, selected = this.getSelections(fromList); fromList.getStore().remove(selected); this.toField.boundList.getStore().add(selected); this.syncValue(); }, onRemoveBtnClick : function() { var me = this, toList = me.toField.boundList, selected = this.getSelections(toList); toList.getStore().remove(selected); this.fromField.boundList.getStore().add(selected); this.syncValue(); }, syncValue: function() { this.setValue(this.toField.store.getRange()); }, onItemDblClick: function(view, rec){ var me = this, from = me.fromField.store, to = me.toField.store, current, destination; if (view === me.fromField.boundList) { current = from; destination = to; } else { current = to; destination = from; } current.remove(rec); destination.add(rec); me.syncValue(); }, setValue: function(value){ var me = this, fromStore = me.fromField.store, toStore = me.toField.store, selected; if (!me.fromField.store.getCount()) { me.fromField.store.on({ load: Ext.Function.bind(me.setValue, me, [value]), single: true }); return; } value = me.setupValue(value); me.mixins.field.setValue.call(me, value); selected = me.getRecordsForValue(value); Ext.Array.forEach(toStore.getRange(), function(rec){ if (!Ext.Array.contains(selected, rec)) { toStore.remove(rec); fromStore.add(rec); } }); toStore.removeAll(); Ext.Array.forEach(selected, function(rec){ if (fromStore.indexOf(rec) > -1) { fromStore.remove(rec); } toStore.add(rec); }); }, onBindStore: function(store, initial) { var me = this; if (me.fromField) { me.fromField.store.removeAll() me.toField.store.removeAll(); if (store.getCount()) { me.populateFromStore(store); } else { me.store.on('load', me.populateFromStore, me); } } }, populateFromStore: function(store) { this.fromField.store.add(store.getRange()); this.fromField.store.fireEvent('load', this.fromField.store); }, onEnable: function(){ var me = this; me.callParent(); me.fromField.enable(); me.toField.enable(); Ext.Array.forEach(me.query('[navBtn]'), function(btn){ btn.enable(); }); }, onDisable: function(){ var me = this; me.callParent(); me.fromField.disable(); me.toField.disable(); Ext.Array.forEach(me.query('[navBtn]'), function(btn){ btn.disable(); }); }, onDestroy: function(){ this.bindStore(null); this.callParent(); } }); Ext.define('Shopware.model.Helper', { getModelName: function (modelName) { return modelName.substr(modelName.lastIndexOf(".") + 1); }, getEventAlias: function (modelClass) { return this.getModelName(modelClass).toLowerCase(); }, hasModelAction: function (model, action) { return (model.proxy && model.proxy.api && model.proxy.api[action]); }, camelCaseToWord: function (word) { var newWord; newWord = word.split(/(?=[A-Z])/).map(function (p) { return p.charAt(0).toLowerCase() + p.slice(1); }).join(' '); return newWord.charAt(0).toUpperCase() + newWord.slice(1); }, getHumanReadableWord: function(word) { word = this.camelCaseToWord(word); word = word.replace(' id', ''); return word; }, getAssociations: function (className, conditions) { var me = this, associations = [], model = Ext.create(className); conditions = conditions || []; if (model.associations.lenght <= 0) { return associations; } Ext.each(model.associations.items, function (association) { if (me.matchAssociationConditions(association, conditions)) { associations.push(association); } }); return associations; }, getAssociationStore: function (record, association) { var store; store = record[association.storeName]; if (!(store instanceof Ext.data.Store)) { store = Ext.create('Ext.data.Store', { model: association.associatedName }); record[association.storeName] = store; } return store; }, matchAssociationConditions: function (association, conditions) { var associationInstance = Ext.create(association.associatedName), match = false; if (conditions && conditions.length <= 0) { match = true; } Ext.each(conditions, function (condition) { if (condition.associationKey && !Ext.Array.contains(condition.associationKey, association.associationKey)) { return true; } if (condition.relation && condition.relation.toLowerCase() !== association.relation.toLowerCase()) { return true; } if (condition.hasAssociations === true && associationInstance.associations.length <= 0) { return true; } if (condition.hasAssociations === false && associationInstance.associations.length > 0) { return true; } if (condition.associationTypes && associationInstance.association.length <= 0) { return true; } if (condition.associationTypes) { var typeMatch = false; Ext.each(associationInstance.associations.items, function (item) { Ext.each(condition.associationTypes, function (type) { if (type.toLowerCase() === item.relation.toLowerCase()) { typeMatch = true; } }); }); if (typeMatch === false) { return true; } } match = true; return false; //cancel foreach }); return match; }, applyIntegerColumnConfig: function (column) { column.xtype = 'numbercolumn'; column.renderer = this.integerColumnRenderer; column.align = 'right'; column.editor = this.applyIntegerFieldConfig({}); return column; }, applyStringColumnConfig: function (column) { column.editor = this.applyStringFieldConfig({}); return column; }, applyBooleanColumnConfig: function (column) { column.xtype = 'booleancolumn'; column.renderer = this.booleanColumnRenderer; column.editor = this.applyBooleanFieldConfig({}); return column; }, applyDateColumnConfig: function (column, format) { column.xtype = 'datecolumn'; if (format) { column.format = format; } column.editor = this.applyDateFieldConfig({}); return column; }, applyFloatColumnConfig: function (column) { column.xtype = 'numbercolumn'; column.align = 'right'; column.editor = this.applyFloatFieldConfig({}); return column; }, booleanColumnRenderer: function (value) { var checked = 'sprite-ui-check-box-uncheck'; if (value === true) { checked = 'sprite-ui-check-box'; } return ''; }, integerColumnRenderer: function (value) { return Ext.util.Format.number(value, '0'); }, applyIntegerFieldConfig: function (field) { field.xtype = 'numberfield'; field.align = 'right'; return field; }, applyStringFieldConfig: function (field) { field.xtype = 'textfield'; return field; }, applyBooleanFieldConfig: function (field) { field.xtype = 'checkbox'; field.uncheckedValue = false; field.inputValue = true; return field; }, applyDateFieldConfig: function (field) { field.xtype = 'datefield'; return field; }, applyFloatFieldConfig: function (field) { field.xtype = 'numberfield'; field.align = 'right'; return field; }, getComponentTypeOfAssociation: function(association) { switch (association.relation.toLowerCase()) { case 'onetoone': return 'detail'; case 'onetomany': return 'listing'; case 'manytomany': return 'related'; case 'manytoone': return 'field'; } return false; }, createAssociationSearchStore: function (model, associationKey, searchUrl) { return Ext.create('Ext.data.Store', { model: model, proxy: { type: 'ajax', url: searchUrl, reader: { type: 'json', root: 'data', totalProperty: 'total' }, extraParams: { association: associationKey } } }); }, getFieldByName: function(fields, name) { var result = undefined; Ext.each(fields, function(field) { if (field.name == name) { result = field; return false; } }); return result; }, throwException: function(message, title) { title = title || "Shopware configuration error"; throw { name: title, message: message, toString: function() { return this.name + ": " + this.message } }; }, isLazyLoadingComponent: function(component) { var me = this; if (!(component.association)) { return false; } if (!(component.association.lazyLoading)) { return false; } if (typeof component.getStore !== 'function') { return false; } if (component.getStore().getCount() > 0) { return false; } return (component.getStore() instanceof Shopware.store.Association) || (me.hasModelAction(component.getStore(), 'read') !== undefined); } }); Ext.define('Shopware.grid.Controller', { extend: 'Ext.app.Controller', mixins: { helper: 'Shopware.model.Helper' }, statics: { displayConfig: { gridClass: undefined, eventAlias: undefined, deleteConfirmTitle: 'Einträge löschen', deleteConfirmText: 'Sind Sie sicher, dass Sie die markierten Einträge löschen möchen?', deleteInfoText: 'Die Einträge werden gelöscht.
    Um den Prozess abzubrechen, können Sie den `Cancel process` Button verwenden. Abhänging von der Datenmenge kann dieser Prozess einige Minuten in Anspruch nehmen.', deleteProgressBarText: 'Eintrag [0] von [1]' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, init: function () { var me = this; Shopware.app.Application.fireEvent(me.getEventName('before-init'), me); if (me.$className !== 'Shopware.grid.Controller') { me.checkRequirements(); } if (me.getConfig('eventAlias') && me.getConfig('gridClass')) { me.control(me.createControls()); me.registerEvents(); } Shopware.app.Application.fireEvent(me.getEventName('after-init'), me); me.callParent(arguments); }, checkRequirements: function() { var me = this; if (!me.getConfig('eventAlias')) { me.throwException(me.$className + ": Component requires the `eventAlias` property in the configure() function"); } if (!me.getConfig('gridClass')) { me.throwException(me.$className + ": Component requires the `gridClass` property in the configure() function"); } }, reloadControls: function() { var me = this; me.checkRequirements(); me.control(me.createControls()); me.registerEvents(); }, registerEvents: function() { var me = this; this.addEvents( me.getEventName('before-open-delete-window'), me.getEventName('batch-delete-exception'), me.getEventName('batch-delete-success'), me.getEventName('after-selection-changed'), me.getEventName('before-add-item'), me.getEventName('before-search'), me.getEventName('before-page-size-changed'), me.getEventName('before-edit-item'), me.getEventName('before-create-detail-window'), me.getEventName('after-create-detail-window'), me.getEventName('after-init'), me.getEventName('after-create-controls'), me.getEventName('after-create-listing-window-controls'), me.getEventName('before-delete-items'), me.getEventName('after-add-item'), me.getEventName('after-search'), me.getEventName('after-page-size-changed'), me.getEventName('after-edit-item') ); }, createControls: function () { var me = this, alias, controls = {}, events = {}; alias = Ext.ClassManager.getAliasesByName(me.getConfig('gridClass')); alias = alias[0]; alias = alias.replace('widget.', ''); controls[alias] = me.createListingWindowControls(); events[me.getConfig('eventAlias') + '-batch-delete-item'] = me.onBatchDeleteItem; controls['shopware-progress-window'] = events; Shopware.app.Application.fireEvent(me.getEventName('after-create-controls'), me, controls); return controls; }, createListingWindowControls: function () { var me = this, events = {}, alias; alias = me.getConfig('eventAlias'); events[alias + '-selection-changed'] = me.onSelectionChanged; events[alias + '-add-item'] = me.onAddItem; events[alias + '-delete-item'] = me.onDeleteItem; events[alias + '-delete-items'] = me.onDeleteItems; events[alias + '-edit-item'] = me.onEditItem; events[alias + '-search'] = me.onSearch; events[alias + '-change-page-size'] = me.onChangePageSize; Shopware.app.Application.fireEvent(me.getEventName('after-create-listing-window-controls'), me, events, alias); return events; }, onDeleteItems: function (grid, records, button) { var me = this, window, text = me.getConfig('deleteConfirmText'), title = me.getConfig('deleteConfirmTitle'); if (!Shopware.app.Application.fireEvent('before-delete-items', me, records, grid, title, text)) { return false; } Ext.MessageBox.confirm(title, text, function (response) { if (response !== 'yes') { return false; } if (!me.hasModelAction(records[0], 'destroy')) { grid.getStore().remove(records); return true; } window = Ext.create('Shopware.window.Progress', { configure: function() { return { infoText: me.getConfig('deleteInfoText'), subApp: me.subApplication, tasks: [ { text: me.getConfig('deleteProgressBarText'), event: me.getConfig('eventAlias') + '-batch-delete-item', totalCount: records.length, data: records } ] }; } }); if (!Shopware.app.Application.fireEvent(me.getEventName('before-open-delete-window'), me, window, grid, records)) { return false; } window.on('process-done', function() { grid.getStore().load(); }, me, { single: true }); window.show(); }); }, onDeleteItem: function (grid, record) { var me = this; me.onDeleteItems(grid, [ record ], null); }, onBatchDeleteItem: function (task, record, callback) { var me = this, proxy = record.getProxy(), data; callback = callback || Ext.emptyFn; proxy.on('exception', function (proxy, response, operation) { data = Ext.decode(response.responseText); operation.setException(data.error); if (!Shopware.app.Application.fireEvent(me.getEventName('batch-delete-exception'), me, record, task, response, operation)) { return false; } callback(response, operation); }, me, { single: true }); record.destroy({ success: function (result, operation) { if (!Shopware.app.Application.fireEvent(me.getEventName('batch-delete-success'), me, record, task, result, operation)) { return false; } callback(result, operation); } }); }, onSelectionChanged: function (grid, selModel, selection) { var me = this; if (!(grid instanceof Ext.grid.Panel)) { return false; } if (!grid.deleteButton) { return false; } grid.deleteButton.setDisabled(selection.length <= 0); return Shopware.app.Application.fireEvent(me.getEventName('after-selection-changed'), me, grid, selModel, selection); }, onAddItem: function (listing) { var me = this, record, store = listing.getStore(), window; record = Ext.create(store.model); if (!Shopware.app.Application.fireEvent(me.getEventName('before-add-item'), me, listing, record)) { return false; } me.checkRequirements(); window = me.createDetailWindow( record, listing.getConfig('detailWindow') ); Shopware.app.Application.on(window.eventAlias + '-save-successfully', function() { listing.getStore().load(); }, me); Shopware.app.Application.fireEvent(me.getEventName('after-add-item'), me, window, record, listing); return window; }, onSearch: function (grid, searchField, value) { var me = this, store = grid.getStore(); value = Ext.String.trim(value); store.filters.clear(); store.currentPage = 1; if (!Shopware.app.Application.fireEvent(me.getEventName('before-search'), me, grid, store, searchField, value)) { return false; } store.on('load', function() { Shopware.app.Application.fireEvent(me.getEventName('after-search'), me, grid, store, searchField, value); }, me, { single: true }); if (value.length > 0) { store.filter({ property: 'search', value: value }); } else { store.load(); } return true }, onChangePageSize: function (grid, combo, records) { var me = this, store = grid.getStore(); if (!Shopware.app.Application.fireEvent(me.getEventName('before-page-size-changed'), me, grid, combo, records)) { return false; } if (combo.getValue() > 0) { store.pageSize = combo.getValue(); store.currentPage = 1; store.load(); } return Shopware.app.Application.fireEvent(me.getEventName('after-page-size-changed'), me, grid, combo, records); }, onEditItem: function (listing, record) { var me = this, window; if (!(record instanceof Ext.data.Model)) { return false; } if (!Shopware.app.Application.fireEvent(me.getEventName('before-edit-item'), me, listing, record)) { return false; } me.checkRequirements(); if (me.hasModelAction(record, 'detail')) { record.reload({ callback: function (result) { window = me.createDetailWindow( result, listing.getConfig('detailWindow') ); Shopware.app.Application.on(window.eventAlias + '-save-successfully', function() { listing.getStore().load(); }, me, { single: true }); Shopware.app.Application.fireEvent(me.getEventName('after-edit-item'), me, window, listing, record); } }); return true; } else { window = me.createDetailWindow( record, listing.getConfig('detailWindow') ); Shopware.app.Application.on(window.eventAlias + '-save-successfully', function() { listing.getStore().load(); }, me, { single: true }); Shopware.app.Application.fireEvent(me.getEventName('after-edit-item'), me, window, listing, record); return true; } }, createDetailWindow: function (record, detailWindowClass) { var me = this, window; if (!detailWindowClass) { return false; } if (!Shopware.app.Application.fireEvent(me.getEventName('before-create-detail-window'), me, record)) { return false; } window = me.getView(detailWindowClass).create({ record: record }); if (!Shopware.app.Application.fireEvent(me.getEventName('after-create-detail-window'), me, record, window)) { return false; } if (window) { window.show(); } return window; }, getEventName: function (name) { return this.getConfig('eventAlias') + '-' + name; } }); Ext.define('Shopware.grid.Panel', { extend: 'Ext.grid.Panel', alias: 'widget.shopware-grid-panel', mixins: { helper: 'Shopware.model.Helper' }, toolbar: undefined, addButton: undefined, deleteButton: undefined, searchField: undefined, pageSizeCombo: undefined, pagingbar: undefined, controller: undefined, model: undefined, eventAlias: undefined, statics: { displayConfig: { detailWindow: undefined, eventAlias: undefined, hasOwnController: false, toolbar: true, addButton: true, deleteButton: true, searchField: true, pagingbar: true, pageSize: true, actionColumn: true, editColumn: true, deleteColumn: true, rowNumbers: false, rowEditing: false, columns: { }, pageSizeLabel: 'Einträge pro Seite', addButtonText: 'Hinzufügen', deleteButtonText: 'Markierte Einträge löschen', searchFieldText: 'Suche ...' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; val = val || ''; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, initComponent: function () { var me = this; me.checkRequirements(); me.model = me.store.model; me.eventAlias = me.getConfig('eventAlias'); if (!me.eventAlias) me.eventAlias = me.getEventAlias(me.model.$className); me.fieldAssociations = me.getAssociations(me.model.$className, [ { relation: 'ManyToOne' } ]); me.registerEvents(); me.fireEvent(me.eventAlias + '-before-init-component', me); me.columns = me.createColumns(); me.plugins = me.createPlugins(); me.features = me.createFeatures(); me.selModel = me.createSelectionModel(); me.dockedItems = me.createDockedItems(); if (me.getConfig('hasOwnController') === false) { me.createDefaultController(); } me.fireEvent(me.eventAlias + '-after-init-component', me); me.callParent(arguments); }, checkRequirements: function() { var me = this; if (!(me.store instanceof Ext.data.Store)) { me.throwException(me.$className + ": Component requires a configured store, which has to been passed in the class constructor."); } if (me.alias.length <= 0) { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (me.alias.length === 1 && me.alias[0] === 'widget.shopware-grid-panel') { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } }, createDefaultController: function () { var me = this; me.controller = me.subApp.getController('Shopware.grid.Controller'); me.controller._opts.gridClass = me.$className; me.controller._opts.eventAlias = me.eventAlias; me.controller.reloadControls(); return me.controller; }, registerEvents: function () { var me = this; this.addEvents( me.eventAlias + '-selection-changed', me.eventAlias + '-add-item', me.eventAlias + '-delete-item', me.eventAlias + '-delete-items', me.eventAlias + '-edit-item', me.eventAlias + '-search', me.eventAlias + '-change-page-size', me.eventAlias + '-before-init-component', me.eventAlias + '-after-init-component', me.eventAlias + '-before-create-columns', me.eventAlias + '-before-create-action-columns', me.eventAlias + '-after-create-columns', me.eventAlias + '-column-created', me.eventAlias + '-action-column-created', me.eventAlias + '-before-create-action-column-items', me.eventAlias + '-after-create-action-column-items', me.eventAlias + '-delete-action-column-created', me.eventAlias + '-edit-action-column-created', me.eventAlias + '-before-create-plugins', me.eventAlias + '-after-create-plugins', me.eventAlias + '-selection-model-created', me.eventAlias + '-before-create-docked-items', me.eventAlias + '-after-create-docked-items', me.eventAlias + '-paging-bar-created', me.eventAlias + '-page-size-combo-created', me.eventAlias + '-before-create-page-sizes', me.eventAlias + '-after-create-page-sizes', me.eventAlias + '-toolbar-created', me.eventAlias + '-before-create-toolbar-items', me.eventAlias + '-before-create-right-toolbar-items', me.eventAlias + '-after-create-toolbar-items', me.eventAlias + '-add-button-created', me.eventAlias + '-delete-button-created', me.eventAlias + '-search-field-created', me.eventAlias + '-before-reload-data', me.eventAlias + '-after-reload-data', me.eventAlias + '-before-create-features', me.eventAlias + '-after-create-features' ); }, createColumns: function () { var me = this, model = null, column = null, configColumns = me.getConfig('columns'), columns = []; model = me.store.model.$className; if (model.length > 0) { model = Ext.create(model); } me.fireEvent(me.eventAlias + '-before-create-columns', me, columns); if (me.getConfig('rowNumbers')) { columns.push(me.createRowNumberColumn()); } var keys = model.fields.keys; if (Object.keys(configColumns).length > 0) keys = Object.keys(configColumns); Ext.each(keys, function(key) { var modelField = me.getFieldByName(model.fields.items, key); column = me.createColumn(model, modelField); if (column !== null) columns.push(column); }); me.fireEvent(me.eventAlias + '-before-create-action-columns', me, columns); if (me.getConfig('actionColumn')) { column = me.createActionColumn(); if (column !== null) { columns.push(column); } } me.fireEvent(me.eventAlias + '-after-create-columns', me, columns); return columns; }, createColumn: function (model, field) { var me = this, column = {}, config, customConfig; if (model.idProperty === field.name) { return null; } column.xtype = 'gridcolumn'; column.dataIndex = field.name; column.header = me.getHumanReadableWord(field.name); column.flex = 1; var fieldAssociation = me.getFieldAssociation(field.name); if (fieldAssociation === undefined) { switch (field.type.type) { case 'int': column = me.applyIntegerColumnConfig(column); break; case 'string': column = me.applyStringColumnConfig(column); break; case 'bool': column = me.applyBooleanColumnConfig(column); break; case 'date': column = me.applyDateColumnConfig(column, field.dateFormat); break; case 'float': column = me.applyFloatColumnConfig(column); break; } } else { column.association = fieldAssociation; column.renderer = me.associationColumnRenderer; } config = me.getConfig('columns'); customConfig = config[field.name] || {}; if (Ext.isString(customConfig)) customConfig = { header: customConfig }; if (Ext.isObject(customConfig)) { column = Ext.apply(column, customConfig); } else if (Ext.isFunction(customConfig)) { column = customConfig.call(this, model, column, field, fieldAssociation); } me.fireEvent(me.eventAlias + '-column-created', me, column, model, field); return column; }, createActionColumn: function () { var me = this, items, column; items = me.createActionColumnItems(); column = { xtype: 'actioncolumn', width: 30 * items.length, items: items }; me.fireEvent(me.eventAlias + '-action-column-created', me, column); return column; }, createActionColumnItems: function () { var me = this, items = []; me.fireEvent(me.eventAlias + '-before-create-action-column-items', me, items); if (me.getConfig('deleteColumn')) { items.push(me.createDeleteColumn()); } if (me.getConfig('editColumn')) { items.push(me.createEditColumn()); } me.fireEvent(me.eventAlias + '-after-create-action-column-items', me, items); return items; }, createDeleteColumn: function () { var me = this, column; column = { action: 'delete', iconCls: 'sprite-minus-circle-frame', handler: function (view, rowIndex, colIndex, item, opts, record) { me.fireEvent(me.eventAlias + '-delete-item', me, record, rowIndex, colIndex, item, opts); } }; me.fireEvent(me.eventAlias + '-delete-action-column-created', me, column); return column; }, createEditColumn: function () { var me = this, column; column = { action: 'edit', iconCls: 'sprite-pencil', handler: function (view, rowIndex, colIndex, item, opts, record) { me.fireEvent(me.eventAlias + '-edit-item', me, record, rowIndex, colIndex, item, opts); } }; me.fireEvent(me.eventAlias + '-edit-action-column-created', me, column); return column; }, createRowNumberColumn: function () { return { xtype: 'rownumberer', width: 30 }; }, createPlugins: function () { var me = this, items = [], item; me.fireEvent(me.eventAlias + '-before-create-plugins', me, items); if (me.getConfig('rowEditing')) { item = Ext.create('Ext.grid.plugin.RowEditing', { clicksToEdit: 2 }); items.push(item) } me.fireEvent(me.eventAlias + '-after-create-plugins', me, items); return items; }, createFeatures: function () { var me = this, items = []; me.fireEvent(me.eventAlias + '-before-create-features', me, items); me.fireEvent(me.eventAlias + '-after-create-features', me, items); return items; }, createSelectionModel: function () { var me = this, selModel; selModel = Ext.create('Ext.selection.CheckboxModel', { listeners: { selectionchange: function (selModel, selection) { return me.fireEvent(me.eventAlias + '-selection-changed', me, selModel, selection); } } }); me.fireEvent(me.eventAlias + '-selection-model-created', me, selModel); return selModel; }, createDockedItems: function () { var me = this, items = []; me.fireEvent(me.eventAlias + '-before-create-docked-items', me, items); if (me.getConfig('toolbar')) { items.push(me.createToolbar()); } if (me.getConfig('pagingbar')) { items.push(me.createPagingbar()); } me.fireEvent(me.eventAlias + '-after-create-docked-items', me, items); return items; }, createPagingbar: function () { var me = this; me.pagingbar = Ext.create('Ext.toolbar.Paging', { store: me.store, dock: 'bottom' }); if (me.getConfig('pageSize')) { var pageSizeCombo = me.createPageSizeCombo(); me.pagingbar.add('->', pageSizeCombo, { xtype: 'tbspacer', width: 6 }); } me.fireEvent(me.eventAlias + '-paging-bar-created', me, me.pagingbar); return me.pagingbar; }, createPageSizeCombo: function () { var me = this, value = 20; if (me.store) { value = me.store.pageSize; } me.pageSizeCombo = Ext.create('Ext.form.field.ComboBox', { fieldLabel: me.getConfig('pageSizeLabel'), labelWidth: 110, queryMode: 'local', value: value, width: 200, store: Ext.create('Ext.data.Store', { fields: [ 'value', 'name' ], data: me.createPageSizes() }), displayField: 'name', valueField: 'value', listeners: { select: function (combo, records) { me.fireEvent(me.eventAlias + '-change-page-size', me, combo, records); } } }); me.fireEvent(me.eventAlias + '-page-size-combo-created', me, me.pageSizeCombo); return me.pageSizeCombo; }, createPageSizes: function () { var me = this, data = []; me.fireEvent(me.eventAlias + '-before-create-page-sizes', me, data); for (var i = 1; i <= 10; i++) { var count = i * 20; data.push({ value: count, name: count + ' items' }); } me.fireEvent(me.eventAlias + '-after-create-page-sizes', me, data); return data; }, createToolbar: function () { var me = this; me.toolbar = Ext.create('Ext.toolbar.Toolbar', { dock: 'top', ui: 'shopware-ui', items: me.createToolbarItems() }); me.fireEvent(me.eventAlias + '-toolbar-created', me, me.toolbar); return me.toolbar; }, createToolbarItems: function () { var me = this, items = []; me.fireEvent(me.eventAlias + '-before-create-toolbar-items', me, items); if (me.getConfig('addButton')) { items.push(me.createAddButton()); } if (me.getConfig('deleteButton')) { items.push(me.createDeleteButton()) } me.fireEvent(me.eventAlias + '-before-create-right-toolbar-items', me, items); if (me.getConfig('searchField')) { items.push('->'); items.push(me.createSearchField()); } me.fireEvent(me.eventAlias + '-after-create-toolbar-items', me, items); return items; }, createAddButton: function () { var me = this; me.addButton = Ext.create('Ext.button.Button', { text: me.getConfig('addButtonText'), iconCls: 'sprite-plus-circle-frame', handler: function () { me.fireEvent(me.eventAlias + '-add-item', me, this); } }); me.fireEvent(me.eventAlias + '-add-button-created', me, me.addButton); return me.addButton; }, createDeleteButton: function () { var me = this; me.deleteButton = Ext.create('Ext.button.Button', { text: me.getConfig('deleteButtonText'), disabled: true, iconCls: 'sprite-minus-circle-frame', handler: function () { var selModel = me.getSelectionModel(); me.fireEvent(me.eventAlias + '-delete-items', me, selModel.getSelection(), this); } }); me.fireEvent(me.eventAlias + '-delete-button-created', me, me.deleteButton); return me.deleteButton; }, createSearchField: function () { var me = this; me.searchField = Ext.create('Ext.form.field.Text', { cls: 'searchfield', width: 170, emptyText: me.getConfig('searchFieldText'), enableKeyEvents: true, checkChangeBuffer: 500, listeners: { change: function (field, value) { me.fireEvent(me.eventAlias + '-search', me, field, value); } } }); me.fireEvent(me.eventAlias + '-search-field-created', me, me.searchField); return me.searchField; }, reloadData: function(store, record) { var me = this; if (store instanceof Ext.data.Store) { if (!me.fireEvent(me.eventAlias + '-before-reload-data', me, store, record)) { return false; } me.reconfigure(store); me.fireEvent(me.eventAlias + '-after-reload-data', me, store, record); } }, getFieldAssociation: function(fieldName) { var me = this, fieldAssociation = undefined; Ext.each(me.fieldAssociations, function(association) { if (association.field === fieldName) { fieldAssociation = association; return false; } }); return fieldAssociation; }, associationColumnRenderer: function(value, metaData, record, rowIndex, colIndex) { var column = this.columns[colIndex], result; if (!column.association) { return value; } var associationStore = record[column.association.storeName]; if (!(associationStore instanceof Ext.data.Store) || associationStore.getCount() <= 0) { return value; } var associationRecord = associationStore.first(); if (!(associationRecord instanceof Ext.data.Model)) { return value; } result = associationRecord.get('name'); if (result) return result; result = associationRecord.get('description'); if (result) return result; return value; } }); Ext.define('Shopware.data.Model', { extend: 'Ext.data.Model', statics: { displayConfig: { controller: undefined, listing: 'Shopware.grid.Panel', detail: 'Shopware.model.Container', related: 'Shopware.grid.Association', field: 'Shopware.form.field.Search', proxy: { type: 'ajax', api: { detail: '/backend/base/detail', create: '/backend/base/create', update: '/backend/base/update', destroy: '/backend/base/delete' }, reader: { type: 'json', root: 'data', totalProperty: 'total' } } }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (config) { var me = this; me._opts = me.statics().getDisplayConfig(config, this); me.convertProxyApi(); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, convertProxyApi: function () { var me = this, value; if (!me.getConfig('controller')) { return; } me.setProxy(me.getConfig('proxy')); Object.keys(me.proxy.api).forEach(function (key) { value = me.proxy.api[key] + ''; value = value.replace( '/backend/base/', '/backend/' + me.getConfig('controller') + '/' ); me.proxy.api[key] = value; }); }, reload: function (options) { var me = this, proxy = me.proxy; if (!Ext.isString(proxy.api.detail)) { if (options && Ext.isFunction(options.callback)) { options.callback(me); } else { return this; } } proxy.api.read = proxy.api.detail; var store = Ext.create('Ext.data.Store', { model: me.__proto__.$className, proxy: me.proxy }); store.getProxy().extraParams.id = me.get('id'); try { store.load({ callback: function (records, operation) { var record = records[0]; if (options && Ext.isFunction(options.callback)) { options.callback(record, operation); } } }); } catch (e) { return e; } } }); Ext.define('Shopware.store.Listing', { extend: 'Ext.data.Store', mixins: { helper: 'Shopware.model.Helper' }, autoLoad: false, batch: true, remoteSort: true, remoteFilter: true, pageSize: 20, statics: { displayConfig: { controller: undefined, proxy: { type: 'ajax', api: { read: '/backend/base/list' }, reader: { type: 'json', root: 'data', totalProperty: 'total' } } }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (config) { var me = this; me._opts = me.statics().getDisplayConfig(config, this); me.convertProxyApi(); me.callParent(arguments); }, convertProxyApi: function () { var me = this, value; me.checkRequirements(); me.setProxy(me.getConfig('proxy')); Object.keys(me.proxy.api).forEach(function (key) { value = me.proxy.api[key] + ''; value = value.replace( '/backend/base/', '/backend/' + me.getConfig('controller') + '/' ); me.proxy.api[key] = value; }); }, checkRequirements: function() { var me = this; if (!me.getConfig('controller')) { me.throwException(me.$className + ": Component requires the `controller` property in the configure() function."); } } }); Ext.define('Shopware.window.Detail', { extend: 'Enlight.app.Window', layout: { type: 'hbox', align: 'stretch' }, mixins: { helper: 'Shopware.model.Helper' }, width: 990, height: '90%', alias: 'widget.shopware-window-detail', associationComponents: [], eventAlias: undefined, record: undefined, controller: undefined, tabPanel: undefined, formPanel: undefined, toolbar: undefined, cancelButton: undefined, saveButton: undefined, statics: { displayConfig: { eventAlias: undefined, associations: [], hasOwnController: false, cancelButtonText: 'Abbrechen', saveButtonText: 'Speichern' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, initComponent: function () { var me = this; me.checkRequirements(); me.associationComponents = []; me.eventAlias = me.getConfig('eventAlias'); if (!me.eventAlias) me.eventAlias = me.getEventAlias(me.record.$className); me.items = [ me.createFormPanel() ]; me.dockedItems = me.createDockedItems(); if (me.getConfig('hasOwnController') === false) { me.createDefaultController(); } me.callParent(arguments); me.loadRecord(me.record); }, checkRequirements: function() { var me = this; if (!(me.record instanceof Shopware.data.Model)) { me.throwException(me.$className + ": Component requires a passed Shopware.data.Model in the `record` property."); } if (me.alias.length <= 0) { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (me.alias.length === 1 && me.alias[0] === 'widget.shopware-window-detail') { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } }, registerEvents: function() { var me = this; me.addEvents( me.getEventName('before-tab-changed'), me.getEventName('after-tab-changed'), me.getEventName('before-load-record'), me.getEventName('after-load-record'), me.getEventName('save'), me.getEventName('before-load-lazy-loading-component'), me.getEventName('after-load-lazy-loading-component'), me.getEventName('before-load-associations'), me.getEventName('after-load-associations'), me.getEventName('before-load-association-component'), me.getEventName('after-load-association-component'), me.getEventName('before-create-toolbar-items'), me.getEventName('after-create-toolbar-items'), me.getEventName('before-create-tab-item'), me.getEventName('after-create-tab-item'), me.getEventName('before-create-tab-items'), me.getEventName('after-create-tab-items') ); }, createDefaultController: function() { var me = this; me.controller = me.subApp.getController('Shopware.detail.Controller'); me.controller._opts.detailWindow = me.$className; me.controller._opts.eventAlias = me.eventAlias; me.controller.reloadControls(); return me.controller; }, destroy: function() { var me = this; if (!me.getConfig('hasOwnController') && me.controller) { me.subApp.eventbus.uncontrol([me.controller.$className]); } return me.callParent(arguments); }, createFormPanel: function () { var me = this, items; items = me.createTabItems(); if (items.length > 1) { me.tabPanel = Ext.create('Ext.tab.Panel', { flex: 1, items: items, listeners: { tabchange: function (tabPanel, newCard, oldCard, eOpts) { me.onTabChange(tabPanel, newCard, oldCard, eOpts); } } }); items = [ me.tabPanel ]; } me.formPanel = Ext.create('Ext.form.Panel', { items: items, flex: 1, layout: { type: 'hbox', align: 'stretch' } }); return me.formPanel; }, createTabItems: function () { var me = this, item, items = []; if (!me.fireEvent(me.getEventName('before-create-tab-items'), me, items)) { return []; } Ext.each(me.getTabItemsAssociations(), function (association) { item = me.createTabItem(association); if (item) items.push(item); }); me.fireEvent(me.getEventName('after-create-tab-items'), me, items); return items; }, getTabItemsAssociations: function () { var me = this, associations, config = me.getConfig('associations') || []; associations = me.getAssociations(me.record.$className, [ { associationKey: config } ]); associations = Ext.Array.insert(associations, 0, [ { isBaseRecord: true, associationKey: 'baseRecord' } ]); return associations; }, createTabItem: function (association) { var me = this, item; if (!me.fireEvent(me.getEventName('before-create-tab-item'), me, association)) { return false; } if (association.isBaseRecord) { item = me.createAssociationComponent('detail', me.record, null, null, me.record); } else { item = me.createAssociationComponent( me.getComponentTypeOfAssociation(association), Ext.create(association.associatedName), me.getAssociationStore(me.record, association), association, me.record ); } me.associationComponents[association.associationKey] = item; me.fireEvent(me.getEventName('after-create-tab-item'), me, association, item); if (item.title === undefined) { item.title = me.getModelName(association.associatedName); } return item; }, createAssociationComponent: function(type, model, store, association, baseRecord) { var me = this, component = { }; if (!(model instanceof Shopware.data.Model)) { me.throwException(model.$className + ' has to be an instance of Shopware.data.Model'); } if (baseRecord && !(baseRecord instanceof Shopware.data.Model)) { me.throwException(baseRecord.$className + ' has to be an instance of Shopware.data.Model'); } var componentType = model.getConfig(type); if (!me.fireEvent(me.getEventName('before-association-component-created'), me, component, type, model, store)) { return component; } component = Ext.create(componentType, { record: model, store: store, flex: 1, subApp: this.subApp, association: association, configure: function() { var config = { }; if (association) { config.associationKey = association.associationKey; } if (baseRecord && baseRecord.getConfig('controller')) { config.controller = baseRecord.getConfig('controller'); } return config; } }); component.on('viewready', function() { if (me.isLazyLoadingComponent(component)) { if (!(me.fireEvent(me.getEventName('before-load-lazy-loading-component'), me, component))) { return true; } component.getStore().load({ callback: function(records, operation) { me.fireEvent(me.getEventName('after-load-lazy-loading-component'), me, component, records, operation); } }); } }); me.fireEvent(me.getEventName('after-association-component-created'), me, component, type, model, store); return component; }, createDockedItems: function () { var me = this; return [ me.createToolbar() ]; }, createToolbar: function () { var me = this; me.toolbar = Ext.create('Ext.toolbar.Toolbar', { items: me.createToolbarItems(), dock: 'bottom' }); return me.toolbar; }, createToolbarItems: function() { var me = this, items = []; me.fireEvent(me.getEventName('before-create-toolbar-items'), me, items); items.push({ xtype: 'tbfill' }); items.push(me.createCancelButton()); items.push(me.createSaveButton()); me.fireEvent(me.getEventName('after-create-toolbar-items'), me, items); return items; }, createCancelButton: function () { var me = this; me.cancelButton = Ext.create('Ext.button.Button', { cls: 'secondary', name: 'cancel-button', text: me.getConfig('cancelButtonText'), handler: function () { me.onCancel(); } }); return me.cancelButton; }, createSaveButton: function () { var me = this; me.saveButton = Ext.create('Ext.button.Button', { cls: 'primary', name: 'detail-save-button', text: me.getConfig('saveButtonText'), handler: function () { me.onSave(); } }); return me.saveButton; }, loadRecord: function (record) { var me = this; if (!(me.fireEvent(me.getEventName('before-load-record'), me, record))) { return false; } if (this.formPanel instanceof Ext.form.Panel) { this.formPanel.loadRecord(record); } me.fireEvent(me.getEventName('after-load-record'), me, record); this.loadAssociationData(record); }, loadAssociationData: function(record) { var me = this, association, component, store; if (!(me.fireEvent(me.getEventName('before-load-associations'), me, record))) { return false; } Object.keys(me.associationComponents).forEach(function(key) { component = me.associationComponents[key]; store = null; association = null; if (key != 'baseRecord') { association = me.getAssociations(record.$className, [ { associationKey: [ key ] } ]); store = me.getAssociationStore(record, association[0]); } if (!(me.fireEvent(me.getEventName('before-load-association-component'), me, record, component, store, association))) { return true; } if (component && typeof component.reloadData === 'function') { component.reloadData( store, record ); } if (me.isLazyLoadingComponent(component)) { component.getStore().load(); } me.fireEvent(me.getEventName('after-load-association-component'), me, record, component, store, association); }); me.fireEvent(me.getEventName('after-load-associations'), me, record); }, onTabChange: function (tabPanel, newCard, oldCard, eOpts) { var me = this; if (!(me.fireEvent(me.getEventName('before-tab-changed'), me, tabPanel, newCard, oldCard, eOpts))) { return false; } me.fireEvent(me.getEventName('after-tab-changed'), me, tabPanel, newCard, oldCard, eOpts); }, onSave: function () { this.fireEvent( this.getEventName('save'), this, this.record ); }, onCancel: function () { this.destroy(); }, getEventName: function (name) { return this.eventAlias + '-' + name; }, }); Ext.define('Shopware.window.Listing', { extend: 'Enlight.app.Window', mixins: { helper: 'Shopware.model.Helper' }, layout: 'border', width: 990, height: '50%', alias: 'widget.shopware-window-listing', eventAlias: undefined, listingStore: undefined, gridPanel: undefined, statics: { displayConfig: { listingGrid: undefined, listingStore: undefined, eventAlias: undefined, extensions: [ ] }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, initComponent: function () { var me = this; me.checkRequirements(); me.listingStore = me.createListingStore(); me.eventAlias = me.getConfig('eventAlias'); if (!me.eventAlias) me.eventAlias = me.getEventAlias(me.listingStore.model.$className); me.registerEvents(); me.fireEvent(me.eventAlias + '-before-init-component', me); me.items = me.createItems(); me.fireEvent(me.eventAlias + '-after-init-component', me); me.callParent(arguments); }, checkRequirements: function() { var me = this; if (me.alias.length <= 0) { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (me.alias.length === 1 && me.alias[0] === 'widget.shopware-window-listing') { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (!me.getConfig('listingGrid')) { me.throwException(me.$className + ": Component requires the configured `listingGrid` property in the configure() function."); } if (!me.getConfig('listingStore')) { me.throwException(me.$className + ": Component requires the configured `listingStore` property in the configure() function."); } }, registerEvents: function() { var me = this; me.addEvents( me.eventAlias + '-before-init-component', me.eventAlias + '-before-create-items', me.eventAlias + '-after-create-items', me.eventAlias + '-after-extensions-loaded', me.eventAlias + '-after-create-grid-panel', me.eventAlias + '-after-init-component' ); }, createListingStore: function() { var me = this; return Ext.create(this.getConfig('listingStore')); }, createItems: function () { var me = this, items = []; me.fireEvent(me.eventAlias + '-before-create-items', me, items); items.push(me.createGridPanel()); me.fireEvent(me.eventAlias + '-after-create-items', me, items); Ext.each(me.getConfig('extensions'), function(extension) { if (!extension) return true; if (Ext.isString(extension)) extension = { xtype: extension }; extension.listingWindow = me; items.push(extension); }); me.fireEvent(me.eventAlias + '-after-extensions-loaded', me, items); return items; }, createGridPanel: function () { var me = this; me.listingStore.load(); me.gridPanel = Ext.create(me.getConfig('listingGrid'), { store: me.listingStore, flex: 1, subApp: me.subApp }); me.fireEvent(me.eventAlias + '-after-create-grid-panel', me, me.gridPanel); return me.gridPanel; } }); Ext.define('Shopware.window.Progress', { extend: 'Ext.window.Window', title: 'Einträge löschen', alias: 'widget.shopware-progress-window', layout: { type: 'vbox', align: 'stretch' }, width: 600, modal: true, bodyPadding: 20, height: 360, closable: false, cancelProcess: false, cancelButton: undefined, closeButton: undefined, resultStore: undefined, resultGrid: undefined, resultFieldSet: undefined, statics: { displayConfig: { infoText: undefined, tasks: [ ], outputProperties: [ 'id', 'number', 'name' ], displayResultGrid: true, cancelButtonText: 'Prozess abbrechen', closeButtonText: 'Fenster schließen', successHeader: 'Erfolgreich', requestHeader: 'Request', errorHeader: 'Fehlermeldung', requestResultTitle: 'Request Ergebnis', processCanceledText: 'Prozess wurde an Position [0] von [1] unterbrochen' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, initComponent: function () { var me = this; me.registerEvents(); me.fireEvent('before-init-component', me); me.cancelProcess = false; me.items = me.createItems(); me.dockedItems = [ me.createToolbar() ]; me.fireEvent('after-init-component', me); me.callParent(arguments); me.fireEvent('before-start-sequential-process', me); me.sequentialProcess(undefined, me.getConfig('tasks')); }, registerEvents: function() { var me = this; me.addEvents( 'before-init-component', 'after-init-component', 'before-start-sequential-process', 'before-create-items', 'after-create-items', 'before-create-toolbar', 'after-create-toolbar', 'before-create-toolbar-items', 'after-create-toolbar-fill-item', 'after-create-toolbar-items', 'before-result-field-set-created', 'after-result-grid-created', 'after-result-field-set-created', 'task-toolbar-created', 'process-done' ); }, createItems: function () { var me = this, items = [], item; var tasks = me.getConfig('tasks'); if (!me.fireEvent('before-create-items', me, items)) { return items; } if (me.getConfig('infoText')) { items.push(me.createInfoText()); } Ext.each(tasks, function (task) { item = me.createTaskProgressBar(task); if (item) { items.push(item); } }); if (me.getConfig('displayResultGrid')) { items.push(me.createResultFieldSet()); } me.fireEvent('after-create-items', me, items); return items; }, createToolbar: function () { var me = this, toolbar = null; if (!me.fireEvent('before-create-toolbar', me, toolbar)) { return toolbar; } me.toolbar = Ext.create('Ext.toolbar.Toolbar', { dock: 'bottom', items: me.createToolbarItems() }); me.fireEvent('after-create-toolbar', me, me.toolbar); return me.toolbar; }, createToolbarItems: function() { var me = this, items = []; if (!me.fireEvent('before-create-toolbar-items', me, items)) { return items; } me.cancelButton = Ext.create('Ext.button.Button', { cls: 'secondary', text: me.getConfig('cancelButtonText'), handler: function() { me.cancelProcess = true; } }); me.closeButton = Ext.create('Ext.button.Button', { cls: 'secondary', text: me.getConfig('closeButtonText'), disabled: true, handler: function() { me.destroy() } }); items.push('->'); me.fireEvent('after-create-toolbar-fill-item', me, items); items.push(me.cancelButton); items.push(me.closeButton); me.fireEvent('after-create-toolbar-items', me, items); return items; }, createResultFieldSet: function () { var me = this, fieldSet = null; if (!me.fireEvent('before-result-field-set-created', me, fieldSet)) { return fieldSet; } me.resultGrid = me.createResultGrid(); me.fireEvent('after-result-grid-created', me, me.resultGrid); me.resultFieldSet = Ext.create('Ext.form.FieldSet', { items: [ me.resultGrid ], layout: 'fit', collapsible: true, collapsed: false, flex: 1, margin: '20 0 0', title: me.getConfig('requestResultTitle') }); me.fireEvent('after-result-field-set-created', me, me.resultFieldSet); return me.resultFieldSet; }, createResultGrid: function() { var me = this; me.resultStore = Ext.create('Ext.data.Store', { model: 'Shopware.model.DataOperation' }); return Ext.create('Ext.grid.Panel', { border: false, columns: [ { xtype: 'rownumberer', width: 30 }, { header: me.getConfig('successHeader'), dataIndex: 'success', width: 60, renderer: me.successRenderer }, { header: me.getConfig('requestHeader'), dataIndex: 'request', flex: 1, renderer: me.requestRenderer, scope: me }, { header: me.getConfig('errorHeader'), dataIndex: 'error', flex: 1 } ], store: me.resultStore }); }, createInfoText: function () { return Ext.create('Ext.container.Container', { html: this.getConfig('infoText'), style: 'line-height:20px;' }); }, createTaskProgressBar: function (task) { var me = this; task.progressBar = Ext.create('Ext.ProgressBar', { animate: true, text: Ext.String.format(task.text, 0, task.totalCount), value: 0, height: 20, margin: '15 0 0' }); me.fireEvent('task-toolbar-created', me, task, task.progressBar); return task.progressBar; }, sequentialProcess: function (current, tasks) { var me = this, record; if (current == undefined && tasks.length > 0) { current = tasks.shift(); } if (current.data && current.data.length <= 0) { current = tasks.shift(); } if (!current || me.cancelProcess) { me.closeButton.enable(); me.cancelButton.disable(); if (me.cancelProcess) { me.updateProgressBar(current, me.getConfig('processCanceledText')); } me.fireEvent('process-done', me, current, me.cancelProcess); return false; } if (!current.hasOwnProperty('totalCount')) current.totalCount = current.data.length; record = current.data.shift(); me.updateProgressBar(current, current.text); me.fireEvent(current.event, current, record, function(result, operation) { if (!me.getConfig('displayResultGrid')) { me.sequentialProcess(current, tasks); } var responseRecord = me.createResponseRecord(result, operation); me.resultStore.add(responseRecord); if (!responseRecord.get('success')) { me.resultFieldSet.expand(); } me.sequentialProcess(current, tasks); }); return true; }, updateProgressBar: function(task, text) { var index = task.totalCount - task.data.length; task.progressBar.updateProgress( index / task.totalCount, Ext.String.format(text, index, task.totalCount), true ); }, createResponseRecord: function(result, operation) { var success = false, error = '', request, data = { }; if (Ext.isObject(result) && result.hasOwnProperty('responseText')) { data = Ext.decode(result.responseText); } if (data.hasOwnProperty('success')) { success = data.success; } else if (Ext.isObject(operation) && operation.hasOwnProperty('wasSuccessful')) { success = operation.wasSuccessful(); } else if (Ext.isObject(operation) && operation.hasOwnProperty('success')) { success = operation.success; } else if (Ext.isObject(result) && result.hasOwnProperty('success')) { success = result.success; } else if (Ext.isObject(result) && result.hasOwnProperty('status')) { success = (result.status === 200); } if (data.hasOwnProperty('error')) { error = data.error; } else if (Ext.isObject(operation) && operation.hasOwnProperty('getError')) { error = operation.getError(); } else if (Ext.isObject(operation) && operation.hasOwnProperty('error')) { error = operation.error; } if (Ext.isObject(operation) && operation.hasOwnProperty('request')) { request = operation.request; } else if (Ext.isObject(result) && result.hasOwnProperty('request')) { request = result.request; } return Ext.create('Shopware.model.DataOperation', { success: success, error: error, request: request, operation: operation }); }, successRenderer: function(value, metaData) { metaData.tdAttr = 'style="vertical-align: middle;"'; var css = 'sprite-cross-small'; if (value) { css = 'sprite-tick-small' } return ''; }, requestRenderer: function(value, metaData, record) { var me = this, operation, propertyValue, params = [], requestRecord, url, properties = me.getConfig('outputProperties'); operation = record.get('operation'); if (Ext.isObject(operation) && operation.hasOwnProperty('getRecords')) { requestRecord = operation.getRecords(); requestRecord = requestRecord[0]; } if (Ext.isObject(value) && value.hasOwnProperty('url')) { url = value.url; } else if (Ext.isObject(value) && value.hasOwnProperty('options') && value.options.hasOwnProperty('url')) { url = value.options.url; } params.push('url = ' + url); if (requestRecord) { Ext.each(properties, function(property) { propertyValue = requestRecord.get(property); if (propertyValue) { params.push('' + property + ' = ' + propertyValue); } }); } return params.join('
    '); } }); Ext.define('Shopware.model.DataOperation', { extend:'Ext.data.Model', phantom: true, fields:[ { name: 'success', type: 'boolean' }, { name: 'request' }, { name: 'error', type: 'string' }, { name: 'operation' }, ] }); Ext.define('Shopware.grid.Association', { extend: 'Shopware.grid.Panel', alias: 'widget.shopware-grid-association', searchStore: undefined, searchComboBox: undefined, statics: { displayConfig: { controller: undefined, associationKey: undefined, searchUrl: '/backend/base/searchAssociation', searchCombo: true, pagingbar: false, editColumn: false, searchComboLabel: 'Suche nach' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); if (config.controller) { config.searchUrl = config.searchUrl.replace( '/backend/base/', '/backend/' + config.controller + '/' ); } return config; }, setDisplayConfig: function (prop, val) { var me = this; val = val || ''; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (opts) { var me = this, args; me._opts = me.statics().getDisplayConfig(opts, this); args = arguments; opts.configure = function() { return me._opts; }; me.callParent(args); }, checkRequirements: function() { var me = this; if (!(me.store instanceof Ext.data.Store)) { me.throwException(me.$className + ": Component requires a configured store, which has to been passed in the class constructor."); } if (me.alias.length <= 0) { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (me.alias.length === 1 && me.alias[0] === 'widget.shopware-grid-association') { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } }, createToolbar: function() { var me = this, toolbar; toolbar = me.callParent(arguments); toolbar.style = 'background:#fff'; return toolbar; }, createToolbarItems: function() { var me = this, items = []; if (me.getConfig('searchCombo')) { me.searchStore = me.createAssociationSearchStore( me.getStore().model, me.getConfig('associationKey'), me.getConfig('searchUrl') ); me.searchComboBox = me.createSearchCombo(me.searchStore); items.push(me.searchComboBox); } return items; }, createSearchCombo: function (store) { var me = this; return Ext.create('Shopware.form.field.Search', { name: 'associationSearchField', store: store, pageSize: 20, flex: 1, subApp: me.subApp, fieldLabel: me.getConfig('searchComboLabel'), margin: 5, listeners: { select: function (combo, records) { me.onSelectSearchItem(combo, records); } } }); }, onSelectSearchItem: function (combo, records) { var me = this, inStore; Ext.each(records, function (record) { inStore = me.getStore().getById(record.get('id')); if (inStore === null) { me.getStore().add(record); combo.setValue(''); } }); } }); Ext.define('Shopware.model.Container', { extend: 'Ext.container.Container', autoScroll: true, associationComponents: [], eventAlias: undefined, fieldAssociations: undefined, record: undefined, mixins: { helper: 'Shopware.model.Helper' }, statics: { displayConfig: { controller: undefined, eventAlias: undefined, searchUrl: '/backend/base/searchAssociation', fieldSets: [ { fields: { }, title: undefined } ], associations: [ ], fieldAlias: undefined }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); if (config.controller) { config.searchUrl = config.searchUrl.replace( '/backend/base/', '/backend/' + config.controller + '/' ); } return config; }, setDisplayConfig: function (prop, val) { var me = this; val = val || ''; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, initComponent: function() { var me = this; me.checkRequirements(); me.eventAlias = me.getConfig('eventAlias'); if (!me.eventAlias) me.eventAlias = me.getEventAlias(me.record.$className); me.registerEvents(); me.fireEvent(me.eventAlias + '-before-init-component', me); me.fieldAssociations = me.getAssociations(me.record.$className, [ { relation: 'ManyToOne' } ]); me.associationComponents = []; me.items = me.createItems(); me.title = me.getModelName(me.record.$className); me.fireEvent(me.eventAlias + '-after-init-component', me); me.callParent(arguments); }, checkRequirements: function() { var me = this; if (!(me.record instanceof Shopware.data.Model)) { me.throwException(me.$className + ": Component requires a passed Shopware.data.Model in the `record property."); } }, registerEvents: function() { var me = this; this.addEvents( me.eventAlias + '-before-init-component', me.eventAlias + '-after-init-component', me.eventAlias + '-before-create-items', me.eventAlias + '-after-create-items', me.eventAlias + '-before-association-component-created', me.eventAlias + '-after-association-component-created', me.eventAlias + '-model-fields-created', me.eventAlias + '-before-model-field-set-created', me.eventAlias + '-column-containers-created', me.eventAlias + '-after-model-field-set-created', me.eventAlias + '-before-create-model-field', me.eventAlias + '-association-field-created', me.eventAlias + '-model-field-created', me.eventAlias + '-before-reload-data', me.eventAlias + '-before-reload-association-data', me.eventAlias + '-after-reload-association-data', me.eventAlias + '-after-reload-data', me.eventAlias + '-before-load-lazy-loading-component', me.eventAlias + '-after-load-lazy-loading-component' ); }, createItems: function() { var me = this, items = [], item, config, associations, fields, field, keys; if (!me.fireEvent(me.eventAlias + '-before-create-items', me, items)) { return false; } Ext.each(me.getConfig('fieldSets'), function(fieldSet) { if (Ext.isFunction(fieldSet)) { item = fieldSet.call(this, items, me.record.$className); if (item) items.push(item); return true; } fields = []; keys = []; if (Object.keys(fieldSet.fields).length > 0) { keys = Object.keys(fieldSet.fields); } else if (me.getConfig('fieldSets').length <= 1) { keys = me.record.fields.keys; } Ext.each(keys, function(key) { config = fieldSet.fields[key] || {}; field = me.createModelField( me.record, me.getFieldByName(me.record.fields.items, key), me.getConfig('fieldAlias'), config ); if (field) fields.push(field); }); item = me.createModelFieldSet(me.record.$className, fields, fieldSet); items.push(item); }); associations = me.getAssociations( me.record.$className, { associationKey: me.getConfig('associations') } ); Ext.each(associations, function(association) { item = me.createAssociationComponent( me.getComponentTypeOfAssociation(association), Ext.create(association.associatedName), me.getAssociationStore(me.record, association), association, me.record ); if(item) { items.push(item); me.associationComponents[association.associationKey] = item; } }); me.fireEvent(me.eventAlias + '-after-create-items', me, items); return items; }, createAssociationComponent: function(type, model, store, association, baseRecord) { var me = this, component = { }; if (!(model instanceof Shopware.data.Model)) { me.throwException(model.$className + ' has to be an instance of Shopware.data.Model'); } if (baseRecord && !(baseRecord instanceof Shopware.data.Model)) { me.throwException(baseRecord.$className + ' has to be an instance of Shopware.data.Model'); } var componentType = model.getConfig(type); if (!me.fireEvent(me.eventAlias + '-before-association-component-created', me, component, type, model, store)) { return component; } component = Ext.create(componentType, { record: model, store: store, flex: 1, subApp: me.subApp, association: association, configure: function() { var config = { }; if (association) { config.associationKey = association.associationKey; } if (baseRecord && baseRecord.getConfig('controller')) { config.controller = baseRecord.getConfig('controller'); } return config; } }); component.on('viewready', function() { if (me.isLazyLoadingComponent(component)) { if (!(me.fireEvent(me.eventAlias + '-before-load-lazy-loading-component', me, component))) { return true; } component.getStore().load({ callback: function(records, operation) { me.fireEvent(me.eventAlias + '-after-load-lazy-loading-component', me, component, records, operation); } }); } }); me.fireEvent(me.eventAlias + '-after-association-component-created', me, component, type, model, store); return component; }, createModelFieldSet: function (modelName, fields, customConfig) { var me = this, fieldSet = null, title = me.getModelName(modelName), model = Ext.create(modelName), items = [], container; customConfig = customConfig || {}; if (customConfig.title) title = customConfig.title; if (!me.fireEvent(me.eventAlias + '-before-model-field-set-created', me, fieldSet, items, model)) { return fieldSet; } container = Ext.create('Ext.container.Container', { columnWidth: 0.5, padding: '0 20 0 0', layout: 'anchor', items: fields.slice(0, Math.round(fields.length / 2)) }); items.push(container); container = Ext.create('Ext.container.Container', { columnWidth: 0.5, layout: 'anchor', items: fields.slice(Math.round(fields.length / 2)) }); items.push(container); me.fireEvent(me.eventAlias + '-column-containers-created', me, fields, items, model); fieldSet = Ext.create('Ext.form.FieldSet', { flex: 1, padding: '10 20', layout: 'column', items: items, title: title }); fieldSet = Ext.apply(fieldSet, customConfig); me.fireEvent(me.eventAlias + '-after-model-field-set-created', me, fieldSet, model); return fieldSet; }, createModelField: function (model, field, alias, customConfig) { var me = this, formField = {}, fieldModel, fieldComponent, xtype; if (!me.fireEvent(me.eventAlias + '-before-create-model-field', me, formField, model, field, alias)) { return formField; } if (model.idProperty === field.name) { return null; } formField.xtype = 'displayfield'; formField.anchor = '100%'; formField.margin = '0 3 7 0'; formField.labelWidth = 130; formField.name = field.name; if (alias !== undefined && Ext.isString(alias) && alias.length > 0) { formField.name = alias + '[' + field.name + ']'; } formField.fieldLabel = me.getHumanReadableWord(field.name); var fieldAssociation = me.getFieldAssociation(field.name); if (fieldAssociation === undefined) { switch (field.type.type) { case 'int': formField = me.applyIntegerFieldConfig(formField); break; case 'string': formField = me.applyStringFieldConfig(formField); break; case 'bool': formField = me.applyBooleanFieldConfig(formField); break; case 'date': formField = me.applyDateFieldConfig(formField); break; case 'float': formField = me.applyFloatFieldConfig(formField); break; } } else { fieldModel = Ext.create(fieldAssociation.associatedName); fieldComponent = fieldModel.getConfig('field'); xtype = Ext.ClassManager.getAliasesByName(fieldComponent); formField.xtype = xtype[0].replace('widget.', ''); formField.subApp = me.subApp; if (fieldComponent === 'Shopware.form.field.Search') { formField.store = me.createAssociationSearchStore( fieldAssociation.associatedName, fieldAssociation.associationKey, me.getConfig('searchUrl') ).load(); } me.fireEvent(me.eventAlias + '-association-field-created', model, formField, field, fieldAssociation); } if (Ext.isString(customConfig)) customConfig = { fieldLabel: customConfig }; customConfig = customConfig || {}; if (Ext.isObject(customConfig)) { formField = Ext.apply(formField, customConfig); } else if (Ext.isFunction(customConfig)) { formField = customConfig.call(this, model, formField, field, fieldAssociation); } me.fireEvent(me.eventAlias + '-model-field-created', model, formField, field, fieldAssociation); return formField; }, getFieldAssociation: function(fieldName) { var me = this, fieldAssociation = undefined; Ext.each(me.fieldAssociations, function(association) { if (association.field === fieldName) { fieldAssociation = association; return false; } }); return fieldAssociation; }, reloadData: function(store, record) { var me = this, association, component, associationStore; if (!me.fireEvent(me.eventAlias + '-before-reload-data', me, store, record)) { return false; } Object.keys(me.associationComponents).forEach(function(key) { component = me.associationComponents[key]; if (component && typeof component.reloadData === 'function') { association = me.getAssociations( record.$className, [ { associationKey: [ key ] } ] ); associationStore = me.getAssociationStore( record, association[0] ); if (!me.fireEvent(me.eventAlias + '-before-reload-association-data', me, store, record, component, association, associationStore)) { return true; } component.reloadData( associationStore, record ); me.fireEvent(me.eventAlias + '-after-reload-association-data', me, store, record, component, association, associationStore); } }); me.fireEvent(me.eventAlias + '-after-reload-data', me, store, record); } }); Ext.define('Shopware.form.field.Search', { extend: 'Ext.form.field.ComboBox', alias: 'widget.shopware-form-field-search', queryMode: 'remote', valueField: 'id', displayField: 'name', minChars: 2, store: undefined, statics: { displayConfig: { listTemplate: false }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; val = val || ''; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, initComponent: function() { var me = this; if (me.getConfig('listTemplate')) { me.listConfig = me.createSearchComboListConfig(); } me.callParent(arguments); }, createSearchComboListConfig: function () { return { getInnerTpl: [ '' + '' + '

    {name}

    ' + '' + '
    {[Ext.util.Format.ellipsis(values.description, 150)]}' + '
    ' + '
    ' + '' ].join() } } }); Ext.define('Shopware.detail.Controller', { extend: 'Enlight.app.Controller', mixins: { helper: 'Shopware.model.Helper' }, statics: { displayConfig: { detailWindow: undefined, eventAlias: undefined, saveSuccessTitle: 'Erfolgreich', saveSuccessMessage: 'Eintrag wurde erfolgreich gespeichert', violationErrorTitle: 'Validierung Fehler', invalidFormTitle: 'Formularvalidierungs Fehler', invalidFormMessage: 'Das Formular beinhaltet invalidate Daten, bitte prüfen Sie ihre Eingabe.', }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, init: function () { var me = this; if (me.$className !== 'Shopware.detail.Controller') { me.checkRequirements(); } if (me.getConfig('eventAlias') && me.getConfig('detailWindow')) { me.registerEvents(); me.control(me.createControls()); } me.callParent(arguments); }, checkRequirements: function() { var me = this; if (!me.getConfig('eventAlias')) { me.throwException(me.$className + ": Component requires the `eventAlias` property in the configure() function"); } if (!me.getConfig('detailWindow')) { me.throwException(me.$className + ": Component requires the `detailWindow` property in the configure() function"); } }, reloadControls: function() { var me = this; me.checkRequirements(); me.registerEvents(); me.control(me.createControls()); }, registerEvents: function() { var me = this; me.addEvents( me.getEventName('start-save-record'), me.getEventName('update-record-on-save'), me.getEventName('after-update-record-on-save'), me.getEventName('save-exception'), me.getEventName('before-send-save-request'), me.getEventName('save-successfully') ); }, createControls: function () { var me = this, alias, controls = {}; alias = Ext.ClassManager.getAliasesByName(me.getConfig('detailWindow')); if (!alias || alias.length <= 0) { return false; } alias = alias[0]; alias = alias.replace('widget.', ''); controls[alias] = me.createDetailWindowControls(); return controls; }, createDetailWindowControls: function() { var me = this, events = {}; events[me.getEventName('save')] = me.onSave; return events; }, onSave: function(window, record) { var me = this, proxy = record.getProxy(), data, form = window.formPanel; if (!form.getForm().isValid()) { Shopware.Notification.createGrowlMessage( me.getConfig('invalidFormTitle'), me.getConfig('invalidFormMessage') ); return false; } if (!Shopware.app.Application.fireEvent(me.getEventName('start-save-record'), me, window, record, form)) { return false; } if (Shopware.app.Application.fireEvent(me.getEventName('update-record-on-save'), me, window, record, form)) { form.getForm().updateRecord(record); } Shopware.app.Application.fireEvent(me.getEventName('after-update-record-on-save'), me, window, record, form); proxy.on('exception', function (proxy, response) { window.setLoading(false); data = Ext.decode(response.responseText); Shopware.app.Application.fireEvent(me.getEventName('save-exception'), me, data, window, record, form); if (data.violations && data.violations.length > 0) { me.createViolationMessage(data.violations); me.markFieldsAsInvalid(window, data.violations); } }, me, { single: true }); window.setLoading(true); if (!Shopware.app.Application.fireEvent(me.getEventName('before-send-save-request'), me, window, record, form)) { return false; } record.save({ success: function(result) { window.setLoading(false); Shopware.app.Application.fireEvent(me.getEventName('save-successfully'), me, result, window, record, form); Shopware.Notification.createGrowlMessage( me.getConfig('saveSuccessTitle'), me.getConfig('saveSuccessMessage') ); window.loadRecord(result); } }); }, createViolationMessage: function(violations) { var me = this, template = ''; Ext.each(violations, function(violation) { template += '
  • ' + violation.property + ': ' + violation.message + '
  • '; }); template = ''; Shopware.Notification.createStickyGrowlMessage({ title: me.getConfig('violationErrorTitle'), text: template, width: 400 }); }, markFieldsAsInvalid: function(window, violations) { var me = this; Ext.each(violations, function(violation) { var field = me.getFieldByName(window.formPanel.getForm().getFields().items, violation.property); if (field) { field.focus(); field.markInvalid(violation.message); } }); }, getEventName: function (name) { return this.getConfig('eventAlias') + '-' + name; } }); Ext.define('Shopware.listing.InfoPanel', { extend: 'Ext.panel.Panel', alias: 'widget.shopware-listing-info-panel', mixins: { helper: 'Shopware.model.Helper' }, region: 'east', width: 200, cls: 'detail-view', collapsible: true, layout: 'fit', infoView: undefined, listingWindow: undefined, gridPanel: undefined, title: 'Detail Informationen', statics: { displayConfig: { model: undefined, fields: { }, emptyText: 'Kein Eintrag selektiert.' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, initComponent: function() { var me = this; me.checkRequirements(); me.gridPanel = me.listingWindow.gridPanel; me.items = me.createItems(); me.addEventListeners(); me.callParent(arguments); }, checkRequirements: function() { var me = this; if (!(me.listingWindow instanceof Ext.window.Window)) { me.throwException(me.$className + ": Component requires a passed listingWindow property which contains the instance of the assigned Shopware.window.Listing"); } if (!(me.listingWindow.gridPanel instanceof Shopware.grid.Panel)) { me.throwException(me.$className + ": The listingWindow.gridPanel property contains no Shopware.grid.Panel instance."); } if (me.alias.length <= 0) { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (me.alias.length === 1 && me.alias[0] === 'widget.shopware-listing-info-panel') { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } }, addEventListeners: function() { var me = this; me.gridPanel.on(me.gridPanel.eventAlias + '-selection-changed', function(grid, selModel, records) { var record = { }; if (records.length > 0) { record = records.shift(); } me.updateInfoView(record); }); }, createItems: function() { var me = this, items = []; items.push(me.createInfoView()); return items; }, createInfoView: function(){ var me = this; me.infoView = Ext.create('Ext.view.View', { tpl: me.createTemplate(), flex: 1, autoScroll: true, padding: 5, style: 'color: #6c818f;font-size:11px', emptyText: '
    ' + me.getConfig('emptyText') + '
    ', deferEmptyText: false, itemSelector: 'div.item', renderData: [] }); return me.infoView; }, createTemplate: function() { var me = this, fields = [], model, keys, field, config, configFields = me.getConfig('fields'); if (me.getConfig('model')) { model = Ext.create(me.getConfig('model')); keys = model.fields.keys; if (Object.keys(configFields).length > 0) keys = Object.keys(configFields); Ext.each(keys, function(key) { field = me.getFieldByName(model.fields.items, key); config = configFields[key]; if (Ext.isFunction(config)) { field = config.call(me, me, field); if (field) fields.push(field); } else if (Ext.isObject(config) || (Ext.isString(config) && config.length > 0)) { fields.push(config); } else { fields.push(me.createTemplateForField(model, field)); } }); } return new Ext.XTemplate( '', '
    ', fields.join(''), '
    ', '
    ' ); }, createTemplateForField: function(model, field) { var me = this; return '

    ' + me.getHumanReadableWord(field.name) +': {' + field.name + '}

    ' }, updateInfoView: function(record) { var me = this; if (record.data) { me.infoView.update(record.data); } else { me.infoView.update(me.infoView.emptyText); } return true; } }); Ext.define('Shopware.listing.FilterPanel', { extend: 'Ext.form.Panel', alias: 'widget.shopware-listing-filter-panel', mixins: { helper: 'Shopware.model.Helper', container: 'Shopware.model.Container' }, region: 'west', width: 300, cls: 'detail-view', collapsible: true, layout: 'anchor', title: 'Filter', listingWindow: undefined, gridPanel: undefined, infoText: undefined, toolbar: undefined, filterButton: undefined, resetButton: undefined, fieldAssociations: [ ], statics: { displayConfig: { eventAlias: undefined, controller: undefined, searchUrl: '/backend/base/searchAssociation', model: undefined, fields: { }, infoText: 'Aktivieren Sie der verschiedenen Felder über die davor angezeigte Checkbox. Aktivierte Felder werden mit einer UND Bedingung verknüpft.', filterButtonText: 'Filter anwenden', resetButtonText: 'Filter zurücksetzen' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); if (config.controller) { config.searchUrl = config.searchUrl.replace( '/backend/base/', '/backend/' + config.controller + '/' ); } return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, initComponent: function() { var me = this; me.checkRequirements(); me.eventAlias = me.getConfig('eventAlias'); if (!me.eventAlias) me.eventAlias = me.getEventAlias(me.getConfig('model')); me.registerEvents(); me.gridPanel = me.listingWindow.gridPanel; me.items = me.createItems(); me.dockedItems = me.createDockedItems(); me.callParent(arguments); }, checkRequirements: function() { var me = this; if (!me.getConfig('controller')) { me.throwException(me.$className + ": Component requires the `controller` property in the configure() function"); } if (!me.getConfig('model')) { me.throwException(me.$className + ": Component requires the `model` property in the configure() function"); } if (me.alias.length <= 0) { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } if (me.alias.length === 1 && me.alias[0] === 'widget.shopware-listing-filter-panel') { me.throwException(me.$className + ": Component requires a configured Ext JS widget alias."); } }, registerEvents: function() { this.addEvents( this.eventAlias + '-before-apply-field-filter', this.eventAlias + '-before-grid-load-filter', this.eventAlias + '-before-filter-grid', this.eventAlias + '-after-filter-grid' ); }, createItems: function() { var me = this, items = []; items.push(me.createInfoText()); items.push(me.createFilterFields()); return items; }, createInfoText: function() { var me = this; me.infoText = Ext.create('Ext.container.Container', { html: me.getConfig('infoText'), style: 'color: #6c818f; font-size: 11px; line-height: 14px;', margin: '0 0 10' }); return me.infoText; }, createFilterFields: function() { var me = this, items = [], field, config, record = Ext.create(me.getConfig('model')); me.fieldAssociations = me.getAssociations(me.getConfig('model'), [ { relation: 'ManyToOne' } ]); var configFields = me.getConfig('fields'); Ext.each(record.fields.items, function(modelField) { if (Object.keys(configFields).length > 0 && !(configFields.hasOwnProperty(modelField.name))) { return true; } config = configFields[modelField.name]; if (Ext.isString(config)) config = { fieldLabel: config }; field = me.createModelField(record, modelField, undefined, config); if (!field) return true; var container = Ext.create('Shopware.filter.Field', { field: field, subApp: me.subApp }); field.container = container; items.push(container); }); return Ext.create('Ext.container.Container', { items: items, layout: 'anchor', anchor: '100%', defaults: { anchor: '100%' } }); }, createDockedItems: function() { var me = this; return [ me.createToolbar() ]; }, createToolbar: function() { var me = this; me.toolbar = Ext.create('Ext.toolbar.Toolbar', { items: [ me.createFilterButton(), me.createResetButton() ], dock: 'bottom' }); return me.toolbar; }, createFilterButton: function() { var me = this; me.filterButton = Ext.create('Ext.button.Button', { cls: 'secondary small', iconCls: 'sprite-funnel', text: me.getConfig('filterButtonText'), handler: function() { me.filterGridStore(); } }); return me.filterButton; }, createResetButton: function() { var me = this; me.resetButton = Ext.create('Ext.button.Button', { cls: 'secondary small', iconCls: 'sprite-funnel--minus', text: me.getConfig('resetButtonText'), handler: function() { me.getForm().reset(); me.gridPanel.getStore().clearFilter(true); me.gridPanel.getStore().load(); } }); return me.resetButton; }, filterGridStore: function() { var me = this; if (!me.fireEvent(me.eventAlias + '-before-filter-grid', me, me.gridPanel)) { return false; } me.gridPanel.getStore().clearFilter(true); me.createFilters(); me.fireEvent(me.eventAlias + '-before-grid-load-filter', me, me.gridPanel); me.gridPanel.getStore().load({ callback: function(records, operation) { me.fireEvent(me.eventAlias + '-after-filter-grid', me, me.gridPanel, records, operation); } }); }, createFilters: function() { var me = this, model = Ext.create(me.getConfig('model')), values = me.getForm().getValues(); Object.keys(values).forEach(function (key) { if (me.getFieldByName(model.fields.items, key) === undefined) { return true; } if (!me.fireEvent(me.eventAlias + '-before-apply-field-filter', me, me.gridPanel, key, values[key])) { return true; } me.gridPanel.getStore().filters.add(key, Ext.create('Ext.util.Filter', { property: key, value: values[key] }) ); }); } }); Ext.define('Shopware.filter.Field', { extend: 'Ext.form.FieldContainer', padding: 10, layout: { type: 'hbox', align: 'stretch' }, style: 'background: #fff', mixins: { helper: 'Shopware.model.Helper' }, checkbox: undefined, field: undefined, statics: { displayConfig: { }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, initComponent: function() { var me = this; me.checkbox = Ext.create('Ext.form.field.Checkbox', { width: 28, margin: '2 0 0 0' }); me.checkbox.on('change', function(checkbox, value) { var field = me.items.items[1]; if (!field) return false; if (value) { field.enable(); } else { field.disable() } }); me.field.flex = 1; me.field.labelWidth = 100; me.field.disabled = true; me.field.margin = 0; me.items = [ me.checkbox, me.field ]; me.callParent(arguments); } }); Ext.define('Shopware.store.Association', { extend: 'Ext.data.Store', mixins: { helper: 'Shopware.model.Helper' }, autoLoad: false, batch: true, remoteSort: true, remoteFilter: true, pageSize: 20, statics: { displayConfig: { controller: undefined, searchUrl: '/backend/base/reloadAssociation' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); if (config.controller) { config.searchUrl = config.searchUrl.replace( '/backend/base/', '/backend/' + config.controller + '/' ); } return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, constructor: function (config) { var me = this; me.association = config.association; me.extraParams = config.extraParams; me._opts = me.statics().getDisplayConfig(config, this); return me.callParent(config); }, load: function(options) { var me = this, operation, proxy; me.checkRequirements(); proxy = Ext.create('Ext.data.proxy.Ajax', { url: me.getConfig('searchUrl'), extraParams: me.extraParams, reader: Ext.create('Ext.data.reader.Json', { root: 'data', totalProperty: 'total', model: me.model }) }); options = Ext.apply({ action: 'read', filters: me.filters.items, sorters: me.getSorters() }, options); options.page = options.page || me.currentPage; options.start = (options.start !== undefined) ? options.start : (options.page - 1) * me.pageSize; options.limit = options.limit || me.pageSize; me.lastOptions = options; operation = new Ext.data.Operation(options); if (me.fireEvent('beforeload', me, operation) !== false) { me.loading = true; proxy.read(operation, me.onProxyLoad, me); } return me; }, checkRequirements: function() { var me = this; if (!me.getConfig('controller')) { me.throwException(me.$className + ": Reload not available. Please configure the store `controller` property."); } } }); Ext.define('Shopware.form.field.Media', { extend: 'Ext.form.FieldContainer', alias: 'widget.shopware-media-field', layout: { type: 'hbox', align: 'stretch' }, mixins: [ 'Shopware.model.Helper', 'Ext.form.field.Base' ], height: 115, mediaPath: '/', noMedia: '/templates/_default/frontend/_resources/images/no_picture.jpg', value: undefined, path: undefined, mediaId: undefined, valueField: 'id', selectButton: undefined, resetButton: undefined, preview: undefined, albumId: undefined, validTypes: [ ], record: undefined, buttonContainer: undefined, previewContainer: undefined, statics: { displayConfig: { selectButtonText: 'Medium selektieren', resetButtonText: 'Medium zurücksetzen' }, getDisplayConfig: function (userOpts, definition) { var config = { }; if (userOpts && typeof userOpts.configure == 'function') { config = Ext.apply({ }, config, userOpts.configure()); } if (definition && typeof definition.configure === 'function') { config = Ext.apply({ }, config, definition.configure()); } config = Ext.apply({ }, config, this.displayConfig); return config; }, setDisplayConfig: function (prop, val) { var me = this; if (!me.displayConfig.hasOwnProperty(prop)) { return false; } me.displayConfig[prop] = val; return true; } }, configure: function() { return { }; }, constructor: function (opts) { var me = this; me._opts = me.statics().getDisplayConfig(opts, this); me.callParent(arguments); }, getConfig: function (prop) { var me = this; return me._opts[prop]; }, initComponent: function() { var me = this; me.items = me.createItems(); me.callParent(arguments); }, createItems: function() { var me = this; return [ me.createButtonContainer(), me.createPreviewContainer() ]; }, createButtonContainer: function() { var me = this; me.buttonContainer = Ext.create('Ext.container.Container', { width: 180, padding: '0 10', style: "background: #fff", layout: { type: 'vbox', align: 'stretch' }, items: [ me.createSelectButton(), me.createResetButton() ] }); return me.buttonContainer; }, createPreviewContainer: function() { var me = this; me.previewContainer = Ext.create('Ext.container.Container', { flex: 1, style: "background: #fff", items: [ me.createPreview() ] }); return me.previewContainer; }, createSelectButton: function() { var me = this; me.selectButton = Ext.create('Ext.button.Button', { text: me.getConfig('selectButtonText'), iconCls: 'sprite-inbox-image', cls: 'secondary small', margin: '10 0', handler: function() { me.openMediaManager() } }); return me.selectButton; }, createResetButton: function() { var me = this; me.resetButton = Ext.create('Ext.button.Button', { text: me.getConfig('resetButtonText'), iconCls: 'sprite-inbox--minus', cls: 'secondary small', handler: function() { me.removeMedia(); } }); return me.resetButton; }, removeMedia: function() { var me = this; me.value = null; me.path = null; me.mediaId = null; me.preview.setSrc(me.noMedia); }, createPreview: function() { var me = this; me.preview = Ext.create('Ext.Img', { src: me.mediaPath + me.value, height: 100, maxHeight: 100, padding: 5, margin: 5, style: "border-radius: 6px; border: 1px solid #c4c4c4;" }); return me.preview; }, openMediaManager: function() { var me = this; if (!(me.fireEvent('before-open-media-manager', me))) { return false; } Shopware.app.Application.addSubApplication({ name: 'Shopware.apps.MediaManager', layout: 'small', eventScope: me, params: { albumId: me.albumId }, mediaSelectionCallback: me.onSelectMedia, selectionMode: false, validTypes: me.validTypes || [] }); me.fireEvent('after-open-media-manager', me); }, onSelectMedia: function(button, window, selection) { var me = this, record = selection[0]; if (!(record instanceof Ext.data.Model)) { return true; } me.record = record; me.path = record.get('path'); me.mediaId = record.get('id'); me.value = record.get(me.valueField); me.updatePreview(me.path); window.close(); }, updatePreview: function(image) { this.preview.setSrc( this.mediaPath + image ); }, getValue: function() { return this.value; }, setValue: function(value) { var me = this; if (value !== me.value) { me.requestMediaData(value); } this.value = value; this.updatePreview(value); }, getSubmitData: function() { var value = {}; value[this.name] = this.value; return value; }, requestMediaData: function(value) { var me = this, params = {}; params[me.valueField] = value; Ext.Ajax.request({ url: '/backend/mediaManager/getMedia', method: 'POST', params: params, success: function(response) { var operation = Ext.decode(response.responseText); if (operation.success == true) { me.record = Ext.create('Shopware.apps.Base.model.Media', operation.data); me.mediaId = me.record.get('id'); me.path = me.record.get('path'); me.updatePreview(me.path); } } }); } }); Ext.define('Shopware.apps.Base.model.User', { alternateClassName:'Shopware.model.User', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name:'id', type:'int' }, { name:'roleId', type:'int' }, { name:'username', type:'string' }, { name:'password', type:'string' }, { name:'localeId', type:'int' }, { name:'sessionId', type:'string' }, { name:'lastLogin', type:'date' }, { name:'name', type:'string' }, { name:'email', type:'string' }, { name:'active', type:'int' }, { name:'admin', type:'int' }, { name:'salted', type:'int' }, { name:'failedLogins', type:'int' }, { name:'lockedUntil', type:'date' } ] }); Ext.define('Shopware.apps.Base.model.Category', { alternateClassName: 'Shopware.model.Category', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name : 'id', type:'int' }, { name : 'parent', type:'int' }, { name : 'name', type:'string' }, { name : 'position', type:'int' }, { name : 'active', type:'boolean', defaultValue: true }, { name : 'childrenCount', type: 'int' }, { name : 'text', type: 'string' }, { name : 'cls', type: 'string' }, { name : 'leaf', type: 'boolean' }, { name : 'allowDrag', type: 'boolean' } ] }); Ext.define('Shopware.apps.Base.model.CustomerGroup', { alternateClassName: 'Shopware.model.CustomerGroup', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name: 'id', type: 'int' }, { name: 'key', type: 'string' }, { name: 'name', type: 'string' }, { name: 'tax', type: 'boolean', defaultValue: true }, { name: 'taxInput', type: 'boolean', defaultValue: true }, { name: 'mode', type: 'boolean' }, { name: 'discount', type: 'float', useNull:true } ] }); Ext.define('Shopware.apps.Base.model.Dispatch', { alternateClassName: 'Shopware.model.Dispatch', extend: 'Shopware.data.Model', idProperty : 'id', fields: [ { name : 'id', type : 'int' }, { name : 'name', type : 'string' }, { name : 'type', type : 'int' }, { name : 'comment', type : 'string' }, { name : 'active', type : 'int' }, { name : 'position', type : 'int' } ] }); Ext.define('Shopware.apps.Base.model.Payment', { snippets: { debit: 'Lastschrift', cash: 'Nachnahme', invoice: 'Rechnung', prepayment: 'Vorkasse', paypalexpress: 'PayPal' }, alternateClassName: 'Shopware.model.Payment', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name:'id', type: 'int' }, { name:'name', type: 'string' }, { name:'description', type: 'string', convert: function(value, record) { var snippet = value; if (record && record.snippets) { snippet = record.snippets[record.get('name')]; } if (Ext.isString(snippet) && snippet.length > 0) { return snippet; } else { return value; } } }, { name:'position', type: 'int' }, { name:'active', type: 'int' } ] }); Ext.define('Shopware.apps.Base.model.Shop', { alternateClassName:'Shopware.model.Shop', extend:'Shopware.data.Model', fields:[ { name:'id', type:'int' }, { name:'default', type:'boolean' }, { name:'localeId', type:'int' }, { name:'categoryId', type:'int' }, { name:'name', type:'string' } ] }); Ext.define('Shopware.apps.Base.model.Supplier', { alternateClassName: 'Shopware.model.Supplier', extend: 'Shopware.data.Model', idProperty : 'id', fields: [ { name : 'id', type : 'int' }, { name : 'name', type : 'string' }, { name : 'image', type : 'string' }, { name : 'link', type : 'string' }, { name : 'description', type : 'string' } ] }); Ext.define('Shopware.apps.Base.model.Country', { alternateClassName: 'Shopware.model.Country', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name: 'id', type: 'int' }, { name: 'name', type: 'string' }, { name: 'iso', type: 'string' }, { name: 'isoName', type: 'string' }, { name: 'position', type: 'int' }, { name: 'active', type: 'boolean' } ] }); Ext.define('Shopware.apps.Base.model.Article', { alternateClassName:'Shopware.model.Article', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name:'id', type:'int' }, { name:'number', type:'string' }, { name:'name', type:'string' }, { name:'description', type:'string' }, { name:'supplierName', type:'string' }, { name:'supplierId', type:'int' }, { name:'active', type:'int' }, { name:'detailId', type:'int' }, { name:'changeTime', type:'date' }, { name:'inStock', type:'int' } ] }); Ext.define('Shopware.apps.Base.model.Locale', { alternateClassName: ['Shopware.model.Locales', 'Shopware.model.Locale'], extend: 'Shopware.data.Model', idProperty : 'id', fields: [ { name : 'id', type : 'int' }, { name: 'name', type: 'string', convert: function(v, record) { return record.data.language + ' (' + record.data.territory + ')'; } }, { name: 'language', type : 'string' }, { name: 'territory', type : 'string' }, { name: 'locale', type : 'string' } ] }); Ext.define('Shopware.apps.Base.model.Currency', { alternateClassName: 'Shopware.model.Currency', extend: 'Shopware.data.Model', idProperty : 'id', fields: [ { name : 'id', type : 'int' }, { name : 'name', type : 'string' }, { name : 'currency', type : 'string' } ] }); Ext.define('Shopware.apps.Base.model.PaymentStatus', { snippets: { state9: 'Teilweise in Rechnung gestellt', state10: 'Komplett in Rechnung gestellt', state11: 'Teilweise bezahlt', state12: 'Komplett bezahlt', state13: '1. Mahnung', state14: '2. Mahnung', state15: '3. Mahnung', state16: 'Inkasso', state17: 'Offen', state18: 'Reserviert', state19: 'Verzoegert', state20: 'Wiedergutschrift', state21: 'Überprüfung notwendig', state30: 'Es wurde kein Kredit genehmigt', state31: 'Der Kredit wurde vorlaeufig akzeptiert', state32: 'Der Kredit wurde genehmigt', state33: 'Die Zahlung wurde von der Hanseatic Bank angewiesen', state34: 'Es wurde eine Zeitverlaengerung eingetragen', state35: 'Vorgang wurde abgebrochen' }, alternateClassName: 'Shopware.model.PaymentStatus', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name:'id', type: 'int' }, { name:'description', type: 'string', convert: function(value, record) { var snippet = value; if (record && record.snippets) { snippet = record.snippets['state' + record.get('id')]; } if (Ext.isString(snippet) && snippet.length > 0) { return snippet; } else { return value; } } } ] }); Ext.define('Shopware.apps.Base.model.OrderStatus', { snippets: { state0: 'Abgebrochen', state1: 'Offen', state2: 'In Bearbeitung (Wartet)', state3: 'Komplett abgeschlossen', state4: 'Teilweise abgeschlossen', state5: 'Storniert / Abgelehnt', state6: 'Zur Lieferung bereit', state7: 'Teilweise ausgeliefert', state8: 'Komplett ausgeliefert', state9: 'Klärung notwendig' }, alternateClassName: 'Shopware.model.OrderStatus', extend:'Shopware.data.Model', idProperty:'id', fields:[ { name:'id', type: 'int' }, { name:'description', type: 'string', convert: function(value, record) { var snippet = value; var internalId = record.get('id') + 1; if (record && record.snippets) { snippet = record.snippets['state' + internalId]; } if (Ext.isString(snippet) && snippet.length > 0) { return snippet; } else { return value; } } } ] }); Ext.define('Shopware.apps.Base.model.Address', { alternateClassName: 'Shopware.model.Address', extend:'Shopware.data.Model', fields:[ { name:'salutation', type:'string' }, { name:'company', type:'string' }, { name:'department', type:'string' }, { name:'firstName', type:'string' }, { name:'lastName', type:'string' }, { name:'street', type:'string' }, { name:'streetNumber', type:'string' }, { name:'zipCode', type:'string' }, { name:'city', type:'string' }, { name:'countryId', type:'int', useNull: true } ] }); Ext.define('Shopware.apps.Base.model.BillingAddress', { alternateClassName: 'Shopware.model.BillingAddress', extend:'Shopware.apps.Base.model.Address', fields:[ { name:'number', type:'string' }, { name:'phone', type:'string' }, { name:'fax', type:'string' }, { name:'vatId', type:'string' } ] }); Ext.define('Shopware.apps.Base.model.Customer', { alternateClassName: 'Shopware.model.Customer', extend:'Shopware.data.Model', fields:[ { name:'id', type:'int' }, { name:'groupKey', type:'string' }, { name:'email', type:'string' }, { name:'active', type:'boolean' }, { name:'accountMode', type:'int' }, { name:'confirmationKey', type:'string' }, { name:'paymentId', type:'int', useNull: true }, { name:'firstLogin', type:'date' }, { name:'lastLogin', type:'date' }, { name:'newsletter', type:'int' }, { name:'validation', type:'int' }, { name:'languageId', type:'int' }, { name:'shopId', type:'int', useNull: true }, { name:'priceGroupId', type:'int' }, { name:'internalComment', type:'string' }, { name:'failedLogins', type:'int' }, { name:'referer', type:'string' } ] }); Ext.define('Shopware.apps.Base.model.Tax', { alternateClassName:'Shopware.model.Tax', extend : 'Shopware.data.Model', idProperty:'id', fields : [ { name : 'id', type: 'integer' }, { name : 'tax',type: 'float' }, { name : 'name',type: 'string' } ] }); Ext.define('Shopware.apps.Base.model.Media', { extend: 'Shopware.data.Model', configure: function() { return { field: 'Shopware.form.field.Media' }; }, fields: [ 'created', 'description', 'extension', 'id', 'name', 'type', 'path', 'userId', 'width', 'height', 'albumId' ] }); Ext.define('Shopware.apps.Base.model.Template', { alternateClassName: 'Shopware.model.Template', extend: 'Ext.data.Model', idProperty : 'id', fields: [ { name: 'id', type : 'int' }, { name: 'name', type: 'string' }, { name: 'template', type : 'string' } ] }); Ext.define('Shopware.apps.Base.model.CountryArea', { extend: 'Shopware.data.Model', fields: [ { name: 'id', type:'int' }, { name: 'name', type: 'string', convert: function(v) { return v.charAt(0).toUpperCase() + v.substr(1); } }, { name: 'active', type: 'boolean' } ] }); Ext.define('Shopware.apps.Base.model.CountryState', { extend: 'Shopware.data.Model', fields: [ { name: 'id', type: 'int' }, { name: 'countryId', type: 'int' }, { name: 'name', type: 'string' }, { name: 'shortCode', type: 'string' }, { name: 'position', type: 'int' }, { name: 'active', type: 'boolean' } ] }); Ext.define('Shopware.apps.Base.model.Form', { extend: 'Ext.data.Model', alternateClassName: 'Shopware.model.Form', fields: [ { name: 'id', type: 'int', useNull: true }, { name: 'label', type: 'string' }, { name: 'name', type: 'string' }, { name: 'description', type: 'string' } ], associations: [{ type: 'hasMany', model: 'Shopware.apps.Base.model.Element', name: 'getElements', associationKey: 'elements' }] }); Ext.define('Shopware.apps.Base.model.Element', { extend: 'Ext.data.Model', alternateClassName: 'Shopware.model.Element', fields: [ { name: 'id', type: 'int', useNull: true }, { name: 'name', type: 'string' }, { name: 'value' }, { name: 'label', type: 'string' }, { name: 'description', type: 'string', useNull: true }, { name: 'type', type: 'string', useNull: true }, { name: 'required', type: 'boolean' }, { name: 'scope', type: 'int' }, 'options' ], associations: [{ type: 'hasMany', model: 'Shopware.apps.Base.model.Value', name: 'getValues', associationKey: 'values' }] }); Ext.define('Shopware.apps.Base.model.Value', { extend: 'Ext.data.Model', alternateClassName: 'Shopware.model.Value', fields: [ { name: 'id', type: 'int', useNull: true }, { name: 'shopId', type: 'int' }, { name: 'value', defaultValue: null, useNull: true } ] }); Ext.define('Shopware.apps.Base.model.PositionStatus', { snippets: { state0: 'Offen', state1: 'In Bearbeitung (Wartet)', state2: 'Abgebrochen', state3: 'Komplett abgeschlossen' }, alternateClassName: 'Shopware.model.PositionStatus', extend:'Shopware.data.Model', fields:[ { name:'id', type: 'int' }, { name:'description', type: 'string', convert: function(value, record) { var snippet = value; if (record && record.snippets) { snippet = record.snippets['state' + record.get('id')]; } if (Ext.isString(snippet) && snippet.length > 0) { return snippet; } else { return value; } } } ] }); Ext.define('Shopware.apps.Base.model.DocType', { snippets: { type1: 'Rechnung', type2: 'Lieferschein', type3: 'Gutschrift', type4: 'Stornorechnung' }, extend:'Ext.data.Model', fields:[ { name: 'id', type: 'int' }, { name:'name', type: 'string', convert: function(value, record) { var snippet = value; var internalId = 'type' + record.get('id'); if (record && record.snippets) { snippet = record.snippets[internalId]; } if (Ext.isString(snippet) && snippet.length > 0) { return snippet; } else { return value; } } }, { name: 'template', type: 'string' }, { name: 'numbers', type: 'string' }, { name: 'left', type: 'int' }, { name: 'right', type: 'int' }, { name: 'top', type: 'int' }, { name: 'bottom', type: 'int' }, { name: 'pageBreak', type: 'int' } ] }); Ext.define('Shopware.apps.Base.model.PasswordEncoder', { alternateClassName: 'Shopware.model.PasswordEncoder', extend:'Ext.data.Model', fields:[ { name:'id', type:'string' } ] }); Ext.define('Shopware.apps.Base.store.User', { alternateClassName: 'Shopware.store.User', extend: 'Ext.data.Store', storeId: 'base.User', pageSize: 10, autoLoad: false, remoteSort: true, remoteFilter: true, model : 'Shopware.apps.Base.model.User', proxy:{ type:'ajax', url:'/backend/base/getUsers', reader:{ type:'json', root:'data', totalProperty:'total' } } }); Ext.define('Shopware.apps.Base.store.Category', { alternateClassName: 'Shopware.store.Category', extend: 'Ext.data.Store', storeId: 'base.Category', remoteSort: true, remoteFilter: true, model : 'Shopware.apps.Base.model.Category', proxy:{ type:'ajax', url:'/backend/base/getCategories', reader:{ type:'json', root:'data', totalProperty:'total' } }, filters: [{ property: 'c.parentId', value: 1 }] }).create(); Ext.define('Shopware.apps.Base.store.CategoryTree', { alternateClassName: 'Shopware.store.CategoryTree', extend : 'Ext.data.TreeStore', storeId: 'base.CategoryTree', autoLoad: false, model : 'Shopware.apps.Base.model.Category', proxy : { type : 'ajax', api : { read : '/backend/category/getList' }, reader : { type : 'json', root: 'data' } } }).create(); Ext.define('Shopware.apps.Base.store.CustomerGroup', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.CustomerGroup', storeId: 'base.CustomerGroup', model : 'Shopware.apps.Base.model.CustomerGroup', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getCustomerGroups', reader:{ type:'json', root:'data', totalProperty:'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Dispatch', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Dispatch', storeId: 'base.Dispatch', model : 'Shopware.apps.Base.model.Dispatch', pageSize: 1000, proxy: { type: 'ajax', url: '/backend/base/getDispatches', reader: { type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Payment', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Payment', storeId: 'base.Payment', model : 'Shopware.apps.Base.model.Payment', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getPayments', reader:{ type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Shop', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Shop', storeId: 'base.Shop', model : 'Shopware.apps.Base.model.Shop', pageSize: 1000, remoteSort: true, remoteFilter: true, proxy:{ type:'ajax', url: '/backend/base/getShops', reader:{ type:'json', root:'data', totalProperty:'total' } }, filters: [{ property: 'main', value: null }] }).create(); Ext.define('Shopware.apps.Base.store.ShopLanguage', { extend: 'Shopware.apps.Base.store.Shop', alternateClassName: 'Shopware.store.ShopLanguage', storeId: 'base.ShopLanguage', filters: [ ] }).create(); Ext.define('Shopware.apps.Base.store.Translation', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Translation', storeId: 'base.Translation', model : 'Shopware.apps.Base.model.Shop', pageSize: 1000, remoteSort: true, remoteFilter: true, proxy:{ type:'ajax', url: '/backend/base/getShops', reader:{ type:'json', root:'data', totalProperty:'total' } }, filters: [{ property: 'default', value: false }] }).create(); Ext.define('Shopware.apps.Base.store.Supplier', { alternateClassName: 'Shopware.store.Supplier', extend: 'Ext.data.Store', storeId: 'base.Supplier', autoLoad: false, remoteSort: true, remoteFilter: true, model : 'Shopware.apps.Base.model.Supplier', proxy: { type: 'ajax', url: '/backend/base/getSuppliers', reader: { type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Country', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Country', storeId: 'base.Country', model : 'Shopware.apps.Base.model.Country', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getCountries', reader:{ type:'json', root:'data', totalProperty:'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Article', { alternateClassName: 'Shopware.store.Article', extend: 'Ext.data.Store', storeId: 'base.Article', pageSize: 10, autoLoad: false, remoteSort: true, remoteFilter: true, model : 'Shopware.apps.Base.model.Article', proxy:{ type:'ajax', url:'/backend/base/getArticles', reader:{ type:'json', root:'data', totalProperty:'total' } } }); Ext.define('Shopware.apps.Base.store.Locale', { extend: 'Ext.data.Store', alternateClassName: [ 'Shopware.store.Locale', 'Shopware.store.Locales', 'Shopware.apps.Base.store.Locales' ], storeId: 'base.Locale', model : 'Shopware.apps.Base.model.Locale', pageSize: 1000, proxy: { type: 'ajax', url: '/backend/base/getLocales', reader: { type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Currency', { extend: 'Ext.data.Store', alternateClassName: [ 'Shopware.store.Currency' ], storeId: 'base.Currency', model : 'Shopware.apps.Base.model.Currency', pageSize: 1000, proxy: { type: 'ajax', url: '/backend/base/getCurrencies', reader: { type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.PaymentStatus', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.PaymentStatus', storeId: 'base.PaymentStatus', model : 'Shopware.apps.Base.model.PaymentStatus', pageSize: 1000, autoLoad: false, proxy:{ type:'ajax', url:'/backend/base/getPaymentStatus', reader:{ type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.OrderStatus', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.OrderStatus', storeId: 'base.OrderStatus', model : 'Shopware.apps.Base.model.OrderStatus', pageSize: 1000, autoLoad: false, proxy:{ type:'ajax', url:'/backend/base/getOrderStatus', reader:{ type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Tax', { extend : 'Ext.data.Store', alternateClassName: 'Shopware.store.Tax', storeId: 'base.Tax', model : 'Shopware.apps.Base.model.Tax', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getTaxes', reader:{ type:'json', root:'data', totalProperty:'total' } } }); Ext.define('Shopware.apps.Base.store.Template', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Template', storeId: 'base.Template', model : 'Shopware.apps.Base.model.Template', pageSize: 1000, proxy: { type: 'ajax', url: '/backend/base/getTemplates', reader: { type: 'json', root: 'data', totalProperty: 'total' } } }).create(); Ext.define('Shopware.apps.Base.store.CountryArea', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.CountryArea', storeId: 'base.CountryArea', model : 'Shopware.apps.Base.model.CountryArea', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getCountryAreas', reader:{ type:'json', root:'data', totalProperty:'total' } } }).create(); Ext.define('Shopware.apps.Base.store.CountryState', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.CountryState', storeId: 'base.CountryState', model : 'Shopware.apps.Base.model.CountryState', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getCountryStates', reader:{ type:'json', root:'data', totalProperty:'total' } } }).create(); Ext.define('Shopware.apps.Base.store.Form', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.Form', storeId: 'base.Form', model:'Shopware.apps.Base.model.Form', proxy: { type: 'ajax', url: '/backend/config/getForm', api: { create: '/backend/config/saveForm', update: '/backend/config/saveForm', destroy: '/backend/config/deleteForm' }, reader: { type: 'json', root: 'data' } } }); Ext.define('Shopware.apps.Base.store.PositionStatus', { extend: 'Ext.data.Store', autoLoad: false, model : 'Shopware.apps.Base.model.PositionStatus', alternateClassName: 'Shopware.store.PositionStatus', storeId: 'base.PositionStatus', pageSize: 1000, proxy:{ type:'ajax', url:'/backend/base/getDetailStatus', reader:{ type: 'json', root: 'data', totalProperty: 'total' } } }); Ext.define('Shopware.apps.Base.store.PasswordEncoder', { extend: 'Ext.data.Store', alternateClassName: 'Shopware.store.PasswordEncoder', storeId: 'base.PasswordEncoder', model : 'Shopware.apps.Base.model.PasswordEncoder', proxy:{ type:'ajax', url:'/backend/base/getAvailableHashes', reader:{ type:'json', root:'data', totalProperty:'total' } } }).create(); Ext.define('Shopware.button.HoverButton', { extend: 'Ext.button.Button', alias: 'widget.hoverbutton', afterRender: function() { var me = this; me.callParent(arguments); me.getEl().on('mouseover', me.onClick, me); }, onClick: function(event) { var me = this; if (me.preventDefault || (me.disabled && me.getHref()) && event) { event.preventDefault(); } if(!me.disabled) { me.doToggle(); me.maybeShowMenu(); me.fireHandler(event); } } }); Ext.define('Shopware.MediaManager.MediaSelection', { extend: 'Ext.form.field.Trigger', alternateClassName: [ 'Shopware.form.field.MediaSelection', 'Shopware.MediaSelection' ], alias: [ 'widget.mediafield', 'widget.mediaselectionfield' ], uses: [ 'Ext.button.Button', 'Ext.Component', 'Ext.layout.component.field.Field' ], componentLayout: 'triggerfield', buttonConfig: null, buttonText: 'Datei(en) auswählen...', buttonIconCls: 'sprite-inbox-image', buttonOnly: false, buttonMargin: 3, readOnly: true, multiSelect: true, albumId: null, onRender: function() { var me = this, inputEl, buttonWrap, mediaButton; me.callParent(arguments); me.registerEvents(); if (me.disabled) { me.disableItems(); } inputEl = me.inputEl; if(me.buttonOnly) { inputEl.setDisplayed(false); } buttonWrap = Ext.get(me.id + '-browseButtonWrap'); mediaButton = buttonWrap.down('.' + Ext.baseCSSPrefix + 'form-mediamanager-btn'); buttonWrap.setStyle('width', mediaButton.getWidth() + ((!me.buttonOnly) ? 3 : 0) + 'px'); buttonWrap.on('click', me.onOpenMediaManager, me); }, registerEvents: function() { var me = this; me.addEvents( 'renderMediaManagerButton', 'beforeOpenMediaManager', 'afterOpenMediaManager', 'selectMedia' ); return true; }, getRecords: function() { if(!this.selectedRecords) { return false; } return this.selectedRecords; }, getRecordsCount: function() { if(!this.selectedRecords) { return 0; } return this.selectedRecords.length; }, onOpenMediaManager: function() { var me = this; me.fireEvent('beforeOpenMediaManager', me); Shopware.app.Application.addSubApplication({ name: 'Shopware.apps.MediaManager', layout: 'small', eventScope: me, params: { albumId: me.albumId }, mediaSelectionCallback: me.onGetSelection, selectionMode: me.multiSelect, validTypes: me.validTypes || [] }); me.fireEvent('afterOpenMediaManager', me); }, onGetSelection: function(btn) { var me = this, win = btn.up('window'), dataPnl = win.down('.mediamanager-media-view'), selModel, selected; if(dataPnl.selectedLayout === 'grid') { dataPnl = dataPnl.dataView; } else { dataPnl = dataPnl.cardContainer.getLayout().getActiveItem(); } selModel = dataPnl.getSelectionModel(); selected = selModel.getSelection(); me.selectedRecords = selected; me.fireEvent('selectMedia', me, me.selectedRecords, selModel); if(me.selectedRecords.length > 1) { var paths = []; Ext.each(me.selectedRecords, function(record) { paths.push(record.get('path')); }); paths = paths.toString(); me.inputEl.dom.value = paths; } else { selected = me.selectedRecords[0]; me.inputEl.dom.value = selected.get('path'); } win.close(); }, onDestroy: function(){ Ext.destroyMembers(this, 'button'); this.callParent(); }, onEnable: function(){ var me = this; me.callParent(); }, onDisable: function(){ this.callParent(); this.disableItems(); }, reset : function(){ var me = this; if (me.rendered) { me.inputEl.dom.value = ''; } me.callParent(); }, disableItems: function(){ var button = this.button; if (button) { button.disable(); } }, getTriggerMarkup: function() { var me = this, result, btn = Ext.widget('button', Ext.apply({ preventDefault: false, cls: Ext.baseCSSPrefix + 'form-mediamanager-btn small secondary', style: (me.buttonOnly) ? '' : 'margin-left:' + me.buttonMargin + 'px', text: me.buttonText, iconCls: me.buttonIconCls }, me.buttonConfig)), btnCfg = btn.getRenderTree(); me.fireEvent('renderMediaManagerButton', me, btn); result = '' + Ext.DomHelper.markup(btnCfg) + ''; btn.destroy(); return result; } }); Ext.apply(Ext.form.VTypes, { password : function(val, field) { if (field.initialPassField) { var pwd = Ext.getCmp(field.initialPassField); return (val == pwd.getValue()); } return true; }, passwordText : 'Die eingegebenen Passwörter sind nicht gleich' }); Ext.apply(Ext.form.field.VTypes, { missingValidationErrorText: 'The remote vType validation needs a validationErrorMsg property', remote:function (val, field) { if (!field.validationUrl) { return true; } if (!field.validationErrorMsg) { Ext.Error.raise(this.missingValidationErrorText); return false; } if(!field.rendered) { return true; } if(!field.hasOwnProperty('hasBlurListener')) { field.on('blur', this.onFireRemoteValidation, this); field.hasBlurListener = true; } return (field.hasOwnProperty('oldValid')) ? field.oldValid : true; }, daterange:function(val, field) { var date = field.parseDate(val); if (!date) { return false; } if (field.startDateField && (!this.dateRangeMax || (date.getTime() != this.dateRangeMax.getTime()))) { var start = field.up('form').down('#' + field.startDateField); start.setMaxValue(date); start.validate(); this.dateRangeMax = date; } else if (field.endDateField && (!this.dateRangeMin || (date.getTime() != this.dateRangeMin.getTime()))) { var end = field.up('form').down('#' + field.endDateField); end.setMinValue(date); end.validate(); this.dateRangeMin = date; } return true; }, onFireRemoteValidation: function(field) { var parameters, val = field.getValue(); if(Ext.isDefined(field.oldValid)) { if(val == field.oldValue) { return field.oldValid; } } field.oldValue = val; if (!field.validationRequestParams){ parameters = { value:val, param:field.validationRequestParam }; } else { parameters = field.validationRequestParams; parameters.value = val; } Ext.Ajax.request({ async: false, url:field.validationUrl, params: parameters, success:function (response) { if (!response.responseText) { field.markInvalid(field.validationErrorMsg); field.vtypeText = field.validationErrorMsg; field.oldValid = false; } else { field.clearInvalid(); field.oldValid = true; } }, failure:function (response) { Shopware.Msg.createGrowlMessage('', field.validationErrorMsg, '', 'growl', false); return false; } }); } }); Ext.define('Shopware.form.field.TinyMCE', { extend: 'Ext.form.field.TextArea', alternateClassName: [ 'Shopware.form.TinyMCE', 'Ext.form.field.TinyMCE' ], alias: [ 'widget.tinymcefield', 'widget.tinymce' ], requires: [ 'Ext.form.field.TextArea', 'Ext.XTemplate' ], uses: [ 'Shopware.MediaManager.MediaSelection' ], statics: { initialized: false, settings: { cleanup : false, convert_urls : false, media_strict : false, relative_urls : true, language: Ext.editorLang.substring(0,2), mode: "textareas", theme: "advanced", skin: "o2k7", invalid_elements:'script,applet', plugins: "media_selection,fullscreen", theme_advanced_toolbar_location: "top", theme_advanced_resizing: true, theme_advanced_toolbar_align: "left", theme_advanced_statusbar_location: "bottom", extended_valid_elements : "font[size],iframe[frameborder|src|width|height|name|align|frameborder|allowfullscreen|id|class|style],script[src|type],object[width|height|classid|codebase|ID|value],param[name|value],embed[name|src|type|wmode|width|height|style|allowScriptAccess|menu|quality|pluginspage],video[autoplay|class|controls|id|lang|loop|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|preload|poster|src|style|title|width|height],audio[autoplay|class|controls|id|lang|loop|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|preload|src|style|title]", document_base_url: 'http://www.bautz-shop.de/', contentCSS: 'http://www.bautz-shop.de/templates/_default/backend/_resources/styles/tiny_mce.css?_dc=' + new Date().getTime(), skin_variant: 'shopware', theme_advanced_buttons1: 'undo,redo,|,bold,italic,underline,|,fontsizeselect,forecolor,|,bullist,numlist,|,justifyleft,justifycenter,justifyright,|,link,unlink,media_selection,|,code,fullscreen,', theme_advanced_buttons2: '', theme_advanced_buttons3: '', theme_advanced_buttons4: '' }, setGlobalSettings: function(userSettings) { Ext.apply(this.settings, userSettings); } }, hasPlaceholder: false, config: { editor: { } }, autoSize: Ext.emptyFn, noSourceErrorText: "The TinyMCE editor source files aren't included in the project", initComponent: function() { var me = this; me.callParent(arguments); if(window.tinymce) { me.statics.initialized = true; } me.registerEvents(); }, registerEvents: function() { var me = this; me.addEvents( 'beforerendereditor', 'rendereditor', 'afterrendereditor' ); return true; }, onRender: function(ct, position) { var me = this, el; Ext.applyIf(me.subTplData, { cols: me.cols, rows: me.rows }); me.callParent(arguments); el = me.inputEl; el.dom.setAttribute('tabIndex', -1); el.addCls('x-hidden'); me.initEditor(); me.registerEditorEvents(); }, initEditor: function() { var me = this, input = me.inputEl, height, placeholder = false; if(!window.tinyMCE) { Ext.Error.raise(me.noSourceErrorText); } me.config.editor = Ext.Object.merge(this.statics().settings, me.editor); if(me.height) { height = me.height - 12; me.config.editor.height = height; } if(me.readOnly) { me.config.editor.readOnly = true; } me.fireEvent('beforerendereditor', me, input.id, me.config.editor); me.tinymce = new tinymce.Editor(input.id, me.config.editor); me.fireEvent('rendereditor', me, me.tinymce, input.id, me.config.editor); me.tinymce.onChange.add(function(ed, values) { me.setRawValue(values.content); }); me.tinymce.onInit.add(function(ed, evt) { var dom = ed.dom, doc = ed.getDoc(), el = doc.content_editable ? ed.getBody() : (tinymce.isGecko ? doc : ed.getWin()); if((!me.value || !me.value.length) && me.emptyText && me.emptyText.length) { me.tinymce.setContent(me.emptyText); me.hasPlaceholder = true; tinymce.dom.Event.add(el, 'focus', function() { var value = me.tinymce.getContent(); value = Ext.util.Format.stripTags(value); if(value === me.emptyText) { me.tinymce.setContent(''); } }); } tinymce.dom.Event.add(el, 'blur', function() { var value = me.tinymce.getContent(); me.setRawValue(value); value = Ext.util.Format.stripTags(value); if(me.hasPlaceholder && !value.length || (value == me.emptyText)) { me.tinymce.setContent(me.emptyText); } }); }); me.tinymce.render(); me.fireEvent('afterrendereditor', me, me.tinymce, input.id, me.config.editor); window.setTimeout(function() { me.changeSniffer = window.setInterval(function() { var value = me.tinymce.getContent(); me.setRawValue(value); }, 300); }, 500); }, registerEditorEvents: function() { var me = this; me.on({ 'resize': { scope: me, fn: me.onEditorResize } }) }, onEditorResize: function(view, width, height) { var me = this, editor = me.tinymce, edTable = Ext.get(editor.id + "_tbl"), edIframe = Ext.get(editor.id + "_ifr"), edToolbar = Ext.get(editor.id + "_xtbar"); if(!edTable) { return false; } width = (width < 100) ? 100 : (width - 205); height = (height < 129) ? 129 : (height - 100); var toolbarWidth = width; if(edTable) { toolbarWidth = width - edTable.getFrameWidth( "lr" ); } var toolbarHeight = 0; if(edToolbar) { toolbarHeight = edToolbar.getHeight(); var toolbarTd = edToolbar.findParent( "td", 5, true ); toolbarHeight += toolbarTd.getFrameWidth( "tb" ); edToolbar.setWidth( toolbarWidth ); } var edStatusbarTd = edTable.child( ".mceStatusbar" ); var statusbarHeight = 0; if(edStatusbarTd) { statusbarHeight += edStatusbarTd.getHeight(); } var iframeHeight = height - toolbarHeight - statusbarHeight; var iframeTd = edIframe.findParent( "td", 5, true ); if(iframeTd) iframeHeight -= iframeTd.getFrameWidth( "tb" ); edTable.setSize( width, height ); edIframe.setSize( toolbarWidth, iframeHeight ); }, getEditor: function() { return this.tinymce; }, setValue: function(value, editorChange) { var me = this; me.callParent(arguments); if(!me.rendered || !me.statics.initialized) { return false; } if(!editorChange) { me.setEditorValue(value, me); if((!value || !value.length) && me.hasPlaceholder) { me.setEditorValue(me.emptyText, me); } } return me; }, setRawValue: function(value) { var me = this; me.callParent(arguments); if(!me.rendered || !me.statics.initialized) { return false; } return me; }, setEditorValue: function(value, scope) { var me = scope; if(!me.tinymce) { return false; } if(me.tinymce.undoManager) { me.tinymce.undoManager.clear(); } me.tinymce.setContent(value === null || value === undefined ? '' : value); me.tinymce.startContent = me.tinymce.getContent({ format: 'raw' }); return true; }, focus: function(selectText, delay) { var me = this; if(delay) { if (!me.focusTask) { me.focusTask = Ext.create('Ext.util.DelayedTask', me.focus); } me.focusTask.delay(Ext.isNumber(delay) ? delay : 10, null, me, [selectText, false]); return me; } me.tinymce.focus(); if(selectText) { var edIframe = Ext.get(me.tinymce.id + "_ifr"), dom = edIframe.dom, doc = dom.contentDocument, win = dom.contentWindow, selection = win.getSelection(), range = doc.createRange(); range.selectNodeContents(doc.body); selection.removeAllRanges(); selection.addRange(range); } return me; }, destroy: function() { var me = this; me.callParent(arguments); clearInterval(me.changeSniffer); Ext.destroyMembers(me, 'tinymce'); }, enable: function(slient) { var me = this; me.callParent(arguments); if(!me.tinymce) { return me; } var bodyEl = me.tinymce.getBody(); bodyEl = Ext.get(bodyEl); if(bodyEl.hasCls('mceNonEditable')) { bodyEl.removeCls('mceNonEditable'); bodyEl.addCls('mceContentBody'); } me.tinymce.getBody().setAttribute('contenteditable', true); return me; }, disable: function(silent) { var me = this; me.callParent(arguments); if(!me.tinymce) { return me; } var bodyEl = me.tinymce.getBody(); bodyEl = Ext.get(bodyEl); if(bodyEl.hasCls('mceContentBody')) { bodyEl.removeCls('mceContentBody'); bodyEl.addCls('mceNonEditable'); } me.tinymce.getBody().setAttribute('contenteditable', false); return me; } }); Ext.define('Shopware.form.plugin.Translation', { extend: 'Ext.AbstractPlugin', alternateClassName: [ 'Shopware.form.Translation', 'Shopware.plugin.Translation' ], alias: 'plugin.translation', translatableFields: [], translatableFieldsConfig: [], translationType: 'article', translationCallback: Ext.emptyFn, translationKey: null, icons: [], uses: [ 'Ext.DomHelper', 'Ext.Element' ], client: null, init: function(client) { var me = this; me.callParent(arguments); me.client = client; me.client.on('afterrender', me.onGetTranslatableFields, me); me.client.getForm().on('recordchange', me.onGetTranslatableFields, me); }, clear: function() { var me = this; me.translatableFields.length = 0; Ext.each(this.icons, function(icon) { icon.removeListener('click'); icon.remove(); }); }, onGetTranslatableFields: function() { var me = this; me.clear(); if (!me.translationKey && typeof me.client.getForm().getRecord() === 'undefined') { return; } if (!me.translationKey && me.client.getForm().getRecord().phantom) { return; } Ext.each(me.client.getForm().getFields().items, function(field) { var config = field.initialConfig; if(config.translatable) { if(!config.allowBlank) { config.allowBlank = true; } if(config.translationLabel) { config.fieldLabel = config.translationLabel; } if(config.translationName) { config.name = config.translationName; } if(!config.fieldLabel) { config.fieldLabel = ' '; config.labelSeparator = ''; } if(!field.isDisabled()) { me.translatableFields.push(field); } if(field.getEl()) { me.createGlobeElement(field); } } }); }, createGlobeElement: function(field) { var me = this, type, style, globeIcon; type = me.getFieldType(field); switch(type) { case 'tinymce': style = 'top: 3px; right: 3px'; break; case 'codemirror': style = 'top: 6px; right: 26px;z-index:999999'; break; case 'textarea': style = 'top: 6px; right: 6px'; break; case 'trigger': style = 'top: 6px; right: 26px'; break; case 'textfield': default: style = 'top: 6px; right: 6px; z-index:1;'; break; } globeIcon = new Ext.Element(document.createElement('span')); globeIcon.set({ cls: Ext.baseCSSPrefix + 'translation-globe sprite-globe', style: 'position: absolute;width: 16px; height: 16px;display:block;cursor:pointer;'+style }); globeIcon.addListener('click', me.onOpenTranslationWindow, me); field.getEl().setStyle('position', 'relative'); globeIcon.insertAfter(field.inputEl); me.icons.push(globeIcon); }, onOpenTranslationWindow: function() { var me = this; if(typeof(Shopware.app.Application.addSubApplication) !== 'function') { Ext.Error.raise('Your ExtJS application does not support sub applications'); } var key = me.translationKey || me.client.getForm().getRecord().getId(); me.translatableFieldsConfig = me.getFieldValues(me.translatableFields); Shopware.app.Application.addSubApplication({ name: 'Shopware.apps.Translation', eventScope: me, translationCallback: me.translationCallback, translatableFields: me.translatableFieldsConfig, translationType: me.translationType, translationMerge: me.translationMerge, translationKey: key }); }, getFieldValues: function(fields) { var result = []; Ext.each(fields, function(field) { var value = field.getValue(), config = field.initialConfig; if(!config.xtype) { config.xtype = field.xtype; } if(value) { config.emptyText = value; } result.push(config) }); return result; }, getFieldType: function(field) { var type; Ext.each(field.alternateClassName, function(className) { if(className === 'Ext.form.TextField') { type = 'textfield'; } if(className === 'Shopware.form.TinyMCE') { type = 'tinymce'; } if(className === 'Shopware.form.CodeMirror') { type = 'codemirror'; } if(className === 'Ext.form.TextArea') { type = 'textarea'; } if(className === 'Ext.form.TriggerField' || className === 'Ext.form.ComboBox' || className === 'Ext.form.DateField' || className === 'Ext.form.Picker' || className === 'Ext.form.Spinner' || className === 'Ext.form.TimeField') { type = 'trigger'; } }); return type; }, destroy: function() { this.callParent(arguments); } }); Ext.define('Shopware.grid.HeaderToolTip', { extend: 'Ext.AbstractPlugin', alias: 'plugin.headertooltip', uses: [ 'Ext.tip.ToolTip' ], client: null, showIcons: true, init: function(client) { var me = this; me.callParent(arguments); me.client = client; me.client.headerCt.on("afterrender", me.onAfterRender, me); }, onAfterRender: function() { var me = this; headerCt = me.client.headerCt; grid = me.client; if (me.showIcons) { me.wrapColumnsWithSpan(headerCt.getGridColumns()); } grid.tip = me.getToolTip(); grid.tip.on("beforeshow", me.onBeforeShow, me); }, wrapColumnsWithSpan: function(columns) { Ext.each(columns, function(column) { if (column.tooltip) { var el = column.el; var tooltipclass = Ext.baseCSSPrefix + "tooltip" el.update('' + el.dom.innerHTML + ''); } }); }, getToolTip: function() { var me = this; headerCt = me.client.headerCt; return Ext.create('Ext.tip.ToolTip', { target: headerCt.el, delegate: "." + Ext.baseCSSPrefix + "column-header", trackMouse: true, renderTo: Ext.getBody() }); }, onBeforeShow: function(tip) { var me = this; headerCt = me.client.headerCt; var column = headerCt.down('gridcolumn[id=' + tip.triggerElement.id +']'); if (column && column.tooltip) { tip.update(column.tooltip); } else { tip.clearTimers(); return false; } }, destroy: function() { this.client.headerCt.un("afterrender"); this.callParent(arguments); } }); Ext.define('Shopware.Notification', { extend: 'Ext.app.Controller', singleton: true, alternateClassName: [ 'Shopware.Messages', 'Shopware.Msg' ], requires: [ 'Ext.container.Container', 'Ext.panel.Panel', 'Ext.XTemplate' ], baseMsgType: 'notice', hideDelay: 1800, easingType: 'easeIn', animationDuration: 200, alertWidth: 350, alertMsgCls: 'alert-message', blockMsgCls: 'block-message', growlMsgCls: 'growl-msg', growlMsgCollection: Ext.create('Ext.util.MixedCollection'), offsetTop: 50, alertMsgTpl: [ '', '
    ', '', 'x', '', '

    ', '', '{title} ', '', '{text}', '

    ', '
    ', '
    ' ], blockMsgTpl: [ '', '

    ', '{text}', '

    ', '
    ' ], growlMsgTpl: [ '', '
    ', '
    ', '', '
    {title}
    ', '
    ', '

    {text}

    ', '
    ', '
    ' ], _validTypes: /(notice|info|success|error)/i, setBaseMsgType: function(type) { if(!this.validBaseMsgType(type)) { return false; } this.baseMsgType = type; return true; }, getBaseMsgType: function() { return this.baseMsgType; }, validBaseMsgType: function(type) { return type.match(this._validTypes); }, setAlertMsgCls: function(cls) { this.alertMsgCls = cls; }, getAlertMsgCls: function() { return this.alertMsgCls; }, setBlockMsgCls: function(cls) { this.blockMsgCls = cls; }, getBlockMsgCls: function() { return this.blockMsgCls; }, setGrowlMsgCls: function(cls) { this.growlMsgCls = cls; }, getGrowlMsgCls: function() { return this.growlMsgCls; }, createMessage: function(title, text, type, closeBtn) { var me = this, alertMsg, msgData; if(!me.validBaseMsgType(type)) { type = false; } msgData = { title: title || false, text: text, type: type || this.baseMsgType, closeBtn: closeBtn || false }; alertMsg = Ext.create('Ext.container.Container', { ui: [ 'default', 'shopware-ui' ], data: msgData, cls: me.alertMsgCls, tpl: me.alertMsgTpl, width: me.alertWidth, renderTo: Ext.getBody(), style: 'opacity: 0' }); alertMsg.update(msgData); var task = new Ext.util.DelayedTask(function() { me.closeAlertMessage(alertMsg, me, null); }); task.delay(this.hideDelay); if(closeBtn) { Ext.getBody().on('click', function(event) { me.closeAlertMessage(this, me, task); }, alertMsg, { delegate: '.close-alert' }); } alertMsg.getEl().fadeIn({ opacity: 1, easing: me.easingType, duration: me.animationDuration }); return alertMsg; }, createErrorMessage: function(title, text, closeBtn) { closeBtn = closeBtn || false; return this.createMessage(title, text, 'error', closeBtn); }, createSuccessMessage: function(title, text, closeBtn) { closeBtn = closeBtn || false; return this.createMessage(title, text, 'success', closeBtn); }, createNoticeMessage: function(title, text, closeBtn) { closeBtn = closeBtn || false; return this.createMessage(title, text, 'notice', closeBtn); }, createInfoMessage: function(title, text, closeBtn) { closeBtn = closeBtn || false; return this.createMessage(title, text, 'info', closeBtn); }, closeAlertMessage: function(alertMsg, scope, task) { if(task && Ext.isObject(task)) { task.cancel(); } alertMsg.getEl().fadeOut({ remove: true, easing: scope.easingType, duration: scope.animationDuration }); return true; }, createBlockMessage: function(text, type) { var me = this, pnl, msgData, innerPnl; if(!me.validBaseMsgType(type)) { type = me.baseMsgType; } msgData = { text: text, type: type || me.baseMsgType }; innerPnl = Ext.create('Ext.container.Container', { cls: [ me.blockMsgCls + '-inner' , type || me.baseMsgType ] , data: msgData, margin: 1, padding: 7, plain: true, tpl: me.blockMsgTpl }); pnl = Ext.create('Ext.container.Container', { cls: me.blockMsgCls , ui: 'shopware-ui', bodyCls: type || me.baseMsgType, items: [ innerPnl ] }); innerPnl.update(msgData); return pnl; }, createGrowlMessage: function(title, text, caller, iconCls, log) { var me = this, msgData, growlMsg, id = Ext.id(), compTop = me.offsetTop if(log != false){ Ext.Ajax.request({ url: '/backend/Log/createLog', params: { type: 'backend', key: caller, text: text, user: userName, value4: '' }, scope:this }); } msgData = { title: title || false, text: text, iconCls: iconCls || 'growl' }; me.growlMsgCollection.each(function(growlEl) { compTop += growlEl.height + 6; }); growlMsg = Ext.create('Ext.panel.Panel', { ui: [ 'default', 'shopware-ui' ], data: msgData, id: id, unstyled: true, cls: me.growlMsgCls, tpl: me.growlMsgTpl, renderTo: Ext.getBody() }); growlMsg.update(msgData); growlMsg.getEl().setStyle({ 'opacity': 1, 'left': Ext.Element.getViewportWidth() - 308 + 'px', 'top': compTop + 'px' }); var task = new Ext.util.DelayedTask(function() { me.closeGrowlMessage(growlMsg, me, task); }); task.delay(this.hideDelay + (text.length * 35)); me.growlMsgCollection.add(id, { el: growlMsg, height: growlMsg.getHeight(), sticky: false }); return growlMsg; }, createStickyGrowlMessage: function(opts, caller, iconCls, log) { var me = this, msgData, growlMsg, growlContent, btnContent, closeCB, detailCB, autoClose, closeHandler, target = '_blank', width = 300, id = Ext.id(), compTop = me.offsetTop; log = log || false; target = (opts.btnDetail && opts.btnDetail.target) ? opts.btnDetail.target : target; width = opts.width || width; closeCB = opts.callback || Ext.emptyFn; detailCB = (opts.btnDetail && opts.btnDetail.callback) ? opts.btnDetail.callback : Ext.emptyFn; autoClose = (opts.btnDetail && opts.btnDetail.autoClose !== undefined) ? opts.btnDetail.autoClose : true; if(log !== false || opts.log !== false) { Ext.Ajax.request({ url: '/backend/Log/createLog', params: { type: 'backend', key: caller, text: opts.text, user: userName, value4: '' }, scope: this }); } msgData = { title: opts.title || false, text: opts.text, iconCls: iconCls || 'growl' }; btnContent = Ext.create('Ext.container.Container', { cls: me.growlMsgCls + '-btn-content', flex: 2, layout: { type: 'vbox', align: 'stretch', pack:'center' } }); growlContent = Ext.create('Ext.container.Container', { data: msgData, cls: me.growlMsgCls + '-sticky-content', tpl: me.growlMsgTpl, maxHeight: 120, autoScroll: true, flex: 3 }); growlContent.update(msgData); growlMsg = Ext.create('Ext.panel.Panel', { unstyled: true, id: id, width: width, ui: [ 'default', 'shopware-ui' ], layout: { type: 'hbox', align: 'stretch' }, cls: me.growlMsgCls + ' ' + me.growlMsgCls + '-sticky-notification', renderTo: document.body, items: [ growlContent, btnContent ] }); closeHandler = function() { me.closeGrowlMessage(growlMsg, me); closeCB.apply(opts.scope || me, [ growlMsg, msgData ]); }; if(opts.btnDetail && opts.btnDetail.link) { btnContent.add({ xtype: 'button', height: 22, ui: 'growl-sticky', text: opts.btnDetail.text || 'Details aufrufen', handler: function() { window.open(opts.btnDetail.link, target); detailCB.apply(opts.btnDetail.scope || me, [ growlMsg, msgData ]); if(autoClose) { closeHandler(); } } }); } btnContent.add({ xtype: 'button', ui: 'growl-sticky', text: 'Schließen', height: 22, handler: closeHandler }); me.growlMsgCollection.each(function(growlEl) { compTop += growlEl.height + 6; }); growlMsg.getEl().setStyle({ 'opacity': 1, 'left': Ext.Element.getViewportWidth() - (width + 8) + 'px', 'top': compTop + 'px' }); me.growlMsgCollection.add(id, { el: growlMsg, height: growlContent.getHeight() + 26, sticky: true }); return growlMsg; }, closeGrowlMessage: function(msg, scope, task) { var pos = -1; if(task && Ext.isObject(task)) { task.cancel(); } msg.getEl().setStyle('opacity', 0); Ext.defer(function() { msg.destroy(); scope.growlMsgCollection.removeAtKey(msg.id); }, 210); scope.growlMsgCollection.each(function(growlMsg, i) { if(growlMsg.el.id === msg.id) { pos = i; } if(pos > -1 && pos !== i) { var top = scope.growlMsgCollection.getAt(pos).height; top = top + ((scope.growlMsgCollection.items.length - 2) * 6); growlMsg.el.animate({ to: { top: growlMsg.el.getPosition()[1] - (top < 50 ? 50 : top) + 'px' } }, 50); } }); return true; } }); Ext.define('Shopware.form.PasswordStrengthMeter', { extend: 'Ext.form.field.Text', alias: 'widget.passwordmeter', inputType: 'password', reset: function() { this.callParent(); this.updateMeter(); }, fieldSubTpl: [ '
    name="{name}" ', 'size="{size}" ', 'tabIndex="{tabIdx}" ', 'class="{fieldCls} {typeCls}" autocomplete="off" />
    ', '
    ', '
     
    ', '
    ', { compiled: true, disableFormats: true } ], onChange: function(newValue, oldValue) { this.updateMeter(newValue); }, updateMeter : function(val) { var me = this, maxWidth, score, scoreWidth, objMeter = me.el.down('.' + Ext.baseCSSPrefix + 'form-strengthmeter'), scoreBar = me.el.down('.' + Ext.baseCSSPrefix + 'form-strengthmeter-scorebar'); if (val){ maxWidth = objMeter.getWidth(); score = me.calcStrength(val); scoreWidth = maxWidth - (maxWidth / 100) * score; scoreBar.setWidth(scoreWidth, true); } else { scoreBar.setWidth('100%'); } }, calcStrength: function(p) { var len = p.length, score = len; if (len > 0 && len <= 4) { // length 4 or score += len } else if (len >= 5 && len <= 7) { score += 6; } else if (len >= 8 && len <= 15) { score += 12; } else if (len >= 16) { // length 16 or more score += 18; } if (p.match(/[a-z]/)) { score += 1; } if (p.match(/[A-Z]/)) { // [verified] at least one upper score += 5; } if (p.match(/\d/)) { // [verified] at least one score += 5; } if (p.match(/(?:.*?\d)3/)) { score += 5; } if (p.match(/[\!,@,#,$,%,\^,&,\*,\?,_,~]/)) { score += 5; } if (p.match(/(?:.*?[\!,@,#,$,%,\^,&,\*,\?,_,~])2/)) { score += 5; } if (p.match(/(?=.*[a-z])(?=.*[A-Z])/)) { score += 2; } if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)) { score += 2; } if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\!,@,#,$,%,\^,&,\*,\?,_,~])/)) { score += 2; } return Math.min(Math.round(score * 2), 100); } }); Ext.define('Shopware.form.field.CodeMirror', { extend: 'Ext.form.field.TextArea', alternateClassName: [ 'Shopware.form.CodeMirror', 'Ext.form.field.CodeMirror' ], alias: [ 'widget.codemirrorfield', 'widget.codemirror' ], editor: null, editorHeight: 0, editorWidth: 0, isEditorRendered: false, modePath: 'http://www.bautz-shop.de/engine/Library/CodeMirror/mode', loadedModes: Ext.create('Ext.util.MixedCollection'), initComponent : function() { var me = this; me.on({ resize: me.onResize }); me.addEvents('editorready'); me.callParent(arguments); }, constructor: function(config) { var me = this; Ext.applyIf(config, { indentUnit: 4, theme: 'default' }); me.config = config; me.callParent(arguments); Ext.apply(config, { onChange: function() { me.checkChange(); }, onFocus: function() { me.fireEvent('focus', me); } }); }, onResize: function(component, width, height) { var me = this; me.editorHeight = height; me.editorWidth = width - 10; me.resizeEditor(); }, onRender: function() { var me = this; me.callParent(arguments); if(!window.CodeMirror) { Ext.Error.raise("The CodeMirror editor source files aren't included in the project"); } if(!me.config.mode) { Ext.Error.raise("The CodeMirror mode is not configured"); } var availableModes = CodeMirror.modes, modeActive = false; Ext.Array.each(availableModes, function(value) { if(value === me.config.mode) { modeActive = true; } }); if(!modeActive) { me.loadJSFile(me.modePath + '/' + me.config.mode + '/' + me.config.mode + '.js'); } else { if(!me.isEditorRendered) { me.initEditor(); } } }, initEditor: function() { var me = this, el = me.inputEl; me.editor = CodeMirror.fromTextArea(document.getElementById(el.id), me.config); me.isEditorRendered = true; me.editor.on('change', function() { me.editor.save(); }); me.resizeEditor(); me.editor.setValue(me.rawValue); me.fireEvent('editorready', me, me.editor); return me.editor; }, resizeEditor: function() { var me = this, scroller, height, width; if (me.editor && me.el) { if (me.height) { height = me.height; } else { height = me.el.getHeight(); } if (me.width) { width = me.width - 10; } else { width = '100%'; } scroller = Ext.get(me.editor.getScrollerElement()); scroller.setHeight(height); scroller.setWidth(width); me.editor.refresh(); } }, reset: function() { if (this.editor) { this.editor.setValue(''); } return this.callParent(arguments); }, getValue: function() { if (this.editor) { this.editor.save(); } return this.callParent(arguments); }, setValue: function(value) { if (this.editor && (typeof value !== "undefined")) { this.editor.setValue(value); } if(this.editor) { this.editor.refresh(); } this.config.value = value; return this.callParent(arguments); }, focus: function() { this.editor.focus(); }, loadJSFile: function(file) { var me = this, head = document.head, script = document.createElement('script'); Ext.apply(script, { src : file, type : 'text/javascript', onload : Ext.Function.createDelayed(me.handleFileLoad, 100, me, [script]), onreadystatechange : function() { if (this.readyState === 'loaded' || this.readyState === 'complete') { me.handleFileLoad(script); } } }); head.appendChild(script); }, handleFileLoad: function(script) { script.onload = null; script.onreadystatechange = null; script.onerror = null; var me = this, loadedModes = me.loadedModes; loadedModes.add(Ext.get(script)); if(!me.isEditorRendered) { me.initEditor(); } }, destroy: function() { if (this.editor) { this.editor.toTextArea(); } this.callParent(arguments); } }); Ext.define('Shopware.form.field.ArticleSearch', { extend: 'Ext.container.Container', layout: 'anchor', alternateClassName: [ 'Shopware.form.ArticleSearch', 'Shopware.ArticleSearch' ], alias: [ 'widget.articlesearch', 'widget.articlesearchfield' ], cls: Ext.baseCSSPrefix + 'search-article-live', requires: [ 'Ext.form.field.Trigger', 'Ext.view.View', 'Ext.form.field.Hidden', 'Ext.XTemplate', 'Shopware.apps.Base.store.Article', 'Shopware.apps.Base.model.Article', 'Ext.grid.Panel' ], returnValue: 'name', hiddenReturnValue: 'number', returnRecord: null, searchFieldName: 'live-article-search', hiddenFieldName: 'hidden-article-search', dropDownStore: null, dropDownOffset: [ 105, 8 ], searchBuffer: 500, multiSelect: false, multiSelectStore: Ext.create('Ext.data.Store', { model: 'Shopware.apps.Base.model.Article' }), mulitSelectGrid: null, gridHeight: 200, gridToolbarDock: 'bottom', confirmButtonText: 'Zugewiesene Artikel speichern', cancelButtonText: 'Artikel zurücksetzen', separator: ';', searchScope: ['articles','variants','configurator'], formFieldConfig: {}, snippets: { emptyText: 'Suche...', assignedArticles: 'Zugewiesene Artikel', articleName: 'Artikelname', orderNumber: 'Bestellnummer', dropDownTitle: 'Artikel' }, initComponent: function() { var me = this; me.registerEvents(); if (!(me.articleStore instanceof Ext.data.Store)) { me.articleStore = Ext.create('Shopware.apps.Base.store.Article'); } me.dropDownStore = Ext.create('Shopware.apps.Base.store.Article', { listeners: { single: true, load: function() { me.loadArticleStore(me.articleStore); } } }); if (Ext.isObject(me.articleStore) && me.articleStore.data.items.length > 0 ) { me.loadArticleStore(me.articleStore); } if (Ext.isArray(me.searchScope) && me.searchScope.length > 0) { me.dropDownStore.getProxy().extraParams = { articles: Ext.Array.contains(me.searchScope, 'articles'), variants: Ext.Array.contains(me.searchScope, 'variants'), configurator: Ext.Array.contains(me.searchScope, 'configurator') }; } me.hiddenField = me.createHiddenField(); me.searchField = me.createSearchField(); me.dropDownMenu = me.createDropDownMenu(); me.items = [ me.hiddenField, me.searchField, me.dropDownMenu ]; if(!me.multiSelect) { delete me.multiSelectStore; } else { me.multiSelectGrid = me.createMultiSelectGrid(); me.items.push(me.multiSelectGrid); } if(me.articleStore && me.multiSelect) { me.multiSelectGrid.show(); } me.dropDownStore.on('datachanged', me.onSearchFinish, me); me.callParent(arguments); }, registerEvents: function() { this.addEvents( 'reset', 'search', 'valueselect', 'deleteArticle', 'applyAssignment' ); }, createHiddenField: function() { var me = this, input = Ext.create('Ext.form.field.Hidden', { name: me.hiddenFieldName }); return input; }, getHiddenField: function() { return this.hiddenField || (this.hiddenField = this.createHiddenField()); }, createSearchField: function() { var me = this; var fieldConfig = Ext.apply({ componentLayout: 'textfield', triggerCls: 'reset', emptyText: me.snippets.emptyText, fieldLabel: (me.fieldLabel || undefined), cls: Ext.baseCSSPrefix + 'search-article-live-field', name: me.searchFieldName, enableKeyEvents: true, anchor: (me.anchor || undefined), onTriggerClick: function() { this.reset(); this.focus(); this.setHideTrigger(true); me.dropDownMenu.hide(); me.fireEvent('reset', me, this); }, hideTrigger: true, listeners: { scope: me, keyup: me.onSearchKeyUp, blur: me.onSearchBlur } }, me.formFieldConfig); var input = Ext.create('Ext.form.field.Trigger', fieldConfig); return input; }, onSearchBlur: function() { var me = this; Ext.defer(function() { if (me.dropDownMenu) { me.dropDownMenu.hide(); } }, 1000); }, getSearchField: function() { return this.searchField || (this.searchField = this.createSearchField()) }, createDropDownMenu: function() { var me = this, view = Ext.create('Ext.view.View', { floating: true, autoShow: false, autoRender: true, hidden: true, shadow: false, width: 222, toFrontOnShow: true, focusOnToFront: false, store: me.dropDownStore, cls: Ext.baseCSSPrefix + 'search-article-live-drop-down', overItemCls: Ext.baseCSSPrefix + 'drop-down-over', selectedItemCls: Ext.baseCSSPrefix + 'drop-down-over', trackOver: true, itemSelector: 'div.item', singleSelect: true, listeners: { scope: me, itemclick: function(view, record) { me.onSelectArticle(view, record); } }, tpl: me.createDropDownMenuTpl() }); return view; }, getDropDownMenu: function() { return this.dropDownMenu || (this.dropDownMenu = this.createDropDownMenu()); }, createDropDownMenuTpl: function() { var me = this; return new Ext.XTemplate( '
    ', '
    ', '
     
    ', '', me.snippets.dropDownTitle, '', '
    ', '
    ', '
    ', '', '
    ', '{name}', '{number}', '
    ', '
    ', '
    ' ); }, createMultiSelectGrid: function() { var me = this, grid; me.multiSelectToolbar = me.createMultiSelectGridToolbar(); var grid = Ext.create('Ext.grid.Panel', { store: me.multiSelectStore, title: me.snippets.assignedArticles, selModel: 'rowmodel', autoScroll: true, columns: me.createMultiSelectGridColumns(), hidden: (me.multiSelectStore.getCount() ? false : true), anchor: (me.anchor || undefined), height: me.gridHeight, dockedItems: [ me.multiSelectToolbar ] }); return grid; }, getMultiSelectGrid: function() { return this.multiSelectGrid || (this.multiSelectGrid = this.createMultiSelectGrid()); }, createMultiSelectGridColumns: function() { var me = this; return [{ header: me.snippets.articleName, dataIndex: me.returnValue, flex: 2 }, { header: me.snippets.orderNumber, dataIndex: me.hiddenReturnValue, flex: 1 }, { xtype: 'actioncolumn', width: 30, items: [{ iconCls: 'sprite-minus-circle', handler: function(grid, rowIndex) { me.onDeleteArticle(rowIndex); } }] }]; }, createMultiSelectGridToolbar: function() { var me = this, toolbar; toolbar = Ext.create('Ext.toolbar.Toolbar', { dock: me.gridToolbarDock, ui: 'shopware-ui', items: ['->', { text: me.cancelButtonText, handler: function() { me.getMultiSelectGrid().hide(); me.multiSelectStore.removeAll(); } }, { text: me.confirmButtonText, handler: function() { me.getMultiSelectValues(); } }] }); return toolbar; }, getMultiSelectGridToolbar: function() { return this.multiSelectToolbar || (this.multiSelectToolbar = this.createMultiSelectGridToolbar()); }, onSearchKeyUp: function(el, event) { var me = this; el.setHideTrigger(el.getValue().length === 0); clearTimeout(me.searchTimeout); if(event.keyCode === Ext.EventObject.ESC || !el.value) { event.preventDefault(); el.setValue(''); me.dropDownStore.filters.clear(); me.getDropDownMenu().hide(); return false; } var dropdown = me.getDropDownMenu(), selModel = dropdown.getSelectionModel(), record = selModel.getLastSelected(), curIndex = me.dropDownStore.indexOf(record), lastIndex = me.dropDownStore.getCount() - 1; if(event.keyCode === Ext.EventObject.UP) { if(curIndex === undefined) { selModel.select(0); } else { selModel.select(curIndex === 0 ? lastIndex : (curIndex - 1)); } } else if(event.keyCode === Ext.EventObject.DOWN) { if(curIndex == undefined) { selModel.select(0); } else { selModel.select(curIndex === lastIndex ? 0 : (curIndex + 1)); } } else if(event.keyCode === Ext.EventObject.ENTER) { event.preventDefault(); record && me.onSelectArticle(null, record); } else { me.searchTimeout = setTimeout(function() { me.dropDownStore.filters.clear(); me.dropDownStore.filter('free', '%' + el.value + '%'); }, me.searchBuffer); } }, onSearchFinish: function(store) { var records = store.data.items, me = this; if(records.length === 0) { me.getDropDownMenu().hide(); } else { me.fireEvent('search', me, records); me.getDropDownMenu().show(); me.getDropDownMenu().alignTo(me.getSearchField().getEl(), 'bl', me.dropDownOffset); me.getDropDownMenu().getSelectionModel().select(0); } }, onSelectArticle: function(view, record) { var me = this; if(!me.multiSelect) { me.getSearchField().setValue(record.get(me.returnValue)); me.getHiddenField().setValue(record.get(me.hiddenReturnValue)); me.returnRecord = record; me.getDropDownMenu().hide(); } else { if(me.getMultiSelectGrid().isHidden()) { me.getMultiSelectGrid().show(); } delete record.internalId; me.multiSelectStore.add(record); me.getDropDownMenu().getSelectionModel().deselectAll(); } me.fireEvent('valueselect', me, record.get(me.returnValue), record.get(me.hiddenReturnValue), record); }, onDeleteArticle: function(rowIndex, silent) { var me = this, grid = me.getMultiSelectGrid(), store = me.multiSelectStore, record = store.getAt(rowIndex); silent = silent || false; store.remove(record); if(!store.getCount()) { grid.hide(); } if(!silent) { me.fireEvent('deleteArticle', me, record, store, grid); } }, getMultiSelectValues: function() { var me = this, store = me.multiSelectStore, records = store.data.items, returnValue = '', hiddenReturnValue = ''; Ext.each(records, function(record) { returnValue += record.get(me.returnValue) + me.separator; hiddenReturnValue += record.get(me.hiddenReturnValue) + me.separator; }); returnValue = returnValue.substring(0, returnValue.length - 1); hiddenReturnValue = hiddenReturnValue.substring(0, hiddenReturnValue.length - 1); me.fireEvent('applyAssignment', me, returnValue, hiddenReturnValue, records, store); }, destroy: function() { Ext.destroyMembers(this, 'mulitSelectGrid', 'hiddenField', 'searchField', 'dropDownMenu', 'multiSelectToolbar'); }, loadArticleStore: function(store) { var me = this; Ext.each(store.data.items, function(record) { delete record.internalId; me.multiSelectStore.add(record); }); return true; }, getArticleStore: function() { return this.multiSelectStore } }); Ext.define('Shopware.form.field.PagingComboBox', { extend: 'Ext.form.field.ComboBox', alias: ['widget.pagingcombobox', 'widget.pagingcombo'], pagingBarConfig: { first: true, prev: true, jumpTo: false, next: true, last: true, refresh: true }, defaultPageSize: 15, forceDefaultPageSize: false, createPicker: function() { var pagingComboBox = this, me = pagingComboBox; if(me.store.pageSize && !me.forceDefaultPageSize) { me.pageSize = me.store.pageSize; } else { me.pageSize = me.defaultPageSize; } var picker, menuCls = Ext.baseCSSPrefix + 'menu', pickerCfg = Ext.apply({ xtype: 'boundlist', pickerField: me, selModel: { mode: me.multiSelect ? 'SIMPLE' : 'SINGLE' }, floating: true, hidden: true, ownerCt: me.up('[floating]'), cls: me.el && me.el.up('.' + menuCls) ? menuCls : '', store: me.store, displayField: me.displayField, focusOnToFront: false, pageSize: me.pageSize, tpl: me.tpl, createPagingToolbar: function() { return Ext.widget('pagingtoolbar', { id: this.id + '-paging-toolbar', pageSize: this.pageSize, store: this.store, border: false, getPagingItems: function() { var me = this, pageText; var pagingBarItems = [{ itemId: 'first', tooltip: me.firstText, hidden: !pagingComboBox.pagingBarConfig.first, overflowText: me.firstText, iconCls: Ext.baseCSSPrefix + 'tbar-page-first', disabled: true, handler: me.moveFirst, scope: me },{ itemId: 'prev', hidden: !pagingComboBox.pagingBarConfig.prev, tooltip: me.prevText, overflowText: me.prevText, iconCls: Ext.baseCSSPrefix + 'tbar-page-prev', disabled: true, handler: me.movePrevious, scope: me }, { xtype: 'numberfield', itemId: 'inputItem', name: 'inputItem', hidden: !pagingComboBox.pagingBarConfig.jumpTo, cls: Ext.baseCSSPrefix + 'tbar-page-number', allowDecimals: false, minValue: 1, hideTrigger: true, enableKeyEvents: true, keyNavEnabled: false, selectOnFocus: true, submitValue: false, isFormField: false, width: me.inputItemWidth, margins: '-1 2 3 2', listeners: { scope: me, keydown: me.onPagingKeyDown, blur: me.onPagingBlur } },{ xtype: 'tbtext', itemId: 'afterTextItem', hidden: !pagingComboBox.pagingBarConfig.jumpTo, text: Ext.String.format(me.afterPageText, 1) }, '-', { itemId: 'next', tooltip: me.nextText, overflowText: me.nextText, iconCls: Ext.baseCSSPrefix + 'tbar-page-next', disabled: true, hidden: !pagingComboBox.pagingBarConfig.next, handler: me.moveNext, scope: me },{ itemId: 'last', tooltip: me.lastText, overflowText: me.lastText, iconCls: Ext.baseCSSPrefix + 'tbar-page-last', disabled: true, handler: me.moveLast, hidden: !pagingComboBox.pagingBarConfig.last, scope: me }, '-', { itemId: 'refresh', tooltip: me.refreshText, hidden: !pagingComboBox.pagingBarConfig.refresh, overflowText: me.refreshText, iconCls: Ext.baseCSSPrefix + 'tbar-loading', handler: me.doRefresh, scope: me }]; if (pagingComboBox.pagingBarConfig.jumpTo) { Ext.Array.insert(pagingBarItems, 2, ['-', me.beforePageText]); } return pagingBarItems; } }); } }, me.listConfig, me.defaultListConfig); picker = me.picker = Ext.widget(pickerCfg); if (me.pageSize) { picker.pagingToolbar.on('beforechange', me.onPageChange, me); } me.mon(picker, { itemclick: me.onItemClick, refresh: me.onListRefresh, scope: me }); me.mon(picker.getSelectionModel(), { beforeselect: me.onBeforeSelect, beforedeselect: me.onBeforeDeselect, selectionchange: me.onListSelectionChange, scope: me }); return picker; } }); Ext.define('Shopware.container.Viewport', { extend: 'Ext.container.Container', alias: 'widget.sw4viewport', requires: [ 'Ext.EventManager', 'Ext.util.MixedCollection' ], alternateClassName: 'Shopware.Viewport', isViewport: true, ariaRole: 'application', cssBaseCls: Ext.baseCSSPrefix + 'viewport', desktops: Ext.create('Ext.util.MixedCollection'), activeDesktop: null, scrollable: true, scrollDuration: 500, scrollEasing: 'ease', desktopComponentName: 'Ext.container.Container', defaultDesktopNames: [ 'Dashboard', 'Administration' ], stateful: true, stateId: 'sw4-viewport', desktopSwitcher: null, snippets: { title: 'Create desktop', message: 'Please choose a title for the new desktop' }, desktopSwitcherStore: Ext.create('Ext.data.Store', { fields: [ { name: 'title', type: 'string' }, { name: 'cls', type: 'string' }, { name: 'index', type: 'int' } ] }), afterRender: function() { var me = this; var appCls = Ext.ClassManager.get('Shopware.app.Application'); appCls.baseComponentIsReady(me); me.callParent(arguments); }, initComponent : function() { var me = this, html = Ext.fly(document.body.parentNode), el; me.registerEvents(); me.callParent(arguments); me.el = el = Ext.getBody(); el.setHeight = Ext.emptyFn; el.dom.scroll = 'no'; html.dom.scroll = 'no'; html.dom.scrollWidth = Ext.Element.getViewportWidth(); el.dom.scrollWidth = Ext.Element.getViewportWidth(); html.scrollLeft = 0; me.allowDomMove = false; Ext.EventManager.onWindowResize(me.fireResize, me); me.renderTo = me.el; Ext.suspendLayouts(); html.addCls(me.cssBaseCls); html.setStyle('position', 'relative'); html.setStyle('left', '0px'); el.setStyle('left', '0px'); html.setStyle('overflow', 'hidden'); el.setStyle('overflow', 'hidden'); Ext.resumeLayouts(true); me.createDefaultDesktops(); me.createDesktopSwitcher(); me.updateDesktopSwitcher(); me.resizeViewport(); me.createHiddenLayer(); }, createHiddenLayer: function() { var me = this; me.hiddenLayer = new Ext.dom.Element(document.createElement('div')); me.hiddenLayer.set({ 'class': Ext.baseCSSPrefix + 'hidden-layer', style: { position: 'fixed', top: 0, left: 0, width: Ext.Element.getViewportWidth() + 'px', height: Ext.Element.getViewportHeight() + 'px' } }); }, getHiddenLayer: function() { var me = this; if(!me.hiddenLayer) { me.createHiddenLayer(); } return me.hiddenLayer; }, registerEvents: function() { this.addEvents( 'createdesktop', 'changedesktop', 'removedesktop', 'resizeviewport', 'beforescroll', 'afterscroll' ); }, fireResize : function(w, h) { var me = this; me.el.setSize(w * (me.getDesktopCount() || 1), h); me.setSize(w * (me.getDesktopCount() || 1), h); Ext.each(this.desktops.items, function(desktop) { desktop.setSize(w, h - 40); }); Ext.defer(me._rearrangeVisibleWindows, 5, this); }, _rearrangeVisibleWindows: function() { var activeWindows = Shopware.app.Application.getActiveWindows(); Ext.each(activeWindows, function(win) { if(win.hidden) { return; } var position = win.getPosition(), size = win.getSize(); win.center(); win.setPosition(position[0], (win.maximized) ? 0 : 15, false); if(win.maximized) { size.height -= 50; win.setSize(size); } }); }, resizeViewport: function() { var me = this, width = Ext.Element.getViewportWidth() * (me.getDesktopCount() || 1), height = Ext.Element.getViewportHeight(); me.el.setSize(width, height); me.fireEvent('resizeviewport', me, width, height); return [ width, height ]; }, getViewportSize: function() { var width = Ext.Element.getViewportWidth() * (this.getDesktopCount() || 1), height = Ext.Element.getViewportHeight(); return [width, height]; }, createDesktopSwitcher: function() { var me = this, desktopSwitcher; var task; desktopSwitcher = Ext.create('Ext.view.View', { renderTo: Ext.getBody(), store: me.desktopSwitcherStore, style: 'position: fixed; bottom: 18px; left: 0; text-align: center; z-index: 10', width: '100%', cls: Ext.baseCSSPrefix + 'desktop-switcher-outer-container', itemSelector: '.x-desktop-switcher-control', tpl: [ '', '{title}', '', '+' ], listeners: { scope: me, itemclick: function(view, record, item, index) { me.jumpTo(index); } } }); desktopSwitcher.getEl().on('click', function() { var title = me.snippets.title; var message = me.snippets.message; Ext.MessageBox.prompt(title, message, function(response, title) { if(response === 'ok') { me.createDesktop(title, true); } }); }, me, { delegate: '.add-desktop' }); return me.desktopSwitcher = desktopSwitcher; }, updateDesktopSwitcher: function() { var me = this; me.desktopSwitcherStore.removeAll(); Ext.each(this.desktops.items, function(desktop, index) { me.desktopSwitcherStore.add({ title: Ext.String.ellipsis(desktop.title, 14), cls: (me.getActiveDesktopPosition() === index) ? 'active' : 'non-active', index: index }) }); }, showDesktopSwitcher: function() { this.desktopSwitcher.show(); return true; }, hideDesktopSwitcher: function() { this.desktopSwitcher.hide(); return true; }, createDefaultDesktops: function() { var me = this; Ext.suspendLayouts(); for(var i = 0; i <= me.defaultDesktopNames.length -1; i++) { me.createDesktop(me.defaultDesktopNames[i]); } Ext.resumeLayouts(true); me.activeDesktop = 0; }, getDesktop: function(index) { return this.desktops.getAt(index); }, getDesktopPosition: function(desktop) { return this.desktops.indexOf(desktop); }, getDesktopCount: function() { return this.desktops.getCount(); }, createDesktop: function(title, renderBeforeSwitcher) { renderBeforeSwitcher = renderBeforeSwitcher || false; var me = this, desktop = Ext.create(me.desktopComponentName, { renderTo: Ext.getBody(), width: Ext.Element.getViewportWidth(), height: Ext.Element.getViewportHeight() - 106, layout: 'fit', title: title, style: 'float: left; top: 40px; position: relative; z-index: 10', cls: 'desktop-pnl' }); if(renderBeforeSwitcher) { me.desktopSwitcher.getEl().insertAfter(desktop.getEl()); } me.desktops.add(desktop); me.fireEvent('createdesktop', me, desktop); me.resizeViewport(); me.updateDesktopSwitcher(); return desktop; }, removeDesktop: function(desktop) { var me = this, removedDesktop; if(Ext.isNumeric(desktop)) { removedDesktop = me.getDesktop(desktop); me.desktops.removeAt(desktop); } else { removedDesktop = desktop; me.desktops.remove(desktop); } me.fireEvent('removedesktop', this, removedDesktop); me.resizeViewport(); me.updateDesktopSwitcher(); return desktop; }, setActiveDesktop: function(index) { var me = this, newDesktop = me.getDesktop(index), oldDesktopIndex = me.activeDesktop, oldDesktop = me.getDesktop(me.activeDesktop); me.activeDesktop = index; me.fireEvent('changedesktop', me, index, newDesktop, oldDesktopIndex, oldDesktop); return newDesktop; }, getActiveDesktop: function() { return this.desktops.getAt(this.getActiveDesktopPosition()); }, getActiveDesktopPosition: function() { return this.activeDesktop; }, scroll: function(direction) { var me = this, html = Ext.fly(document.body.parentNode), width = Ext.Element.getViewportWidth(), pos = me.getActiveDesktopPosition(); if(direction === 'left' && pos - 1 > -1) { pos -= 1; } else if(direction === 'right' && me.getDesktopCount() > pos + 1) { pos += 1; } else { return false; } html.animate({ duration: me.scrollDuration, easing: me.scrollEasing, listeners: { beforeanimate: function() { Ext.suspendLayouts(); me.fireEvent('beforescroll', me, this, pos); }, afteranimate: function() { Ext.resumeLayouts(true); me.activeDesktop = pos; me.fireEvent('afterscroll', me, this, pos); me.updateDesktopSwitcher(); } }, to: { left: -(width * pos) } }); return true; }, jumpTo: function(index, noAnim) { var me = this, html = Ext.fly(document.body.parentNode), width = Ext.Element.getViewportWidth(), maxPos = me.getDesktopCount(); if(noAnim) { html.setStyle('left', -(width * index)); me.activeDesktop = index; me.fireEvent('afterscroll', me, this, index); me.updateDesktopSwitcher(); return true; } if(index < 0 && index < maxPos) { return false; } var activeWindows = Shopware.app.Application.getActiveWindows(); html.animate({ duration: me.scrollDuration, easing: me.scrollEasing, listeners: { beforeanimate: function() { Ext.suspendLayouts(); me.fireEvent('beforescroll', me, this, index); Ext.each(activeWindows, function(window) { window.el.shadow.hide(); }); }, afteranimate: function() { Ext.resumeLayouts(true); me.activeDesktop = index; me.fireEvent('afterscroll', me, this, index); me.updateDesktopSwitcher(); Ext.each(activeWindows, function(window) { window.el.shadow.show(window.el); }); } }, to: { left: -(width * index) } }); return true; }, scrollLeft: function() { return this.scroll('left'); }, scrollRight: function() { return this.scroll('right'); } }); Ext.define('Shopware.DragAndDropSelector', { extend:'Ext.container.Container', alias: [ 'widget.draganddropselector', 'widget.ddselector' ], fromStore: null, toStore: null, fromField: null, fromFieldDockedItems: null, toField: null, toFieldDockedItems: null, selectedItems: null, fromTitle: '', toTitle: '', fromColumns :[{ text: 'name', flex: 1, dataIndex: 'name' }], toColumns :[{ text: 'name', flex: 1, dataIndex: 'name' }], hideHeaders: true, gridHeight: null, layout:{ type:'hbox', align: 'stretch' }, buttons: ['top', 'up', 'add', 'remove', 'down', 'bottom'], buttonsText: { top: "Move to Top", up: "Move Up", add: "Add to Selected", remove: "Remove from Selected", down: "Move Down", bottom: "Move to Bottom" }, initComponent : function() { var me = this; me.toStore = me.selectedItems; me.refreshStore(); me.fromStore.load(); me.fromField = me.createGrid({ title: me.fromTitle, store: me.fromStore, columns :me.fromColumns, dockedItems: me.fromFieldDockedItems, border: false, viewConfig: { plugins: { ptype: 'gridviewdragdrop', dragGroup: 'firstGridDDGroup', dropGroup: 'secondGridDDGroup' }, listeners: { drop: function() { me.refreshStore(); } } } }); me.toField = me.createGrid({ title : me.toTitle, store : me.toStore, columns : me.toColumns, dockedItems: me.toFieldDockedItems, border: false, viewConfig: { plugins: { ptype: 'gridviewdragdrop', dragGroup: 'secondGridDDGroup', dropGroup: 'firstGridDDGroup' }, listeners: { drop: function() { me.refreshStore(); } } } }); me.items = [ me.fromField, me.getMiddleButtons(), me.toField ]; me.callParent(arguments); }, getMiddleButtons : function() { var me = this; return Ext.create('Ext.container.Container',{ margins: '0 4', width: 22, layout: { type: 'vbox', pack: 'center' }, items: me.createButtons() }); }, createButtons: function(){ var me = this, buttons = []; Ext.Array.forEach(me.buttons, function(name) { var button = Ext.create('Ext.Button', { tooltip: me.buttonsText[name], cls: Ext.baseCSSPrefix + 'form-itemselector-btn', iconCls: Ext.baseCSSPrefix + 'form-itemselector-' + name, navBtn: true, margin: '4 0 0 0' }); button.addListener('click', me['on' + Ext.String.capitalize(name) + 'BtnClick'], me); buttons.push(button); }); return buttons; }, createGrid: function(config) { var me = this; var defaultConfig = { stripeRows : true, multiSelect: true, hideHeaders: me.hideHeaders, height: me.gridHeight, flex: 1 }; defaultConfig = Ext.apply(defaultConfig, config); var gridPanel = Ext.create('Ext.grid.Panel', defaultConfig); gridPanel.addListener('itemdblclick', me.onItemDblClick, me); return gridPanel; }, onItemDblClick: function(view, rec){ var me = this, from = me.fromStore, to = me.toStore, current, destination; if (view.store === me.fromField.store) { current = from; destination = to; } else { current = to; destination = from; } current.remove(rec); destination.add(rec); me.refreshStore(); }, onAddBtnClick : function() { var me = this, fromList = me.fromField, selected = this.getSelections(fromList); var storeItems = me.fromStore.data.items; me.fromStore.removeAll(); storeItems = me.fastRemoveStoreItems(storeItems, selected); me.fromStore.add(storeItems); me.toStore.add(selected); me.refreshStore(); }, onRemoveBtnClick : function() { var me = this, toList = me.toField, selected = me.getSelections(toList); var storeItems = me.toStore.data.items; me.toStore.removeAll(); storeItems = me.fastRemoveStoreItems(storeItems, selected); me.toStore.add(storeItems); me.fromStore.add(selected); me.refreshStore(); }, getSelections: function(list){ var store = list.getStore(), selections = list.getSelectionModel().getSelection(); return Ext.Array.sort(selections, function(a, b){ a = store.indexOf(a); b = store.indexOf(b); if (a < b) { return -1; } else if (a > b) { return 1; } return 0; }); }, refreshStore: function() { var me = this, ids = []; if(me.toStore != null) { me.selectedItems = me.toStore; } if(me.selectedItems != null){ me.selectedItems.each(function(element) { ids.push(element.get('id')); }); } me.fromStore.getProxy().extraParams = { 'usedIds[]': ids }; }, fastRemoveStoreItems: function(storeItems, selected) { var toRemove = []; for(var i in storeItems) { var select = storeItems[i]; Ext.each(selected, function(item) { if(select.get('id') === item.get('id')) { toRemove.unshift(i); } }); } Ext.each(toRemove, function(index) { Ext.Array.erase(storeItems, index, 1); }); return storeItems; }, destroy: function() { this.fromStore = null; Ext.destroyMembers(this, 'fromField', 'toField'); this.callParent(); } }); Ext.define('Shopware.DataView.GooglePreview', { extend:'Ext.container.Container', alias: [ 'widget.googlepreview'], cls: Ext.baseCSSPrefix + 'dataview-google-preview', fieldSet: null, fieldSetTitle: '', titleField: null, supportText:'', refreshButtonText: 'Refresh', layout:{ type:'vbox' }, initComponent : function() { var me = this; me.fieldSet = Ext.create('Ext.form.FieldSet', { layout:'anchor', padding:10, width: '100%', title: me.fieldSetTitle, items: [ me.createPreviewView() ] }); me.refreshButton = Ext.create('Ext.Button', { text: me.refreshButtonText, cls: 'primary', scope:me, handler:function () { me.refreshView(); } }); me.supportTextContainer = Ext.create('Ext.container.Container', { style: 'font-style: italic; color: #999; font-size: x-small; margin: 0 0 8px 0;', width: '100%', html: me.supportText }); me.items = [ me.fieldSet, me.supportTextContainer, me.refreshButton ]; me.callParent(arguments); }, createPreviewView: function() { var me = this; me.previewView = Ext.create('Ext.view.View', { itemSelector: '.preview', name: 'google-preview-view', tpl: me.createPreviewTemplate() }); return me.previewView; }, createPreviewTemplate: function() { var me = this; return new Ext.XTemplate( '' + '', '
    ', '{title}', '{url}', '
    ', '{date}', '{metaDescription}', '
    ', '
    ', '
    ', '' ); }, getPreviewData: function() { var me = this, title = me.titleField.getValue(), url = me.titleField.getValue(), metaDescription = me.descriptionField.getValue(), date = ''; if(title != '') { title = title.substr(0,50)+'...'; date = new Date().toLocaleDateString(); date = date+" - "; } if(url != '') { url = "www.example.com/"+url; url = url.substr(0,35)+'...'; url = url.toLowerCase(); url = url.replace(' ', '-'); } if(metaDescription != '') { metaDescription = metaDescription.substr(0,70)+'...'; } return { title: title, url: url, date: date, metaDescription: metaDescription }; }, refreshView: function() { var me = this; me.previewView.update(me.getPreviewData()); }, destroy: function() { Ext.destroyMembers(this); this.callParent(); } }); Ext.define('Shopware.form.field.ComboTree', { extend:'Ext.form.Picker', alias:'widget.combotree', requires: [ 'Ext.tree.Panel' ], matchFieldWidth: false, initComponent: function() { var me = this; me.store.on({ scope: me, load: me.onStoreHasLoaded }); me.callParent(arguments) }, createPicker:function () { var me = this; var treeConfig = Ext.apply({ floating: true, hidden: true, width:me.bodyEl.getWidth(), store: me.store, displayField: 'name', useArrows: true, rootVisible: false, autoScroll: true, queryMode: 'remote', height: 300, listeners:{ scope:me, itemclick:me.onItemClick }, flex: 1, root: { id: 1, expanded: true } }, me.treeConfig); me.treePanel = Ext.create('Ext.tree.Panel',treeConfig); return me.treePanel; }, onItemClick:function(view, record, item, index, e, eOpts){ this.setFieldValue(record.data.id, record.data.name); this.fireEvent('select', this, record.data.name); this.collapse(); }, afterRender: function() { var me = this; if(me.selectedRecord) { var value = me.selectedRecord.get(me.treeField || me.displayField); me.inputEl.dom.value = value; me.setFieldValue(value); } me.callParent(arguments); }, setFieldValue: function(value, label) { var me = this; if(!label) { label = value; } me.setValue(value); me.setRawValue(label); }, setValue:function(value){ var me = this, inputEl = me.inputEl; if (inputEl && me.emptyText && !Ext.isEmpty(value)) { inputEl.removeCls(me.emptyCls); } me.value = value; me.applyEmptyText(); }, setRawValue:function(value){ this.inputEl.dom.value = value==null?"":value; }, getValue:function(){ return this.value; }, getRawValue:function(){ if(this.inputEl){ return this.inputEl.dom.value; } return 0; }, onStoreHasLoaded: function(store) { var me = this, activeRecord; if(me.value) { activeRecord = store.getNodeById(me.value); if(!activeRecord) { return; } me.setRawValue(activeRecord.get(me.displayField)); } }, getSubmitValue: function() { var me = this; if(!me.getRawValue()) { return ""; } return this.value; }, destroy: function() { this.callParent(); } }); Ext.define('Shopware.window.plugin.Hud', { windowCls: Ext.baseCSSPrefix + 'hub-pnl', hudCls: Ext.baseCSSPrefix + 'hub-library', hudTitle: 'Elemente-Bibliothek', hudHeight: 325, hudWidth: 225, hudOffset: 10, hudShow: true, tpl: '', itemSelector: '.x-library-element', hudStoreErrorMessage: function(className) { return className + ' needs the property "hudStore" which represents the store used by the hub panel to create the draggable items.'; }, constructor: function(config) { Ext.apply(this, config); }, init: function(view) { var me = this; me.ownerView = view; me.ownerView.addCls(me.windowCls); me.ownerView.on('show', me.setupLibraryWindow, me); me.ownerView.hubPnl = me; }, setupLibraryWindow: function() { var me = this, el = me.ownerView, extEl = Ext.get(el.getEl().dom); if(!me.hudStore || Ext.isEmpty(me.hudStore)) { Ext.Error.raise(me.hudStoreErrorMessage(me.$className)); return false; } me.libraryView = Ext.create('Ext.view.View', { tpl: me.tpl, store: me.hudStore, itemSelector: me.itemSelector, overItemCls: Ext.baseCSSPrefix + 'item-over', trackOver: true, onItemSelect: function(record) { var node = this._selectedNode; //this.getNode(record); if (node) { Ext.fly(node).addCls(this.selectedItemCls); } }, onItemDeselect: function(record) { var node = this._deselectedNode; //this.getNode(record); if (node) { Ext.fly(node).removeCls(this.selectedItemCls); } }, processItemEvent: function(record, item, index, e) { if (e.type == "mousedown" && e.button == 0) { this._deselectedNode = this._selectedNode; this._selectedNode = item; } }, updateIndexes : function(startIndex, endIndex) { var ns = this.all.elements, records = this.store.getRange(), tmpRecords = [], i, j; Ext.each(records, function(item) { var children = item.get('children'); Ext.each(children, function(child) { tmpRecords.push(child); }); }); records = tmpRecords; startIndex = startIndex || 0; endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1)); for(i = startIndex, j = startIndex - 1; i <= endIndex; i++){ if (Ext.fly(ns[i]).is('.x-library-element')) { j++; } ns[i].viewIndex = i; ns[i].viewRecordId = records[j].internalId; if (!ns[i].boundView) { ns[i].boundView = this.id; } } }, listeners: { scope: me, render: me.initializeDragZones, afterrender: me.addAdditionalEvents } }); me.libraryPnl = Ext.create('Ext.panel.Panel', { height: me.hudHeight, unstyled: true, preventHeader: true, width: me.hudWidth, cls: me.hudCls, autoScroll: true, style: 'position: absolute; top:0px; right: -' + (me.hudWidth + me.hudOffset) + 'px;', renderTo: extEl, items: [ me.libraryView ] }); if(!me.hudShow) { me.libraryPnl.hide(); } extEl.setStyle('overflow', 'visible'); el.libraryPnl = me.libraryPnl; }, initializeDragZones: function(view) { var me = this, draggedElement; view.dragZone = new Ext.dd.DragZone(view.getEl(), { ddGroup: 'emotion-dd', proxyCls: Ext.baseCSSPrefix + 'emotion-dd-proxy', onDragStart: function() { }, getDragData: function(event) { var source = event.getTarget(view.itemSelector, 10), d, element = Ext.get(source), id, attr, i; var proxy = view.dragZone.proxy; if(!proxy.getEl().hasCls(Ext.baseCSSPrefix + 'shopware-dd-proxy')) { proxy.getEl().addCls(Ext.baseCSSPrefix + 'shopware-dd-proxy') } if(!source || !element) { return false; } id = ~~(1 * element.getAttribute('data-componentId')); if(!id) { for(i in element.dom.attributes) { attr = element.dom.attributes[i]; if(attr.name == 'data-componentid') { id = parseInt(attr.value, 10); break; } } } d = source.cloneNode(true); d.id = Ext.id(); element.addCls('dragged'); draggedElement = element; element.on('click', function() { this.removeCls('dragged') }, element, { single: true }); return { ddel: d, sourceEl: source, repairXY: Ext.fly(source).getXY(), sourceStore: view.store, draggedRecord: me.originalStore.getById(id) } }, getRepairXY: function(event) { var source = event.getTarget(view.itemSelector, 10), element = Ext.get(source); if(draggedElement && draggedElement.hasCls('dragged')) { Ext.defer(function() { draggedElement.removeCls('dragged'); }, 50); } return this.dragData.repairXY; } }); }, showPanel: function() { this.fireEvent('beforeShowHud', this.libraryView); this.libraryPnl.show(); this.fireEvent('afterShowHud', this.libraryView); }, hidePanel: function() { this.fireEvent('beforeHideHud', this.libraryView); this.libraryPnl.hide(); this.fireEvent('afterHideHud', this.libraryView); }, addAdditionalEvents: function() { var me = this, me = me.libraryView; me.getEl().on({ 'click': { delegate: '.toggle', fn: function(event, element) { var el = Ext.get(element), parent = el.parent(), panel = parent.parent().child('.x-library-inner-panel') Ext.suspendLayouts(); if(panel.isVisible()) { el.addCls('inactive'); el.removeCls('active'); panel.setStyle('display', 'none'); } else { el.addCls('active'); el.removeCls('inactive'); panel.setStyle('display', 'block'); } Ext.resumeLayouts(true); } } }); } }); Ext.define('Shopware.grid.plugin.Translation', { extend: 'Ext.AbstractPlugin', alternateClassName: [ 'Shopware.plugin.GridTranslation', 'Shopware.GridTranslation' ], alias: [ 'plugin.gridtranslation' ], requires: [ 'Ext.grid.column.Column' ], mixins: { observable: 'Ext.util.Observable' }, grid: null, translatableFields: [], translationType: 'article', translationCallback: Ext.emptyFn, translationKey: null, actionColumnItemGetClassCallback: Ext.emptyFn, constructor: function() { var me = this; me.callParent(arguments); me.mixins.observable.constructor.call(me); }, init: function(grid) { var me = this; me.grid = grid; me.grid.on('reconfigure', me.onGridReconfigure, me); me.onGridReconfigure(); me.callParent(arguments); }, onGridReconfigure: function() { var me = this; if (!me.grid) { return false; } me.translatableFields = me.getTranslatableFields(); if (me.translatableFields.length === 0) { return false; } if (me.hasGridTranslationColumn()) { return true; } var columns = me.grid.headerCt; var actionColumn = null; columns.items.each(function(column) { if (column.getXType() === 'actioncolumn') { actionColumn = column; return true; } }); var newActionColumn = me.createTranslationActionColumn(actionColumn); if (actionColumn) { me.grid.headerCt.remove(actionColumn); } me.grid.headerCt.insert(newActionColumn); return true; }, hasGridTranslationColumn: function() { var me = this, translationItemExist = false; if (!me.grid) { return translationItemExist; } var columns = me.grid.headerCt; columns.items.each(function(column) { if (column.getXType() === 'actioncolumn') { if (me.hasActionColumnTranslationItem(column)) { translationItemExist = true; return false; } } }); return translationItemExist; }, hasActionColumnTranslationItem: function(column) { var me = this, translationItemExist = false; if (!column) { return translationItemExist; } Ext.each(column.items, function(actionItem) { if (actionItem.name === 'grid-translation-plugin') { translationItemExist = true; return false; } }); return translationItemExist; }, createTranslationActionColumn: function(actionColumn) { var me = this, items = [], width = 0; if (actionColumn) { items = actionColumn.items; width = actionColumn.width; } items.push(me.createTranslationActionColumnItem()); return Ext.create('Ext.grid.column.Action', { width: width + 30, items: items }); }, createTranslationActionColumnItem: function() { var me = this; return { iconCls: 'sprite-globe-green', tooltip: 'Translate', name: 'grid-translation-plugin', handler: function (view, rowIndex, colIndex, item, opts, record) { me.actionColumnClick(record); }, getClass: me.actionColumnItemGetClassCallback }; }, getTranslatableFields: function() { var me = this, field; if (!me.grid) { return false; } var columns = me.grid.headerCt; var translatableFields = []; columns.items.each(function(column) { if (column.initialConfig.translationEditor) { translatableFields.push(column.initialConfig.translationEditor); } }); return translatableFields; }, actionColumnClick: function(record) { var me = this; me.translatableFields = me.getTranslatableFields(); if (!record || me.translatableFields.length === 0) { return false; } if(typeof(Shopware.app.Application.addSubApplication) !== 'function') { Ext.Error.raise('Your ExtJS application does not support sub applications'); } Ext.each(me.translatableFields, function(field) { if (record.get(field.name)) { field.emptyText = record.get(field.name); } }); me.translationKey = record.getId(); Shopware.app.Application.addSubApplication({ name: 'Shopware.apps.Translation', eventScope: me, translationCallback: me.translationCallback, translatableFields: me.translatableFields, translationType: me.translationType, translationMerge: me.translationMerge, translationKey: me.translationKey }); return true; }, destroy: function() { this.clearListeners(); delete this.grid this.callParent(arguments); } }); Ext.define('Shopware.form.PluginPanel', { extend: 'Ext.form.Panel', alternateClassName: 'Shopware.form.ConfigPanel', alias: 'widget.plugin-form-panel', shopStore: Ext.create('Shopware.apps.Base.store.ShopLanguage'), formStore: Ext.create('Shopware.apps.Base.store.Form'), injectActionButtons: false, descriptionField: true, _descriptionAdded: false, noFormIdConfiguredErrorText: 'No formId is passed to the component configuration', formNotLoadedErrorText: "The form store couldn't be loaded successfully.", snippets: { resetButton: 'Zur\u00FCcksetzen', saveButton: 'Speichern', description: 'Beschreibung', onSaveFormTitle: 'Formular speichern', saveFormSuccess: 'Formular \u201E[name]\u201C wurde gespeichert.', saveFormError: 'Forumular \u201E[name]\u201C konnte nicht gespeichert werden.' }, initComponent: function() { var me = this; if(!me.formId) { Ext.Error.raise(me.noFormIdConfiguredErrorText); return false; } me.formId = ~~(1 * me.formId); if(!me.shopStore.getCount()) { me.shopStore.load(); } me.formStore.on('load', me.onLoadForm, me, { single: true }); me.formStore.load({ filters : [{ property: 'id', value: me.formId }] }); me.callParent(arguments); }, onLoadForm: function(store, records, success) { var me = this; if (success !== true || !records.length) { Ext.Error.raise(me.formNotLoadedErrorText); return false; } me.initForm(records[0]); }, initForm: function(form) { var me = this; if(me.shopStore.isLoading() || !me.rendered) { Ext.defer(me.initForm, 100, me, [ form ]); return false; } if(me.injectActionButtons) { me.addDocked(me.getButtons()); } me.add(me.getItems(form)); me.loadRecord(form); }, getButtons: function() { var me = this; return { dock: 'bottom', xtype: 'toolbar', items: ['->', { text: me.snippets.resetButton, cls: 'secondary', action: 'reset' }, { text: me.snippets.saveButton, cls: 'primary', action: 'save' }] }; }, getItems: function(form) { var me = this, type, name, value, elementLabel = '', elementDescription = '', elementName, items = [], tabs = [], options; if(form.get('description') && me.descriptionField) { if(!me._descriptionAdded) { items.push({ xtype: 'fieldset', margin: 10, title: me.snippets.description, html: form.get('description') }); me._descriptionAdded = true; } } me.shopStore.each(function(shop) { var fields = []; form.getElements().each(function(element) { value = element.getValues().find('shopId', shop.getId()); value = element.getValues().getAt(value); var initialValue = value; type = element.get('type').toLowerCase(); type = 'base-element-' + type; name = 'values[' + shop.get('id') + ']['+ element.get('id') + ']'; options = element.get('options'); options = options || {}; delete options.attributes; elementName = element.get('name'); elementLabel = element.get('label'); elementDescription = element.get('description'); if(element.associations.containsKey('getTranslation')) { if(element.getTranslation().getAt(0) && element.getTranslation().getAt(0).get('label')) { elementLabel = element.getTranslation().getAt(0).get('label'); } if(element.getTranslation().getAt(0) && element.getTranslation().getAt(0).get('description')) { elementDescription = element.getTranslation().getAt(0).get('description'); } } var field = Ext.apply({ xtype: type, name: name, elementName: elementName, fieldLabel: elementLabel, helpText: elementDescription, //helpText value: value ? value.get('value') : element.get('value'), emptyText: shop.get('default') ? null : element.get('value'), disabled: !element.get('scope') && !shop.get('default'), allowBlank: !element.get('required') || !shop.get('default') }, options); if (field.xtype == "base-element-boolean" || field.xtype == "base-element-checkbox") { field = me.convertCheckBoxToComboBox(field, shop, initialValue); } fields.push(field); }); if(fields.length > 0) { tabs.push({ xtype: 'base-element-fieldset', title: shop.get('name'), items: fields }); } }); if(tabs.length > 1) { items.push({ xtype: 'tabpanel', bodyStyle: 'background-color: transparent !important', border: 0, activeTab: 0, enableTabScroll: true, deferredRender: false, items: tabs, plain: true }); } else if(tabs.length == 1) { if(tabs[0].title) { delete tabs[0].title; } items.push({ xtype: 'panel', bodyStyle: 'background-color: transparent !important', border: 0, layout: 'fit', items: tabs, bodyBorder: 0 }); } return items; }, convertCheckBoxToComboBox: function (field, shop, initialValue) { var booleanSelectValue = field.value; if (shop.get('id') != 1 && initialValue === undefined) { booleanSelectValue = ''; } else { booleanSelectValue = Boolean(field.value); } Ext.apply(field, { xtype: "base-element-boolean-select", value: booleanSelectValue, emptyText: "" }); return field; }, onSaveForm: function(formPanel, closeWindow, callback) { var me = this, basicForm = formPanel.getForm() || me.getForm(), form = basicForm.getRecord(), values = basicForm.getFieldValues(), fieldName, fieldValue, valueStore, win = formPanel.up('window'); closeWindow = closeWindow || false; form.getElements().each(function(element) { valueStore = element.getValues(); valueStore.removeAll(); me.shopStore.each(function(shop) { fieldName = 'values[' + shop.get('id') + ']['+ element.get('id') + ']'; fieldValue = values[fieldName]; if(fieldValue !== '' && fieldValue !== null) { valueStore.add({ shopId: shop.get('id'), value: fieldValue }); } }); }); form.setDirty(); var title = me.snippets.onSaveFormTitle; form.store.add(form); form.store.sync({ success :function (records, operation) { var template = new Ext.Template(me.snippets.saveFormSuccess), message = template.applyTemplate({ name: form.data.label || form.data.name }); Shopware.Notification.createGrowlMessage(title, message, win.title); if(closeWindow) { win.destroy(); } if(callback) { callback.apply(me, records, operation); } }, failure:function (records, operation) { var template = new Ext.Template(me.snippets.saveFormError), message = template.applyTemplate({ name: form.data.label || form.data.name }); Shopware.Notification.createGrowlMessage(title, message, win.title); } }); } }); Ext.define('Shopware.component.Preloader', { activePrio: 0, eventProvider: undefined, finished: false, requiredComponents: [{ 'Shopware.apps.Article': false, 'Shopware.apps.ArticleList': false, 'Shopware.apps.Order': false, 'Shopware.apps.Customer': false }, { 'Shopware.apps.Emotion': false, 'Shopware.apps.MediaManager': false }, { 'Shopware.apps.Blog': false }], bindEvents: function(cmp) { var me = this; me.eventProvider = cmp; me.eventProvider.on('baseComponentsReady', me.onBaseComponentsReady, me, { single: true }); me.eventProvider.on('subAppLoaded', me.onSubAppLoaded, me); }, onBaseComponentsReady: function() { var me = this; me.triggerLoadPrio(); }, onSubAppLoaded: function(subApp) { var me = this, clsName = subApp.$className; if(me.finished) { return; } if(!me.requiredComponents[me.activePrio].hasOwnProperty(clsName)) { return; } me.requiredComponents[me.activePrio][clsName] = true; if(me.isPrioLoaded(me.activePrio)) { me.activePrio += 1; if(!me.requiredComponents[me.activePrio]) { me.finished = true; me.eventProvider.removeListener('subAppLoaded', me.onSubAppLoaded, me); return; } me.triggerLoadPrio(); } }, isPrioLoaded: function(prio) { var me = this, prioGroup = me.requiredComponents[prio], allLoaded = true; Ext.iterate(prioGroup, function(index, item) { if(!item) { allLoaded = false; return false; } }); return allLoaded; }, triggerLoadPrio: function() { var me = this, prioGroup = me.requiredComponents[me.activePrio]; Ext.iterate(prioGroup, function(name, item) { if(!Ext.ClassManager.isCreated(name)) { Ext.require(name); } }); } }); Ext.define('Shopware.component.IconPreloader', { loadPath: null, extension: '.css', iconSheets: [ 'extra-icon-set-01', 'extra-icon-set-02', 'extra-icon-set-03', 'extra-icon-set-04', 'extra-icon-set-05', 'extra-icon-set-06', 'extra-icon-set-07', 'extra-icon-set-08', 'extra-icon-set-keys' ], preloadDelay: 500, constructor: function(options) { var me = this, task; if(!options.hasOwnProperty('loadPath')) { Ext.Error.raise({ sourceClass: me.$className, sourceMethod: "constructor", msg: me.$className + " needs an loadPath to work correctly." }); } me.loadPath = options.loadPath; Ext.defer(me.startPreloading, me.preloadDelay, me); }, getLoadPath: function() { return this.loadPath; }, setLoadPath: function(path) { if(!path.length) { return false; } this.loadPath = path; return true; }, startPreloading: function() { var me = this; Ext.Array.each(me.iconSheets, function(sheet) { me.injectStylesheet(sheet); }); }, injectStylesheet: function(sheet) { var me = this, el = document.createElement('link'), head = Ext.getHead(), basicOpts = { 'rel': 'stylesheet', 'type': 'text/css', 'media': 'all' }; basicOpts = Ext.apply(basicOpts, { 'href': me.loadPath + '/' + sheet + me.extension + "?" + Ext.shopwareRevision }); for(var key in basicOpts) { el.setAttribute(key, basicOpts[key]); } head.appendChild(el); } }); Ext.define('Shopware.global.ErrorReporter', { extend: 'Ext.app.Controller', mainWindow: null, snippets: { general: { title: 'Shopware Fehler Reporter', error_title: 'Fehler-Information', browser_title: 'Browser-Information', cancel: 'Abbrechen' }, xhr: { module: 'Modul', request_path: 'Request-Pfad', http_error: 'HTTP Fehlermeldung', http_status: 'HTTP Statuscode', error_desc: 'Fehler Beschreibung', module_files: 'Module-Dateien', class_name: 'Klassen-Name', path: 'Pfad', type: 'Typ', unknown_type: 'Unbekannter Typ', reload_module: 'Modul erneut laden' }, eval: { reload_admin: 'Administration neuladen', error_type: 'Fehler-Typ', error_msg: 'Fehlermeldung' }, browser: { os: 'Betriebssystem', browser_engine: 'Browser-Engine', window_size: 'Fenster-Größe', java_enabled: 'Java aktiviert', cookies_enabled: 'Cookies aktiviert', lang: 'Sprache', plugins: 'Browser-Plugins', plugin_name: 'Plugin-Name', plugin_path: 'Plugin-Pfad' } }, bindEvents: function(cmp) { var me = this; cmp.on('Ext.Loader:xhrFailed', me.onXhrErrorOccurs, me); cmp.on('Ext.Loader:evalFailed', me.onEvalErrorOccurs, me); }, onXhrErrorOccurs: function(xhr, namespace, requestType) { var me = this; me.mainWindow = Ext.create('Ext.window.Window', { width: 800, height: 600, modal: true, title: me.snippets.general.title, dockedItems: [ me.createActionToolbar(namespace, true) ] , renderTo: Ext.getBody(), items: [{ xtype: 'tabpanel', defaults: { bodyPadding: 15 }, items: [{ title: me.snippets.general.error_title, items: [ me.createErrorInformation(xhr, namespace, requestType), me.createErrorDescription(xhr), me.createErrorFilesList(namespace) ] }, { title: me.snippets.general.browser_title, items: [ me.createBrowserInformation(), me.createUserAgentInformation(), me.createBrowserPluginList() ] }] }] }).show(); }, onEvalErrorOccurs: function(err, xhr, namespace, requestType) { var me = this; me.mainWindow = Ext.create('Ext.window.Window', { width: 800, height: 600, modal: true, title: me.snippets.general.title, dockedItems: [ me.createActionToolbar(namespace, false) ] , renderTo: Ext.getBody(), items: [{ xtype: 'tabpanel', defaults: { bodyPadding: 15 }, items: [{ title: me.snippets.general.error_title, items: [ me.createEvalErrorInformation(err, xhr, namespace, requestType), me.createEvalErrorDescription(err), me.createErrorFilesList(namespace) ] }, { title: me.snippets.general.browser_title, items: [ me.createBrowserInformation(), me.createUserAgentInformation(), me.createBrowserPluginList() ] }] }] }).show(); }, createErrorInformation: function(xhr, namespace, requestType) { var me = this; return { xtype: 'fieldset', title: me.snippets.general.error_title, layout: 'column', defaults: { xtype: 'container', columnWidth: 0.5, layout: 'anchor', defaults: { anchor: '100%', readOnly: true, xtype: 'displayfield', labelWidth: 155, labelStyle: 'margin-top: 0' } }, items: [{ items: [{ fieldLabel: me.snippets.xhr.module, value: namespace.prefix }, { fieldLabel: me.snippets.xhr.request_path, value: namespace.path }] }, { margin: '0 0 0 15', items: [{ fieldLabel: me.snippets.xhr.http_error, value: xhr.statusText }, { fieldLabel: me.snippets.xhr.http_status, value: Ext.String.format('[0] / [1]', xhr.status, requestType.toUpperCase()) }] }] }; }, createErrorDescription: function(xhr) { var me = this; return { xtype: 'fieldset', title: me.snippets.xhr.error_desc, layout: 'anchor', height: 175, items: [{ xtype: 'textarea', anchor: '100%', height: 125, value: xhr.responseText }] } }, createErrorFilesList: function(namespace) { var data = [], me = this, store; var getFileType = function(path) { var regEx = /^([a-zA-Z]+)\//, result = regEx.exec(path); if(!result) { return me.snippets.xhr.unknown_type; } result = result[1]; return result.charAt(0).toUpperCase() + result.slice(1); }; Ext.each(namespace.classNames, function(cls, i) { data.push({ id: i + 1, name: cls, path: namespace.files[i], type: getFileType(namespace.files[i]) }); }); store = Ext.create('Ext.data.Store', { fields: [ 'id', 'name', 'path', 'type' ], groupField: 'type', data: data }); return { xtype: 'gridpanel', store: store, title: me.snippets.xhr.module_files, height: 175, features: [{ ftype:'grouping', groupHeaderTpl: '{name} ({rows.length})' }], columns: [{ dataIndex: 'id', header: '#', width: 35 }, { dataIndex: 'name', header: me.snippets.xhr.class_name, flex: 1, renderer: function(val) { return '' + val + ''; } }, { dataIndex: 'path', header: me.snippets.xhr.path, flex: 1 }, { dataIndex: 'type', header: me.snippets.xhr.type, flex: 1 }] }; }, createActionToolbar: function(namespace, showReload) { var me = this, reloadButton, toolbar; reloadButton = Ext.create('Ext.button.Button', { text: me.snippets.xhr.reload_module, cls: 'primary', handler: function() { Ext.require(namespace.classNames); me.mainWindow.destroy(); } }); toolbar = Ext.create('Ext.toolbar.Toolbar', { dock: 'bottom', padding: 5, items: [ '->', { xtype: 'button', text: me.snippets.general.cancel, cls: 'secondary', handler: function() { me.mainWindow.destroy(); } }] }); if(showReload) { toolbar.add(reloadButton); } else { toolbar.add({ xtype: 'button', text: me.snippets.eval.reload_admin, cls: 'primary', handler: function() { window.location.reload(); } }); } return toolbar; }, createEvalErrorInformation: function(err, xhr, namespace) { var me = this; return { xtype: 'fieldset', title: me.snippets.general.error_title, layout: 'column', defaults: { xtype: 'container', columnWidth: 0.5, layout: 'anchor', defaults: { anchor: '100%', readOnly: true, xtype: 'displayfield', labelWidth: 155, labelStyle: 'margin-top: 0' } }, items: [{ items: [{ fieldLabel: me.snippets.xhr.module, value: namespace.prefix }, { fieldLabel: me.snippets.xhr.request_path, value: namespace.path }] }, { margin: '0 0 0 15', items: [{ fieldLabel: me.snippets.eval.error_type, value: err.name }, { fieldLabel: me.snippets.eval.error_msg, value: err.message }] }] }; }, createEvalErrorDescription: function(err) { return { xtype: 'fieldset', title: 'Stack-Trace', layout: 'anchor', height: 175, items: [{ xtype: 'textarea', anchor: '100%', height: 125, value: err.stack }] } }, createUserAgentInformation: function() { return { xtype: 'fieldset', title: 'User-Agent', layout: 'anchor', height: 125, items: [{ xtype: 'textarea', anchor: '100%', height: 75, value: navigator.userAgent }] } }, createBrowserInformation: function() { var me = this, uaParser = new UAParser(), uaResult = uaParser.getResult(); return { xtype: 'fieldset', title: me.snippets.general.browser_title, layout: 'column', defaults: { xtype: 'container', columnWidth: 0.5, layout: 'anchor', defaults: { anchor: '100%', readOnly: true, xtype: 'displayfield', labelWidth: 155, labelStyle: 'margin-top: 0' } }, items: [{ items: [{ fieldLabel: 'Browser', value: Ext.String.format('[0] [1]', uaResult.browser.name || 'No data', uaResult.browser.version || 'No data') }, { fieldLabel: me.snippets.browser.browser_engine, value: Ext.String.format('[0] [1]', uaResult.engine.name || 'No data', uaResult.engine.version || 'No data') }, { fieldLabel: me.snippets.browser.os, value: Ext.String.format('[0] [1]', uaResult.os.name || 'No data', uaResult.os.version || 'No data') }, { fieldLabel: 'ExtJS', value: Ext.versions.extjs.version }] }, { margin: '0 0 0 15', items: [{ fieldLabel: me.snippets.browser.window_size, value: Ext.String.format('[0]x[1] Pixel', window.outerWidth, window.outerHeight) }, { xtype: 'checkbox', labelStyle: 'margin-top: 5px', fieldLabel: me.snippets.browser.java_enabled, checked: !!navigator.javaEnabled() }, { xtype: 'checkbox', labelStyle: 'margin-top: 5px', fieldLabel: me.snippets.browser.cookies_enabled, checked: !!navigator.cookieEnabled }, { fieldLabel: me.snippets.browser.lang, value: navigator.language || navigator.userLanguage }] }] }; }, createBrowserPluginList: function() { var me = this, data = [], store; Ext.each(navigator.plugins, function(plugin, i) { data.push({ id: i + 1, name: plugin.description || plugin.name, path: plugin.filename }); }); store = Ext.create('Ext.data.Store', { fields: [ 'id', 'name', 'path' ], data: data }); return { xtype: 'gridpanel', store: store, title: me.snippets.browser.plugins, height: 175, columns: [{ dataIndex: 'id', header: '#', width: 35 }, { dataIndex: 'name', header: me.snippets.browser.plugin_name, flex: 1, renderer: function(val) { return '' + val + ''; } }, { dataIndex: 'path', header: me.snippets.browser.plugin_path, flex: 1 }] }; } }); !function(window,undefined){"use strict";var EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet";var util={has:function(str1,str2){return str2.toLowerCase().indexOf(str1.toLowerCase())!==-1},lowerize:function(str){return str.toLowerCase()}};var mapper={rgx:function(){for(var result,i=0,j,k,p,q,matches,match,args=arguments;i0){if(q.length==2){if(typeof q[1]==FUNC_TYPE){result[q[0]]=q[1].call(this,match)}else{result[q[0]]=q[1]}}else if(q.length==3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){result[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{result[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length==4){result[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{result[q]=match?match:undefined}}break}}if(!!matches)break}return result},str:function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j 128) ? '#000' : '#FFF'); }, onMenuHide: function () { this.focus(false, 60); this.menuEvents('un'); } }); Ext.define('Ext.ux.ColorPicker', { extend: 'Ext.menu.ColorPicker', initComponent: function () { var me = this; me.height = 100; me.hideOnClick = true; me.callParent(); return me.processEvent(); }, processEvent: function () { return; var me = this; me.picker.clearListeners(); me.relayEvents(me.picker, ['select']); if (me.hideOnClick) { me.on('select', me.hidePickerOnSelect, me); } } }); Ext.define('Shopware.apps.Base.view.element.Date', { extend: 'Ext.form.field.Date', alias: [ 'widget.base-element-date', 'widget.base-element-datefield' ] }); Ext.define('Shopware.apps.Base.view.element.DateTime', { extend:'Ext.form.FieldContainer', alias: [ 'widget.base-element-datetime' ], mixins: { field: 'Ext.form.field.Field' }, layout: 'fit', timePosition: 'right', // valid values:'below', 'right' dateCfg:{}, timeCfg:{}, allowBlank: true, initComponent: function() { var me = this; if(!me.value) { me.value = null; } else if (typeof(me.value) == 'string') { me.value = me.value.replace(' ', 'T'); me.value = new Date(me.value); } me.buildField(); me.callParent(); me.dateField = me.down('datefield'); me.timeField = me.down('timefield'); me.initField(); }, buildField: function() { var me = this, l, d; if (me.timePosition == 'below') { l = { type: 'anchor' }; d = { anchor: '100%' }; } else { l = { type: 'hbox', align: 'middle' }; d = { flex: 1 }; } this.items = { xtype: 'container', layout: l, defaults: d, items: [Ext.apply({ xtype: 'datefield', disabled: me.disabled, value: me.value, readOnly: !!me.readOnly, width: me.timePosition != 'below' ? 100 : undefined, allowBlank: me.allowBlank, listeners: { specialkey: me.onSpecialKey, scope: me }, isFormField: false // prevent submission }, me.dateCfg), Ext.apply({ xtype: 'timefield', format: 'H:i:s', disabled: me.disabled, value: me.value, readOnly: !!me.readOnly, margin: me.timePosition != 'below' ? '0 0 0 3' : 0, width: me.timePosition != 'below' ? 80 : undefined, allowBlank: me.allowBlank, listeners: { specialkey: me.onSpecialKey, scope: me }, isFormField: false // prevent submission }, me.timeCfg)] }; }, focus: function() { this.callParent(); this.dateField.focus(false, 100); }, onSpecialKey:function(cmp, e) { var key = e.getKey(); if (key === e.TAB) { if (cmp == this.dateField) { if (e.shiftKey) { this.fireEvent('specialkey', this, e); } } if (cmp == this.timeField) { if (!e.shiftKey) { this.fireEvent('specialkey', this, e); } } } else if (this.inEditor) { this.fireEvent('specialkey', this, e); } }, getValue: function() { var value, date = this.dateField.getSubmitValue(), time = this.timeField.getSubmitValue(); if (date) { if (time) { var format = this.getFormat(); value = Ext.Date.parse(date + ' ' + time, format); } else { value = this.dateField.getValue(); } } return value }, setValue: function(value) { this.dateField.setValue(value); this.timeField.setValue(value); }, getSubmitData: function() { var value = this.getValue(); var format = this.getFormat(); return value ? Ext.Date.format(value, format) : null; }, getFormat: function() { return (this.dateField.submitFormat || this.dateField.format) + " " + (this.timeField.submitFormat || this.timeField.format) }, getErrors: function() { return this.dateField.getErrors().concat(this.timeField.getErrors()); }, validate: function() { if (this.disabled) return true; else { var isDateValid = this.dateField.validate(); var isTimeValid = this.timeField.validate(); return isDateValid && isTimeValid; } }, reset: function() { this.mixins.field.reset(); this.dateField.reset(); this.timeField.reset(); } }); Ext.define('Shopware.apps.Base.view.element.Fieldset', { extend: 'Ext.panel.Panel', alias: 'widget.base-element-fieldset', bodyPadding: 10, border: false, layout: 'form', defaults: { anchor: '100%', labelWidth: 250, hideEmptyLabel: false }, initComponent:function () { var me = this; me.callParent(arguments); } }); Ext.define('Shopware.apps.Base.view.element.Html', { extend: 'Ext.form.field.HtmlEditor', alias: [ 'widget.base-element-html', 'widget.base-element-htmleditor' ] }); Ext.define('Shopware.apps.Base.view.element.Interval', { extend:'Ext.form.field.ComboBox', alias:[ 'widget.base-element-interval' ], queryMode: 'local', forceSelection: false, editable: true, store: [ [0, 'Kein (0 Sek.)'], [120, '2 Minuten (120 Sek.)'], [120, '5 Minuten (300 Sek.)'], [120, '10 Minuten (600 Sek.)'], [900, '15 Minuten (900 Sek.)'], [1800, '30 Minuten (1800 Sek.)'], [3600, '1 Stunde (3600 Sek.)'], [7200, '2 Stunden (7200 Sek.)'], [14400, '4 Stunden (14400 Sek.)'], [28800, '12 Stunden (28800 Sek.)'], [86400, '1 Tag (86400 Sek.)'], [172800, '2 Tage (172800 Sek.)'], [604800, '1 Woche (604800 Sek.)'] ], initComponent:function () { var me = this; me.callParent(arguments); } }); Ext.define('Shopware.apps.Base.view.element.Number', { extend: 'Ext.form.field.Number', alias: [ 'widget.base-element-number', 'widget.base-element-numberfield' ], submitLocaleSeparator: false }); Ext.define('Shopware.apps.Base.view.element.Select', { extend:'Ext.form.field.ComboBox', alias:[ 'widget.base-element-select', 'widget.base-element-combo', 'widget.base-element-combobox', 'widget.base-element-comboremote' ], queryMode:'local', forceSelection: false, editable: true, valueField: 'id', displayField: 'name', initComponent:function () { var me = this; if (me.controller && me.action) { me.store = new Ext.data.Store({ url:'/backend/' + me.controller + '/' + me.action, autoLoad:true, reader:new Ext.data.JsonReader({ root:me.root || 'data', totalProperty:me.count || 'total', fields:me.fields }) }); me.valueField = me.displayField; } if (typeof(me.store) == 'string' && me.store.indexOf('new ') !== -1) { eval('me.store = ' + me.store + ';'); me.valueField = me.displayField; } me.callParent(arguments); }, setValue:function (value) { var me = this; if (value !== null && !me.store.loading && me.store.getCount() == 0) { me.store.load({ callback:function () { if(me.store.getCount() > 0) { me.setValue(value); } else { me.setValue(null); } } }); return; } me.callParent(arguments); } }); Ext.define('Shopware.apps.Base.view.element.SelectTree', { extend: 'Shopware.form.field.ComboTree', alias: [ 'widget.base-element-selecttree', 'widget.base-element-combotree' ], queryMode: 'local', forceSelection: false, editable: true, valueField: 'id', displayField: 'name', initComponent:function () { var me = this; if(me.store) { me.store = Ext.data.StoreManager.lookup(me.store) } me.callParent(arguments); }, setValue:function (value) { var me = this, store = me.store; if (value && !store.loading && (!store.getCount() || !store.getNodeById(me.value))) { store.load({ filters: [{ property: 'id', value: value }] }); } me.callParent(arguments); }, onStoreHasLoaded: function(store) { var me = this; me.callParent(arguments); if(store.filters && store.filters.getCount()) { store.load(); } } }); Ext.define('Shopware.apps.Base.view.element.Text', { extend: 'Ext.form.field.Text', alias: [ 'widget.base-element-text', 'widget.base-element-textfield' ] }); Ext.define('Shopware.apps.Base.view.element.TextArea', { extend: 'Ext.form.field.TextArea', alias: [ 'widget.base-element-textarea' ], grow: true }); Ext.define('Shopware.apps.Base.view.element.Time', { extend: 'Ext.form.field.Time', alias: [ 'widget.base-element-time', 'widget.base-element-timefield' ] }); Ext.define('Shopware.apps.Base.view.element.MediaSelection', { extend: 'Shopware.MediaManager.MediaSelection', alias: [ 'widget.base-element-media', 'widget.base-element-mediaselection', 'widget.base-element-mediafield', 'widget.base-element-mediaselectionfield' ] });