{"version":3,"file":"filemanager.min.js","sources":["../node_modules/webix-jet/dist/es6/jet.js","../node_modules/jet-restate/index.js","../node_modules/jet-hotkey/index.js","../sources/helpers/icons.js","../sources/views/menus/menubody.js","../sources/views/menus/contextmenu.js","../sources/views/sections/dataview.js","../sources/views/cards.js","../sources/helpers/common.js","../node_modules/@wbx/view-codemirror-editor/codemirror.js","../sources/views/editor.js","../sources/helpers/prompt.js","../sources/views/menus/addnewmenu.js","../sources/views/folders.js","../sources/views/list.js","../sources/views/mobile/previewpopup.js","../sources/views/mobile/sidetree.js","../sources/views/panel-double.js","../sources/views/panel-search.js","../sources/views/panel.js","../sources/views/preview/info.js","../sources/views/preview/index.js","../node_modules/@wbx/view-plyr/plyr.js","../sources/views/preview/media.js","../sources/views/preview/template.js","../sources/views/progress.js","../sources/helpers/responsive.js","../sources/views/topbar.js","../sources/views/top.js","../sources/export_views.js","../sources/models/Backend.js","../sources/models/Cache.js","../sources/models/LocalData.js","../sources/models/Upload.js","../sources/models/Progress.js","../sources/models/Operations.js","../sources/app.js","../sources/locales/en.js"],"sourcesContent":["class NavigationBlocked {\r\n}\n\nclass JetBase {\r\n constructor(webix, config) {\r\n this.webixJet = true;\r\n this.webix = webix;\r\n this._events = [];\r\n this._subs = {};\r\n this._data = {};\r\n if (config && config.params)\r\n webix.extend(this._data, config.params);\r\n }\r\n getRoot() {\r\n return this._root;\r\n }\r\n destructor() {\r\n this._detachEvents();\r\n this._destroySubs();\r\n this._events = this._container = this.app = this._parent = this._root = null;\r\n }\r\n setParam(id, value, url) {\r\n if (this._data[id] !== value) {\r\n this._data[id] = value;\r\n this._segment.update(id, value, 0);\r\n if (url) {\r\n return this.show(null);\r\n }\r\n }\r\n }\r\n getParam(id, parent) {\r\n const value = this._data[id];\r\n if (typeof value !== \"undefined\" || !parent) {\r\n return value;\r\n }\r\n const view = this.getParentView();\r\n if (view) {\r\n return view.getParam(id, parent);\r\n }\r\n }\r\n getUrl() {\r\n return this._segment.suburl();\r\n }\r\n getUrlString() {\r\n return this._segment.toString();\r\n }\r\n getParentView() {\r\n return this._parent;\r\n }\r\n $$(id) {\r\n if (typeof id === \"string\") {\r\n const root = this.getRoot();\r\n return root.queryView((obj => (obj.config.id === id || obj.config.localId === id) &&\r\n (obj.$scope === root.$scope)), \"self\");\r\n }\r\n else {\r\n return id;\r\n }\r\n }\r\n on(obj, name, code) {\r\n const id = obj.attachEvent(name, code);\r\n this._events.push({ obj, id });\r\n return id;\r\n }\r\n contains(view) {\r\n for (const key in this._subs) {\r\n const kid = this._subs[key].view;\r\n if (kid === view || kid.contains(view)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n getSubView(name) {\r\n const sub = this.getSubViewInfo(name);\r\n if (sub) {\r\n return sub.subview.view;\r\n }\r\n }\r\n getSubViewInfo(name) {\r\n const sub = this._subs[name || \"default\"];\r\n if (sub) {\r\n return { subview: sub, parent: this };\r\n }\r\n if (name === \"_top\") {\r\n this._subs[name] = { url: \"\", id: null, popup: true };\r\n return this.getSubViewInfo(name);\r\n }\r\n // when called from a child view, searches for nearest parent with subview\r\n if (this._parent) {\r\n return this._parent.getSubViewInfo(name);\r\n }\r\n return null;\r\n }\r\n _detachEvents() {\r\n const events = this._events;\r\n for (let i = events.length - 1; i >= 0; i--) {\r\n events[i].obj.detachEvent(events[i].id);\r\n }\r\n }\r\n _destroySubs() {\r\n // destroy sub views\r\n for (const key in this._subs) {\r\n const subView = this._subs[key].view;\r\n // it possible that subview was not loaded with any content yet\r\n // so check on null\r\n if (subView) {\r\n subView.destructor();\r\n }\r\n }\r\n // reset to prevent memory leaks\r\n this._subs = {};\r\n }\r\n _init_url_data() {\r\n const url = this._segment.current();\r\n this._data = {};\r\n this.webix.extend(this._data, url.params, true);\r\n }\r\n _getDefaultSub() {\r\n if (this._subs.default) {\r\n return this._subs.default;\r\n }\r\n for (const key in this._subs) {\r\n const sub = this._subs[key];\r\n if (!sub.branch && sub.view && key !== \"_top\") {\r\n const child = sub.view._getDefaultSub();\r\n if (child) {\r\n return child;\r\n }\r\n }\r\n }\r\n }\r\n _routed_view() {\r\n const parent = this.getParentView();\r\n if (!parent) {\r\n return true;\r\n }\r\n const sub = parent._getDefaultSub();\r\n if (!sub && sub !== this) {\r\n return false;\r\n }\r\n return parent._routed_view();\r\n }\r\n}\n\nfunction parse(url) {\r\n // remove starting /\r\n if (url[0] === \"/\") {\r\n url = url.substr(1);\r\n }\r\n // split url by \"/\"\r\n const parts = url.split(\"/\");\r\n const chunks = [];\r\n // for each page in url\r\n for (let i = 0; i < parts.length; i++) {\r\n const test = parts[i];\r\n const result = {};\r\n // detect params\r\n // support old \t\t\tsome:a=b:c=d\r\n // and new notation\t\tsome?a=b&c=d\r\n let pos = test.indexOf(\":\");\r\n if (pos === -1) {\r\n pos = test.indexOf(\"?\");\r\n }\r\n if (pos !== -1) {\r\n const params = test.substr(pos + 1).split(/[\\:\\?\\&]/g);\r\n // create hash of named params\r\n for (const param of params) {\r\n const dchunk = param.split(\"=\");\r\n result[dchunk[0]] = decodeURIComponent(dchunk[1]);\r\n }\r\n }\r\n // store parsed values\r\n chunks[i] = {\r\n page: (pos > -1 ? test.substr(0, pos) : test),\r\n params: result,\r\n isNew: true\r\n };\r\n }\r\n // return array of page objects\r\n return chunks;\r\n}\r\nfunction url2str(stack) {\r\n const url = [];\r\n for (const chunk of stack) {\r\n url.push(\"/\" + chunk.page);\r\n const params = obj2str(chunk.params);\r\n if (params) {\r\n url.push(\"?\" + params);\r\n }\r\n }\r\n return url.join(\"\");\r\n}\r\nfunction obj2str(obj) {\r\n const str = [];\r\n for (const key in obj) {\r\n if (typeof obj[key] === \"object\")\r\n continue;\r\n if (str.length) {\r\n str.push(\"&\");\r\n }\r\n str.push(key + \"=\" + encodeURIComponent(obj[key]));\r\n }\r\n return str.join(\"\");\r\n}\n\nclass Route {\r\n constructor(route, index) {\r\n this._next = 1;\r\n if (typeof route === \"string\") {\r\n this.route = {\r\n url: parse(route),\r\n path: route\r\n };\r\n }\r\n else {\r\n this.route = route;\r\n }\r\n this.index = index;\r\n }\r\n current() {\r\n return this.route.url[this.index];\r\n }\r\n next() {\r\n return this.route.url[this.index + this._next];\r\n }\r\n suburl() {\r\n return this.route.url.slice(this.index);\r\n }\r\n shift(params) {\r\n const route = new Route(this.route, this.index + this._next);\r\n route.setParams(route.route.url, params, route.index);\r\n return route;\r\n }\r\n setParams(url, params, index) {\r\n if (params) {\r\n const old = url[index].params;\r\n for (var key in params)\r\n old[key] = params[key];\r\n }\r\n }\r\n refresh() {\r\n const url = this.route.url;\r\n for (let i = this.index + 1; i < url.length; i++) {\r\n url[i].isNew = true;\r\n }\r\n }\r\n toString() {\r\n const str = url2str(this.suburl());\r\n return str ? str.substr(1) : \"\";\r\n }\r\n _join(path, kids) {\r\n let url = this.route.url;\r\n if (path === null) { // change of parameters, route elements are not affected\r\n return url;\r\n }\r\n const old = this.route.url;\r\n let reset = true;\r\n url = old.slice(0, this.index + (kids ? this._next : 0));\r\n if (path) {\r\n url = url.concat(parse(path));\r\n for (let i = 0; i < url.length; i++) {\r\n if (old[i]) {\r\n url[i].view = old[i].view;\r\n }\r\n if (reset && old[i] && url[i].page === old[i].page) {\r\n url[i].isNew = false;\r\n }\r\n else if (url[i].isNew) {\r\n // if some segment was marked as new, all subsegments must be updated as well\r\n reset = false;\r\n }\r\n }\r\n }\r\n return url;\r\n }\r\n append(path) {\r\n const url = this._join(path, true);\r\n this.route.path = url2str(url);\r\n this.route.url = url;\r\n return this.route.path;\r\n }\r\n show(path, view, kids) {\r\n const url = this._join(path.url, kids);\r\n this.setParams(url, path.params, this.index + (kids ? this._next : 0));\r\n return new Promise((res, rej) => {\r\n const redirect = url2str(url);\r\n const obj = {\r\n url,\r\n redirect,\r\n confirm: Promise.resolve()\r\n };\r\n const app = view ? view.app : null;\r\n // when creating a new route, it possible that it will not have any content\r\n // guard is not necessary in such case\r\n if (app) {\r\n const result = app.callEvent(\"app:guard\", [obj.redirect, view, obj]);\r\n if (!result) {\r\n rej(new NavigationBlocked());\r\n return;\r\n }\r\n }\r\n obj.confirm.catch(err => rej(err)).then(() => {\r\n if (obj.redirect === null) {\r\n rej(new NavigationBlocked());\r\n return;\r\n }\r\n if (obj.redirect !== redirect) {\r\n app.show(obj.redirect);\r\n rej(new NavigationBlocked());\r\n return;\r\n }\r\n this.route.path = redirect;\r\n this.route.url = url;\r\n res();\r\n });\r\n });\r\n }\r\n size(n) {\r\n this._next = n;\r\n }\r\n split() {\r\n const route = {\r\n url: this.route.url.slice(this.index + 1),\r\n path: \"\"\r\n };\r\n if (route.url.length) {\r\n route.path = url2str(route.url);\r\n }\r\n return new Route(route, 0);\r\n }\r\n update(name, value, index) {\r\n const chunk = this.route.url[this.index + (index || 0)];\r\n if (!chunk) {\r\n this.route.url.push({ page: \"\", params: {} });\r\n return this.update(name, value, index);\r\n }\r\n if (name === \"\") {\r\n chunk.page = value;\r\n }\r\n else {\r\n chunk.params[name] = value;\r\n }\r\n this.route.path = url2str(this.route.url);\r\n }\r\n}\n\nclass JetView extends JetBase {\r\n constructor(app, config) {\r\n super(app.webix);\r\n this.app = app;\r\n //this.$config = config;\r\n this._children = [];\r\n }\r\n ui(ui, config) {\r\n config = config || {};\r\n const container = config.container || ui.container;\r\n const jetview = this.app.createView(ui);\r\n this._children.push(jetview);\r\n jetview.render(container, this._segment, this);\r\n if (typeof ui !== \"object\" || (ui instanceof JetBase)) {\r\n // raw webix UI\r\n return jetview;\r\n }\r\n else {\r\n return jetview.getRoot();\r\n }\r\n }\r\n show(path, config) {\r\n config = config || {};\r\n // convert parameters object to url\r\n if (typeof path === \"object\") {\r\n for (const key in path) {\r\n this.setParam(key, path[key]);\r\n }\r\n path = null;\r\n }\r\n else {\r\n // deligate to app in case of root prefix\r\n if (path.substr(0, 1) === \"/\") {\r\n return this.app.show(path, config);\r\n }\r\n // local path, do nothing\r\n if (path.indexOf(\"./\") === 0) {\r\n path = path.substr(2);\r\n }\r\n // parent path, call parent view\r\n if (path.indexOf(\"../\") === 0) {\r\n const parent = this.getParentView();\r\n if (parent) {\r\n return parent.show(path.substr(3), config);\r\n }\r\n else {\r\n return this.app.show(\"/\" + path.substr(3));\r\n }\r\n }\r\n const sub = this.getSubViewInfo(config.target);\r\n if (sub) {\r\n if (sub.parent !== this) {\r\n return sub.parent.show(path, config);\r\n }\r\n else if (config.target && config.target !== \"default\") {\r\n return this._renderFrameLock(config.target, sub.subview, {\r\n url: path,\r\n params: config.params,\r\n });\r\n }\r\n }\r\n else {\r\n if (path) {\r\n return this.app.show(\"/\" + path, config);\r\n }\r\n }\r\n }\r\n return this._show(this._segment, { url: path, params: config.params }, this);\r\n }\r\n _show(segment, path, view) {\r\n return segment.show(path, view, true).then(() => {\r\n this._init_url_data();\r\n return this._urlChange();\r\n }).then(() => {\r\n if (segment.route.linkRouter) {\r\n this.app.getRouter().set(segment.route.path, { silent: true });\r\n this.app.callEvent(\"app:route\", [segment.route.path]);\r\n }\r\n });\r\n }\r\n init(_$view, _$) {\r\n // stub\r\n }\r\n ready(_$view, _$url) {\r\n // stub\r\n }\r\n config() {\r\n this.app.webix.message(\"View:Config is not implemented\");\r\n }\r\n urlChange(_$view, _$url) {\r\n // stub\r\n }\r\n destroy() {\r\n // stub\r\n }\r\n destructor() {\r\n this.destroy();\r\n this._destroyKids();\r\n // destroy actual UI\r\n if (this._root) {\r\n this._root.destructor();\r\n super.destructor();\r\n }\r\n }\r\n use(plugin, config) {\r\n plugin(this.app, this, config);\r\n }\r\n refresh() {\r\n const url = this.getUrl();\r\n this.destroy();\r\n this._destroyKids();\r\n this._destroySubs();\r\n this._detachEvents();\r\n if (this._container.tagName) {\r\n this._root.destructor();\r\n }\r\n this._segment.refresh();\r\n return this._render(this._segment);\r\n }\r\n render(root, url, parent) {\r\n if (typeof url === \"string\") {\r\n url = new Route(url, 0);\r\n }\r\n this._segment = url;\r\n this._parent = parent;\r\n this._init_url_data();\r\n root = root || document.body;\r\n const _container = (typeof root === \"string\") ? this.webix.toNode(root) : root;\r\n if (this._container !== _container) {\r\n this._container = _container;\r\n return this._render(url);\r\n }\r\n else {\r\n return this._urlChange().then(() => this.getRoot());\r\n }\r\n }\r\n _render(url) {\r\n const config = this.config();\r\n if (config.then) {\r\n return config.then(cfg => this._render_final(cfg, url));\r\n }\r\n else {\r\n return this._render_final(config, url);\r\n }\r\n }\r\n _render_final(config, url) {\r\n // get previous view in the same slot\r\n let slot = null;\r\n let container = null;\r\n let show = false;\r\n if (!this._container.tagName) {\r\n slot = this._container;\r\n if (slot.popup) {\r\n container = document.body;\r\n show = true;\r\n }\r\n else {\r\n container = this.webix.$$(slot.id);\r\n }\r\n }\r\n else {\r\n container = this._container;\r\n }\r\n // view already destroyed\r\n if (!this.app || !container) {\r\n return Promise.reject(null);\r\n }\r\n let response;\r\n const current = this._segment.current();\r\n // using wrapper object, so ui can be changed from app:render event\r\n const result = { ui: {} };\r\n this.app.copyConfig(config, result.ui, this._subs);\r\n this.app.callEvent(\"app:render\", [this, url, result]);\r\n result.ui.$scope = this;\r\n /* destroy old HTML attached views before creating new one */\r\n if (!slot && current.isNew && current.view) {\r\n current.view.destructor();\r\n }\r\n try {\r\n // special handling for adding inside of multiview - preserve old id\r\n if (slot && !show) {\r\n const oldui = container;\r\n const parent = oldui.getParentView();\r\n if (parent && parent.name === \"multiview\" && !result.ui.id) {\r\n result.ui.id = oldui.config.id;\r\n }\r\n }\r\n this._root = this.app.webix.ui(result.ui, container);\r\n const asWin = this._root;\r\n // check for url added to ignore this.ui calls\r\n if (show && asWin.setPosition && !asWin.isVisible()) {\r\n asWin.show();\r\n }\r\n // check, if we are replacing some older view\r\n if (slot) {\r\n if (slot.view && slot.view !== this && slot.view !== this.app) {\r\n slot.view.destructor();\r\n }\r\n slot.id = this._root.config.id;\r\n if (this.getParentView() || !this.app.app)\r\n slot.view = this;\r\n else {\r\n // when we have subapp, set whole app as a view\r\n // so on destruction, the whole app will be destroyed\r\n slot.view = this.app;\r\n }\r\n }\r\n if (current.isNew) {\r\n current.view = this;\r\n current.isNew = false;\r\n }\r\n response = Promise.resolve(this._init(this._root, url)).then(() => {\r\n return this._urlChange().then(() => {\r\n this._initUrl = null;\r\n return this.ready(this._root, url.suburl());\r\n });\r\n });\r\n }\r\n catch (e) {\r\n response = Promise.reject(e);\r\n }\r\n return response.catch(err => this._initError(this, err));\r\n }\r\n _init(view, url) {\r\n return this.init(view, url.suburl());\r\n }\r\n _urlChange() {\r\n this.app.callEvent(\"app:urlchange\", [this, this._segment]);\r\n const waits = [];\r\n for (const key in this._subs) {\r\n const frame = this._subs[key];\r\n const wait = this._renderFrameLock(key, frame, null);\r\n if (wait) {\r\n waits.push(wait);\r\n }\r\n }\r\n return Promise.all(waits).then(() => {\r\n return this.urlChange(this._root, this._segment.suburl());\r\n });\r\n }\r\n _renderFrameLock(key, frame, path) {\r\n // if subview is not occupied by some rendering yet\r\n if (!frame.lock) {\r\n // retreive and store rendering end promise\r\n const lock = this._renderFrame(key, frame, path);\r\n if (lock) {\r\n // clear lock after frame rendering\r\n // as promise.finally is not supported by Webix lesser than 6.2\r\n // using a more verbose notation\r\n frame.lock = lock.then(() => frame.lock = null, () => frame.lock = null);\r\n }\r\n }\r\n // return rendering end promise\r\n return frame.lock;\r\n }\r\n _renderFrame(key, frame, path) {\r\n //default route\r\n if (key === \"default\") {\r\n if (this._segment.next()) {\r\n // we have a next segment in url, render it\r\n let params = path ? path.params : null;\r\n if (frame.params) {\r\n params = this.webix.extend(params || {}, frame.params);\r\n }\r\n return this._createSubView(frame, this._segment.shift(params));\r\n }\r\n else if (frame.view && frame.popup) {\r\n // there is no next segment, delete the existing sub-view\r\n frame.view.destructor();\r\n frame.view = null;\r\n }\r\n }\r\n //if new path provided, set it to the frame\r\n if (path !== null) {\r\n frame.url = path.url;\r\n if (frame.params) {\r\n path.params = this.webix.extend(path.params || {}, frame.params);\r\n }\r\n }\r\n // in case of routed sub-view\r\n if (frame.route) {\r\n // we have a new path for sub-view\r\n if (path !== null) {\r\n return frame.route.show(path, frame.view).then(() => {\r\n return this._createSubView(frame, frame.route);\r\n });\r\n }\r\n // do not trigger onChange for isolated sub-views\r\n if (frame.branch) {\r\n return;\r\n }\r\n }\r\n let view = frame.view;\r\n // if view doesn't exists yet, init it\r\n if (!view && frame.url) {\r\n if (typeof frame.url === \"string\") {\r\n // string, so we have isolated subview url\r\n frame.route = new Route(frame.url, 0);\r\n if (path)\r\n frame.route.setParams(frame.route.route.url, path.params, 0);\r\n if (frame.params)\r\n frame.route.setParams(frame.route.route.url, frame.params, 0);\r\n return this._createSubView(frame, frame.route);\r\n }\r\n else {\r\n // object, so we have an embeded subview\r\n if (typeof frame.url === \"function\" && !(view instanceof frame.url)) {\r\n view = new (this.app._override(frame.url))(this.app, \"\");\r\n }\r\n if (!view) {\r\n view = frame.url;\r\n }\r\n }\r\n }\r\n // trigger onChange for already existed view\r\n if (view) {\r\n return view.render(frame, (frame.route || this._segment), this);\r\n }\r\n }\r\n _initError(view, err) {\r\n /*\r\n if view is destroyed, ignore any view related errors\r\n */\r\n if (this.app) {\r\n this.app.error(\"app:error:initview\", [err, view]);\r\n }\r\n return true;\r\n }\r\n _createSubView(sub, suburl) {\r\n return this.app.createFromURL(suburl.current()).then(view => {\r\n return view.render(sub, suburl, this);\r\n });\r\n }\r\n _destroyKids() {\r\n // destroy child views\r\n const uis = this._children;\r\n for (let i = uis.length - 1; i >= 0; i--) {\r\n if (uis[i] && uis[i].destructor) {\r\n uis[i].destructor();\r\n }\r\n }\r\n // reset vars for better GC processing\r\n this._children = [];\r\n }\r\n}\n\n// wrapper for raw objects and Jet 1.x structs\r\nclass JetViewRaw extends JetView {\r\n constructor(app, config) {\r\n super(app, config);\r\n this._ui = config.ui;\r\n }\r\n config() {\r\n return this._ui;\r\n }\r\n}\n\nclass SubRouter {\r\n constructor(cb, config, app) {\r\n this.path = \"\";\r\n this.app = app;\r\n }\r\n set(path, config) {\r\n this.path = path;\r\n const a = this.app;\r\n a.app.getRouter().set(a._segment.append(this.path), { silent: true });\r\n }\r\n get() {\r\n return this.path;\r\n }\r\n}\n\nlet _once = true;\r\nclass JetAppBase extends JetBase {\r\n constructor(config) {\r\n const webix = (config || {}).webix || window.webix;\r\n config = webix.extend({\r\n name: \"App\",\r\n version: \"1.0\",\r\n start: \"/home\"\r\n }, config, true);\r\n super(webix, config);\r\n this.config = config;\r\n this.app = this.config.app;\r\n this.ready = Promise.resolve();\r\n this._services = {};\r\n this.webix.extend(this, this.webix.EventSystem);\r\n }\r\n getUrl() {\r\n return this._subSegment.suburl();\r\n }\r\n getUrlString() {\r\n return this._subSegment.toString();\r\n }\r\n getService(name) {\r\n let obj = this._services[name];\r\n if (typeof obj === \"function\") {\r\n obj = this._services[name] = obj(this);\r\n }\r\n return obj;\r\n }\r\n setService(name, handler) {\r\n this._services[name] = handler;\r\n }\r\n destructor() {\r\n this.getSubView().destructor();\r\n super.destructor();\r\n }\r\n // copy object and collect extra handlers\r\n copyConfig(obj, target, config) {\r\n // raw ui config\r\n if (obj instanceof JetBase ||\r\n (typeof obj === \"function\" && obj.prototype instanceof JetBase)) {\r\n obj = { $subview: obj };\r\n }\r\n // subview placeholder\r\n if (typeof obj.$subview != \"undefined\") {\r\n return this.addSubView(obj, target, config);\r\n }\r\n // process sub-properties\r\n const isArray = obj instanceof Array;\r\n target = target || (isArray ? [] : {});\r\n for (const method in obj) {\r\n let point = obj[method];\r\n // view class\r\n if (typeof point === \"function\" && point.prototype instanceof JetBase) {\r\n point = { $subview: point };\r\n }\r\n if (point && typeof point === \"object\" &&\r\n !(point instanceof this.webix.DataCollection) && !(point instanceof RegExp) && !(point instanceof Map)) {\r\n if (point instanceof Date) {\r\n target[method] = new Date(point);\r\n }\r\n else {\r\n const copy = this.copyConfig(point, (point instanceof Array ? [] : {}), config);\r\n if (copy !== null) {\r\n if (isArray)\r\n target.push(copy);\r\n else\r\n target[method] = copy;\r\n }\r\n }\r\n }\r\n else {\r\n target[method] = point;\r\n }\r\n }\r\n return target;\r\n }\r\n getRouter() {\r\n return this.$router;\r\n }\r\n clickHandler(e, target) {\r\n if (e) {\r\n target = target || (e.target || e.srcElement);\r\n if (target && target.getAttribute) {\r\n const trigger = target.getAttribute(\"trigger\");\r\n if (trigger) {\r\n this._forView(target, view => view.app.trigger(trigger));\r\n e.cancelBubble = true;\r\n return e.preventDefault();\r\n }\r\n const route = target.getAttribute(\"route\");\r\n if (route) {\r\n this._forView(target, view => view.show(route));\r\n e.cancelBubble = true;\r\n return e.preventDefault();\r\n }\r\n }\r\n }\r\n const parent = target.parentNode;\r\n if (parent) {\r\n this.clickHandler(e, parent);\r\n }\r\n }\r\n getRoot() {\r\n return this.getSubView().getRoot();\r\n }\r\n refresh() {\r\n if (!this._subSegment) {\r\n return Promise.resolve(null);\r\n }\r\n return this.getSubView().refresh().then(view => {\r\n this.callEvent(\"app:route\", [this.getUrl()]);\r\n return view;\r\n });\r\n }\r\n loadView(url) {\r\n const views = this.config.views;\r\n let result = null;\r\n if (url === \"\") {\r\n return Promise.resolve(this._loadError(\"\", new Error(\"Webix Jet: Empty url segment\")));\r\n }\r\n try {\r\n if (views) {\r\n if (typeof views === \"function\") {\r\n // custom loading strategy\r\n result = views(url);\r\n }\r\n else {\r\n // predefined hash\r\n result = views[url];\r\n }\r\n if (typeof result === \"string\") {\r\n url = result;\r\n result = null;\r\n }\r\n }\r\n if (!result) {\r\n if (url === \"_hidden\") {\r\n result = { hidden: true };\r\n }\r\n else if (url === \"_blank\") {\r\n result = {};\r\n }\r\n else {\r\n url = url.replace(/\\./g, \"/\");\r\n result = this.require(\"jet-views\", url);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n result = this._loadError(url, e);\r\n }\r\n // custom handler can return view or its promise\r\n if (!result.then) {\r\n result = Promise.resolve(result);\r\n }\r\n // set error handler\r\n result = result\r\n .then(module => module.__esModule ? module.default : module)\r\n .catch(err => this._loadError(url, err));\r\n return result;\r\n }\r\n _forView(target, handler) {\r\n const view = this.webix.$$(target);\r\n if (view) {\r\n handler(view.$scope);\r\n }\r\n }\r\n _loadViewDynamic(url) {\r\n return null;\r\n }\r\n createFromURL(chunk) {\r\n let view;\r\n if (chunk.isNew || !chunk.view) {\r\n view = this.loadView(chunk.page)\r\n .then(ui => this.createView(ui, name, chunk.params));\r\n }\r\n else {\r\n view = Promise.resolve(chunk.view);\r\n }\r\n return view;\r\n }\r\n _override(ui) {\r\n const over = this.config.override;\r\n if (over) {\r\n let dv;\r\n while (ui) {\r\n dv = ui;\r\n ui = over.get(ui);\r\n }\r\n return dv;\r\n }\r\n return ui;\r\n }\r\n createView(ui, name, params) {\r\n ui = this._override(ui);\r\n let obj;\r\n if (typeof ui === \"function\") {\r\n if (ui.prototype instanceof JetAppBase) {\r\n // UI class\r\n return new ui({ app: this, name, params, router: SubRouter });\r\n }\r\n else if (ui.prototype instanceof JetBase) {\r\n // UI class\r\n return new ui(this, { name, params });\r\n }\r\n else {\r\n // UI factory functions\r\n ui = ui(this);\r\n }\r\n }\r\n if (ui instanceof JetBase) {\r\n obj = ui;\r\n }\r\n else {\r\n // UI object\r\n obj = new JetViewRaw(this, { name, ui });\r\n }\r\n return obj;\r\n }\r\n // show view path\r\n show(url, config) {\r\n if (url && this.app && url.indexOf(\"//\") == 0)\r\n return this.app.show(url.substr(1), config);\r\n return this.render(this._container, url || this.config.start, config);\r\n }\r\n // event helpers\r\n trigger(name, ...rest) {\r\n this.apply(name, rest);\r\n }\r\n apply(name, data) {\r\n this.callEvent(name, data);\r\n }\r\n action(name) {\r\n return this.webix.bind(function (...rest) {\r\n this.apply(name, rest);\r\n }, this);\r\n }\r\n on(name, handler) {\r\n this.attachEvent(name, handler);\r\n }\r\n use(plugin, config) {\r\n plugin(this, null, config);\r\n }\r\n error(name, er) {\r\n this.callEvent(name, er);\r\n this.callEvent(\"app:error\", er);\r\n /* tslint:disable */\r\n if (this.config.debug) {\r\n for (var i = 0; i < er.length; i++) {\r\n console.error(er[i]);\r\n if (er[i] instanceof Error) {\r\n let text = er[i].message;\r\n if (text.indexOf(\"Module build failed\") === 0) {\r\n text = text.replace(/\\x1b\\[[0-9;]*m/g, \"\");\r\n document.body.innerHTML = `
${text}
`;\r\n }\r\n else {\r\n text += \"

Check console for more details\";\r\n this.webix.message({ type: \"error\", text: text, expire: -1 });\r\n }\r\n }\r\n }\r\n debugger;\r\n }\r\n /* tslint:enable */\r\n }\r\n // renders top view\r\n render(root, url, config) {\r\n this._container = (typeof root === \"string\") ?\r\n this.webix.toNode(root) :\r\n (root || document.body);\r\n const firstInit = !this.$router;\r\n let path = null;\r\n if (firstInit) {\r\n if (_once && \"tagName\" in this._container) {\r\n this.webix.event(document.body, \"click\", e => this.clickHandler(e));\r\n _once = false;\r\n }\r\n if (typeof url === \"string\") {\r\n url = new Route(url, 0);\r\n }\r\n this._subSegment = this._first_start(url);\r\n this._subSegment.route.linkRouter = true;\r\n }\r\n else {\r\n if (typeof url === \"string\") {\r\n path = url;\r\n }\r\n else {\r\n if (this.app) {\r\n path = url.split().route.path || this.config.start;\r\n }\r\n else {\r\n path = url.toString();\r\n }\r\n }\r\n }\r\n const params = config ? config.params : this.config.params || null;\r\n const top = this.getSubView();\r\n const segment = this._subSegment;\r\n const ready = segment\r\n .show({ url: path, params }, top)\r\n .then(() => this.createFromURL(segment.current()))\r\n .then(view => view.render(root, segment))\r\n .then(base => {\r\n this.$router.set(segment.route.path, { silent: true });\r\n this.callEvent(\"app:route\", [this.getUrl()]);\r\n return base;\r\n });\r\n this.ready = this.ready.then(() => ready);\r\n return ready;\r\n }\r\n getSubView() {\r\n if (this._subSegment) {\r\n const view = this._subSegment.current().view;\r\n if (view)\r\n return view;\r\n }\r\n return new JetView(this, {});\r\n }\r\n require(type, url) { return null; }\r\n _first_start(route) {\r\n this._segment = route;\r\n const cb = (a) => setTimeout(() => {\r\n this.show(a).catch(e => {\r\n if (!(e instanceof NavigationBlocked))\r\n throw e;\r\n });\r\n }, 1);\r\n this.$router = new (this.config.router)(cb, this.config, this);\r\n // start animation for top-level app\r\n if (this._container === document.body && this.config.animation !== false) {\r\n const node = this._container;\r\n this.webix.html.addCss(node, \"webixappstart\");\r\n setTimeout(() => {\r\n this.webix.html.removeCss(node, \"webixappstart\");\r\n this.webix.html.addCss(node, \"webixapp\");\r\n }, 10);\r\n }\r\n if (!route) {\r\n // if no url defined, check router first\r\n let urlString = this.$router.get();\r\n if (!urlString) {\r\n urlString = this.config.start;\r\n this.$router.set(urlString, { silent: true });\r\n }\r\n route = new Route(urlString, 0);\r\n }\r\n else if (this.app) {\r\n const now = route.current().view;\r\n route.current().view = this;\r\n if (route.next()) {\r\n route.refresh();\r\n route = route.split();\r\n }\r\n else {\r\n route = new Route(this.config.start, 0);\r\n }\r\n route.current().view = now;\r\n }\r\n return route;\r\n }\r\n // error during view resolving\r\n _loadError(url, err) {\r\n this.error(\"app:error:resolve\", [err, url]);\r\n return { template: \" \" };\r\n }\r\n addSubView(obj, target, config) {\r\n const url = obj.$subview !== true ? obj.$subview : null;\r\n const name = obj.name || (url ? this.webix.uid() : \"default\");\r\n target.id = obj.id || \"s\" + this.webix.uid();\r\n const view = config[name] = {\r\n id: target.id,\r\n url,\r\n branch: obj.branch,\r\n popup: obj.popup,\r\n params: obj.params\r\n };\r\n return view.popup ? null : target;\r\n }\r\n}\n\nclass HashRouter {\r\n constructor(cb, config) {\r\n this.config = config || {};\r\n this._detectPrefix();\r\n this.cb = cb;\r\n window.onpopstate = () => this.cb(this.get());\r\n }\r\n set(path, config) {\r\n if (this.config.routes) {\r\n const compare = path.split(\"?\", 2);\r\n for (const key in this.config.routes) {\r\n if (this.config.routes[key] === compare[0]) {\r\n path = key + (compare.length > 1 ? \"?\" + compare[1] : \"\");\r\n break;\r\n }\r\n }\r\n }\r\n if (this.get() !== path) {\r\n window.history.pushState(null, null, this.prefix + this.sufix + path);\r\n }\r\n if (!config || !config.silent) {\r\n setTimeout(() => this.cb(path), 1);\r\n }\r\n }\r\n get() {\r\n let path = this._getRaw().replace(this.prefix, \"\").replace(this.sufix, \"\");\r\n path = (path !== \"/\" && path !== \"#\") ? path : \"\";\r\n if (this.config.routes) {\r\n const compare = path.split(\"?\", 2);\r\n const key = this.config.routes[compare[0]];\r\n if (key) {\r\n path = key + (compare.length > 1 ? \"?\" + compare[1] : \"\");\r\n }\r\n }\r\n return path;\r\n }\r\n _detectPrefix() {\r\n // use \"#!\" for backward compatibility\r\n const sufix = this.config.routerPrefix;\r\n this.sufix = \"#\" + ((typeof sufix === \"undefined\") ? \"!\" : sufix);\r\n this.prefix = document.location.href.split(\"#\", 2)[0];\r\n }\r\n _getRaw() {\r\n return document.location.href;\r\n }\r\n}\n\nlet isPatched = false;\r\nfunction patch(w) {\r\n if (isPatched || !w) {\r\n return;\r\n }\r\n isPatched = true;\r\n // custom promise for IE8\r\n const win = window;\r\n if (!win.Promise) {\r\n win.Promise = w.promise;\r\n }\r\n const version = w.version.split(\".\");\r\n // will be fixed in webix 5.3\r\n if (version[0] * 10 + version[1] * 1 < 53) {\r\n w.ui.freeze = function (handler) {\r\n // disabled because webix jet 5.0 can't handle resize of scrollview correctly\r\n // w.ui.$freeze = true;\r\n const res = handler();\r\n if (res && res.then) {\r\n res.then(function (some) {\r\n w.ui.$freeze = false;\r\n w.ui.resize();\r\n return some;\r\n });\r\n }\r\n else {\r\n w.ui.$freeze = false;\r\n w.ui.resize();\r\n }\r\n return res;\r\n };\r\n }\r\n // adding views as classes\r\n const baseAdd = w.ui.baselayout.prototype.addView;\r\n const baseRemove = w.ui.baselayout.prototype.removeView;\r\n const config = {\r\n addView(view, index) {\r\n // trigger logic only for widgets inside of jet-view\r\n // ignore case when addView used with already initialized widget\r\n if (this.$scope && this.$scope.webixJet && !view.queryView) {\r\n const jview = this.$scope;\r\n const subs = {};\r\n view = jview.app.copyConfig(view, {}, subs);\r\n baseAdd.apply(this, [view, index]);\r\n for (const key in subs) {\r\n jview._renderFrame(key, subs[key], null).then(() => {\r\n jview._subs[key] = subs[key];\r\n });\r\n }\r\n return view.id;\r\n }\r\n else {\r\n return baseAdd.apply(this, arguments);\r\n }\r\n },\r\n removeView() {\r\n baseRemove.apply(this, arguments);\r\n if (this.$scope && this.$scope.webixJet) {\r\n const subs = this.$scope._subs;\r\n // check all sub-views, destroy and clean the removed one\r\n for (const key in subs) {\r\n const test = subs[key];\r\n if (!w.$$(test.id)) {\r\n test.view.destructor();\r\n delete subs[key];\r\n }\r\n }\r\n }\r\n }\r\n };\r\n w.extend(w.ui.layout.prototype, config, true);\r\n w.extend(w.ui.baselayout.prototype, config, true);\r\n // wrapper for using Jet Apps as views\r\n w.protoUI({\r\n name: \"jetapp\",\r\n $init(cfg) {\r\n this.$app = new this.app(cfg);\r\n const id = w.uid().toString();\r\n cfg.body = { id };\r\n this.$ready.push(function () {\r\n this.callEvent(\"onInit\", [this.$app]);\r\n this.$app.render({ id });\r\n });\r\n }\r\n }, w.ui.proxy, w.EventSystem);\r\n}\n\nclass JetApp extends JetAppBase {\r\n constructor(config) {\r\n config.router = config.router || HashRouter;\r\n super(config);\r\n patch(this.webix);\r\n }\r\n require(type, url) {\r\n return require(type + \"/\" + url);\r\n }\r\n}\n\nclass StoreRouter {\r\n constructor(cb, config, app) {\r\n this.storage = config.storage || app.webix.storage.session;\r\n this.name = (config.storeName || config.id + \":route\");\r\n this.cb = cb;\r\n }\r\n set(path, config) {\r\n this.storage.put(this.name, path);\r\n if (!config || !config.silent) {\r\n setTimeout(() => this.cb(path), 1);\r\n }\r\n }\r\n get() {\r\n return this.storage.get(this.name);\r\n }\r\n}\n\nclass UrlRouter extends HashRouter {\r\n _detectPrefix() {\r\n this.prefix = \"\";\r\n this.sufix = this.config.routerPrefix || \"\";\r\n }\r\n _getRaw() {\r\n return document.location.pathname + (document.location.search || \"\");\r\n }\r\n}\n\nclass EmptyRouter {\r\n constructor(cb, _$config) {\r\n this.path = \"\";\r\n this.cb = cb;\r\n }\r\n set(path, config) {\r\n this.path = path;\r\n if (!config || !config.silent) {\r\n setTimeout(() => this.cb(path), 1);\r\n }\r\n }\r\n get() {\r\n return this.path;\r\n }\r\n}\n\nfunction UnloadGuard(app, view, config) {\r\n view.on(app, `app:guard`, function (_$url, point, promise) {\r\n if (point === view || point.contains(view)) {\r\n const res = config();\r\n if (res === false) {\r\n promise.confirm = Promise.reject(new NavigationBlocked());\r\n }\r\n else {\r\n promise.confirm = promise.confirm.then(() => res);\r\n }\r\n }\r\n });\r\n}\n\n// (c) 2012-2018 Airbnb, Inc.\n\n// var has = require('has');\nfunction has(store, key) {\n return Object.prototype.hasOwnProperty.call(store, key);\n}\n// var forEach = require('for-each');\nfunction forEach(obj, handler, context) {\n for (var key in obj) {\n if (has(obj, key)) {\n handler.call((context || obj), obj[key], key, obj);\n }\n }\n}\n// var trim = require('string.prototype.trim');\nfunction trim(str) {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n}\n// var warning = require('warning');\nfunction warn(message) {\n message = 'Warning: ' + message;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n\n try { throw new Error(message); } catch (x) {}\n}\n\nvar replace = String.prototype.replace;\nvar split = String.prototype.split;\n\n// #### Pluralization methods\n// The string that separates the different phrase possibilities.\nvar delimiter = '||||';\n\nvar russianPluralGroups = function (n) {\n var end = n % 10;\n if (n !== 11 && end === 1) {\n return 0;\n }\n if (2 <= end && end <= 4 && !(n >= 12 && n <= 14)) {\n return 1;\n }\n return 2;\n};\n\n// Mapping from pluralization group plural logic.\nvar pluralTypes = {\n arabic: function (n) {\n // http://www.arabeyes.org/Plural_Forms\n if (n < 3) { return n; }\n var lastTwo = n % 100;\n if (lastTwo >= 3 && lastTwo <= 10) return 3;\n return lastTwo >= 11 ? 4 : 5;\n },\n bosnian_serbian: russianPluralGroups,\n chinese: function () { return 0; },\n croatian: russianPluralGroups,\n french: function (n) { return n > 1 ? 1 : 0; },\n german: function (n) { return n !== 1 ? 1 : 0; },\n russian: russianPluralGroups,\n lithuanian: function (n) {\n if (n % 10 === 1 && n % 100 !== 11) { return 0; }\n return n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19) ? 1 : 2;\n },\n czech: function (n) {\n if (n === 1) { return 0; }\n return (n >= 2 && n <= 4) ? 1 : 2;\n },\n polish: function (n) {\n if (n === 1) { return 0; }\n var end = n % 10;\n return 2 <= end && end <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;\n },\n icelandic: function (n) { return (n % 10 !== 1 || n % 100 === 11) ? 1 : 0; },\n slovenian: function (n) {\n var lastTwo = n % 100;\n if (lastTwo === 1) {\n return 0;\n }\n if (lastTwo === 2) {\n return 1;\n }\n if (lastTwo === 3 || lastTwo === 4) {\n return 2;\n }\n return 3;\n }\n};\n\n\n// Mapping from pluralization group to individual language codes/locales.\n// Will look up based on exact match, if not found and it's a locale will parse the locale\n// for language code, and if that does not exist will default to 'en'\nvar pluralTypeToLanguages = {\n arabic: ['ar'],\n bosnian_serbian: ['bs-Latn-BA', 'bs-Cyrl-BA', 'srl-RS', 'sr-RS'],\n chinese: ['id', 'id-ID', 'ja', 'ko', 'ko-KR', 'lo', 'ms', 'th', 'th-TH', 'zh'],\n croatian: ['hr', 'hr-HR'],\n german: ['fa', 'da', 'de', 'en', 'es', 'fi', 'el', 'he', 'hi-IN', 'hu', 'hu-HU', 'it', 'nl', 'no', 'pt', 'sv', 'tr'],\n french: ['fr', 'tl', 'pt-br'],\n russian: ['ru', 'ru-RU'],\n lithuanian: ['lt'],\n czech: ['cs', 'cs-CZ', 'sk'],\n polish: ['pl'],\n icelandic: ['is'],\n slovenian: ['sl-SL']\n};\n\nfunction langToTypeMap(mapping) {\n var ret = {};\n forEach(mapping, function (langs, type) {\n forEach(langs, function (lang) {\n ret[lang] = type;\n });\n });\n return ret;\n}\n\nfunction pluralTypeName(locale) {\n var langToPluralType = langToTypeMap(pluralTypeToLanguages);\n return langToPluralType[locale]\n || langToPluralType[split.call(locale, /-/, 1)[0]]\n || langToPluralType.en;\n}\n\nfunction pluralTypeIndex(locale, count) {\n return pluralTypes[pluralTypeName(locale)](count);\n}\n\nfunction escape(token) {\n return token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction constructTokenRegex(opts) {\n var prefix = (opts && opts.prefix) || '%{';\n var suffix = (opts && opts.suffix) || '}';\n\n if (prefix === delimiter || suffix === delimiter) {\n throw new RangeError('\"' + delimiter + '\" token is reserved for pluralization');\n }\n\n return new RegExp(escape(prefix) + '(.*?)' + escape(suffix), 'g');\n}\n\nvar dollarRegex = /\\$/g;\nvar dollarBillsYall = '$$';\nvar defaultTokenRegex = /%\\{(.*?)\\}/g;\n\n// ### transformPhrase(phrase, substitutions, locale)\n//\n// Takes a phrase string and transforms it by choosing the correct\n// plural form and interpolating it.\n//\n// transformPhrase('Hello, %{name}!', {name: 'Spike'});\n// // \"Hello, Spike!\"\n//\n// The correct plural form is selected if substitutions.smart_count\n// is set. You can pass in a number instead of an Object as `substitutions`\n// as a shortcut for `smart_count`.\n//\n// transformPhrase('%{smart_count} new messages |||| 1 new message', {smart_count: 1}, 'en');\n// // \"1 new message\"\n//\n// transformPhrase('%{smart_count} new messages |||| 1 new message', {smart_count: 2}, 'en');\n// // \"2 new messages\"\n//\n// transformPhrase('%{smart_count} new messages |||| 1 new message', 5, 'en');\n// // \"5 new messages\"\n//\n// You should pass in a third argument, the locale, to specify the correct plural type.\n// It defaults to `'en'` with 2 plural forms.\nfunction transformPhrase(phrase, substitutions, locale, tokenRegex) {\n if (typeof phrase !== 'string') {\n throw new TypeError('Polyglot.transformPhrase expects argument #1 to be string');\n }\n\n if (substitutions == null) {\n return phrase;\n }\n\n var result = phrase;\n var interpolationRegex = tokenRegex || defaultTokenRegex;\n\n // allow number as a pluralization shortcut\n var options = typeof substitutions === 'number' ? { smart_count: substitutions } : substitutions;\n\n // Select plural form: based on a phrase text that contains `n`\n // plural forms separated by `delimiter`, a `locale`, and a `substitutions.smart_count`,\n // choose the correct plural form. This is only done if `count` is set.\n if (options.smart_count != null && result) {\n var texts = split.call(result, delimiter);\n result = trim(texts[pluralTypeIndex(locale || 'en', options.smart_count)] || texts[0]);\n }\n\n // Interpolate: Creates a `RegExp` object for each interpolation placeholder.\n result = replace.call(result, interpolationRegex, function (expression, argument) {\n if (!has(options, argument) || options[argument] == null) { return expression; }\n // Ensure replacement value is escaped to prevent special $-prefixed regex replace tokens.\n return replace.call(options[argument], dollarRegex, dollarBillsYall);\n });\n\n return result;\n}\n\n// ### Polyglot class constructor\nfunction Polyglot(options) {\n var opts = options || {};\n this.phrases = {};\n this.extend(opts.phrases || {});\n this.currentLocale = opts.locale || 'en';\n var allowMissing = opts.allowMissing ? transformPhrase : null;\n this.onMissingKey = typeof opts.onMissingKey === 'function' ? opts.onMissingKey : allowMissing;\n this.warn = opts.warn || warn;\n this.tokenRegex = constructTokenRegex(opts.interpolation);\n}\n\n// ### polyglot.locale([locale])\n//\n// Get or set locale. Internally, Polyglot only uses locale for pluralization.\nPolyglot.prototype.locale = function (newLocale) {\n if (newLocale) this.currentLocale = newLocale;\n return this.currentLocale;\n};\n\n// ### polyglot.extend(phrases)\n//\n// Use `extend` to tell Polyglot how to translate a given key.\n//\n// polyglot.extend({\n// \"hello\": \"Hello\",\n// \"hello_name\": \"Hello, %{name}\"\n// });\n//\n// The key can be any string. Feel free to call `extend` multiple times;\n// it will override any phrases with the same key, but leave existing phrases\n// untouched.\n//\n// It is also possible to pass nested phrase objects, which get flattened\n// into an object with the nested keys concatenated using dot notation.\n//\n// polyglot.extend({\n// \"nav\": {\n// \"hello\": \"Hello\",\n// \"hello_name\": \"Hello, %{name}\",\n// \"sidebar\": {\n// \"welcome\": \"Welcome\"\n// }\n// }\n// });\n//\n// console.log(polyglot.phrases);\n// // {\n// // 'nav.hello': 'Hello',\n// // 'nav.hello_name': 'Hello, %{name}',\n// // 'nav.sidebar.welcome': 'Welcome'\n// // }\n//\n// `extend` accepts an optional second argument, `prefix`, which can be used\n// to prefix every key in the phrases object with some string, using dot\n// notation.\n//\n// polyglot.extend({\n// \"hello\": \"Hello\",\n// \"hello_name\": \"Hello, %{name}\"\n// }, \"nav\");\n//\n// console.log(polyglot.phrases);\n// // {\n// // 'nav.hello': 'Hello',\n// // 'nav.hello_name': 'Hello, %{name}'\n// // }\n//\n// This feature is used internally to support nested phrase objects.\nPolyglot.prototype.extend = function (morePhrases, prefix) {\n forEach(morePhrases, function (phrase, key) {\n var prefixedKey = prefix ? prefix + '.' + key : key;\n if (typeof phrase === 'object') {\n this.extend(phrase, prefixedKey);\n } else {\n this.phrases[prefixedKey] = phrase;\n }\n }, this);\n};\n\n// ### polyglot.unset(phrases)\n// Use `unset` to selectively remove keys from a polyglot instance.\n//\n// polyglot.unset(\"some_key\");\n// polyglot.unset({\n// \"hello\": \"Hello\",\n// \"hello_name\": \"Hello, %{name}\"\n// });\n//\n// The unset method can take either a string (for the key), or an object hash with\n// the keys that you would like to unset.\nPolyglot.prototype.unset = function (morePhrases, prefix) {\n if (typeof morePhrases === 'string') {\n delete this.phrases[morePhrases];\n } else {\n forEach(morePhrases, function (phrase, key) {\n var prefixedKey = prefix ? prefix + '.' + key : key;\n if (typeof phrase === 'object') {\n this.unset(phrase, prefixedKey);\n } else {\n delete this.phrases[prefixedKey];\n }\n }, this);\n }\n};\n\n// ### polyglot.clear()\n//\n// Clears all phrases. Useful for special cases, such as freeing\n// up memory if you have lots of phrases but no longer need to\n// perform any translation. Also used internally by `replace`.\nPolyglot.prototype.clear = function () {\n this.phrases = {};\n};\n\n// ### polyglot.replace(phrases)\n//\n// Completely replace the existing phrases with a new set of phrases.\n// Normally, just use `extend` to add more phrases, but under certain\n// circumstances, you may want to make sure no old phrases are lying around.\nPolyglot.prototype.replace = function (newPhrases) {\n this.clear();\n this.extend(newPhrases);\n};\n\n\n// ### polyglot.t(key, options)\n//\n// The most-used method. Provide a key, and `t` will return the\n// phrase.\n//\n// polyglot.t(\"hello\");\n// => \"Hello\"\n//\n// The phrase value is provided first by a call to `polyglot.extend()` or\n// `polyglot.replace()`.\n//\n// Pass in an object as the second argument to perform interpolation.\n//\n// polyglot.t(\"hello_name\", {name: \"Spike\"});\n// => \"Hello, Spike\"\n//\n// If you like, you can provide a default value in case the phrase is missing.\n// Use the special option key \"_\" to specify a default.\n//\n// polyglot.t(\"i_like_to_write_in_language\", {\n// _: \"I like to write in %{language}.\",\n// language: \"JavaScript\"\n// });\n// => \"I like to write in JavaScript.\"\n//\nPolyglot.prototype.t = function (key, options) {\n var phrase, result;\n var opts = options == null ? {} : options;\n if (typeof this.phrases[key] === 'string') {\n phrase = this.phrases[key];\n } else if (typeof opts._ === 'string') {\n phrase = opts._;\n } else if (this.onMissingKey) {\n var onMissingKey = this.onMissingKey;\n result = onMissingKey(key, opts, this.currentLocale, this.tokenRegex);\n } else {\n this.warn('Missing translation for key: \"' + key + '\"');\n result = key;\n }\n if (typeof phrase === 'string') {\n result = transformPhrase(phrase, opts, this.currentLocale, this.tokenRegex);\n }\n return result;\n};\n\n\n// ### polyglot.has(key)\n//\n// Check if polyglot has a translation for given key\nPolyglot.prototype.has = function (key) {\n return has(this.phrases, key);\n};\n\n// export transformPhrase\nPolyglot.transformPhrase = function transform(phrase, substitutions, locale) {\n return transformPhrase(phrase, substitutions, locale);\n};\n\nvar webixPolyglot = Polyglot;\n\nfunction Locale(app, _view, config) {\r\n config = config || {};\r\n const storage = config.storage;\r\n let lang = storage ? (storage.get(\"lang\") || \"en\") : (config.lang || \"en\");\r\n function setLangData(name, data, silent) {\r\n if (data.__esModule) {\r\n data = data.default;\r\n }\r\n const pconfig = { phrases: data };\r\n if (config.polyglot) {\r\n app.webix.extend(pconfig, config.polyglot);\r\n }\r\n const poly = service.polyglot = new webixPolyglot(pconfig);\r\n poly.locale(name);\r\n service._ = app.webix.bind(poly.t, poly);\r\n lang = name;\r\n if (storage) {\r\n storage.put(\"lang\", lang);\r\n }\r\n if (config.webix) {\r\n const locName = config.webix[name];\r\n if (locName) {\r\n app.webix.i18n.setLocale(locName);\r\n }\r\n }\r\n if (!silent) {\r\n return app.refresh();\r\n }\r\n return Promise.resolve();\r\n }\r\n function getLang() { return lang; }\r\n function setLang(name, silent) {\r\n // ignore setLang if loading by path is disabled\r\n if (config.path === false) {\r\n return;\r\n }\r\n const path = (config.path ? config.path + \"/\" : \"\") + name;\r\n const data = app.require(\"jet-locales\", path);\r\n setLangData(name, data, silent);\r\n }\r\n const service = {\r\n getLang, setLang, setLangData, _: null, polyglot: null\r\n };\r\n app.setService(\"locale\", service);\r\n setLang(lang, true);\r\n}\n\nfunction show(view, config, value) {\r\n if (config.urls) {\r\n value = config.urls[value] || value;\r\n }\r\n else if (config.param) {\r\n value = { [config.param]: value };\r\n }\r\n view.show(value);\r\n}\r\nfunction Menu(app, view, config) {\r\n const frame = view.getSubViewInfo().parent;\r\n const ui = view.$$(config.id || config);\r\n let silent = false;\r\n ui.attachEvent(\"onchange\", function () {\r\n if (!silent) {\r\n show(frame, config, this.getValue());\r\n }\r\n });\r\n ui.attachEvent(\"onafterselect\", function () {\r\n if (!silent) {\r\n let id = null;\r\n if (ui.setValue) {\r\n id = this.getValue();\r\n }\r\n else if (ui.getSelectedId) {\r\n id = ui.getSelectedId();\r\n }\r\n show(frame, config, id);\r\n }\r\n });\r\n view.on(app, `app:route`, function () {\r\n let name = \"\";\r\n if (config.param) {\r\n name = view.getParam(config.param, true);\r\n }\r\n else {\r\n const segment = frame.getUrl()[1];\r\n if (segment) {\r\n name = segment.page;\r\n }\r\n }\r\n if (name) {\r\n silent = true;\r\n if (ui.setValue && ui.getValue() !== name) {\r\n ui.setValue(name);\r\n }\r\n else if (ui.select && ui.exists(name) && ui.getSelectedId() !== name) {\r\n ui.select(name);\r\n }\r\n silent = false;\r\n }\r\n });\r\n}\n\nconst baseicons = {\r\n good: \"check\",\r\n error: \"warning\",\r\n saving: \"refresh fa-spin\"\r\n};\r\nconst basetext = {\r\n good: \"Ok\",\r\n error: \"Error\",\r\n saving: \"Connecting...\"\r\n};\r\nfunction Status(app, view, config) {\r\n let status = \"good\";\r\n let count = 0;\r\n let iserror = false;\r\n let expireDelay = config.expire;\r\n if (!expireDelay && expireDelay !== false) {\r\n expireDelay = 2000;\r\n }\r\n const texts = config.texts || basetext;\r\n const icons = config.icons || baseicons;\r\n if (typeof config === \"string\") {\r\n config = { target: config };\r\n }\r\n function refresh(content) {\r\n const area = view.$$(config.target);\r\n if (area) {\r\n if (!content) {\r\n content = \"
\" + texts[status] + \"
\";\r\n }\r\n area.setHTML(content);\r\n }\r\n }\r\n function success() {\r\n count--;\r\n setStatus(\"good\");\r\n }\r\n function fail(err) {\r\n count--;\r\n setStatus(\"error\", err);\r\n }\r\n function start(promise) {\r\n count++;\r\n setStatus(\"saving\");\r\n if (promise && promise.then) {\r\n promise.then(success, fail);\r\n }\r\n }\r\n function getStatus() {\r\n return status;\r\n }\r\n function hideStatus() {\r\n if (count === 0) {\r\n refresh(\" \");\r\n }\r\n }\r\n function setStatus(mode, err) {\r\n if (count < 0) {\r\n count = 0;\r\n }\r\n if (mode === \"saving\") {\r\n status = \"saving\";\r\n refresh();\r\n }\r\n else {\r\n iserror = (mode === \"error\");\r\n if (count === 0) {\r\n status = iserror ? \"error\" : \"good\";\r\n if (iserror) {\r\n app.error(\"app:error:server\", [err.responseText || err]);\r\n }\r\n else {\r\n if (expireDelay) {\r\n setTimeout(hideStatus, expireDelay);\r\n }\r\n }\r\n refresh();\r\n }\r\n }\r\n }\r\n function track(data) {\r\n const dp = app.webix.dp(data);\r\n if (dp) {\r\n view.on(dp, \"onAfterDataSend\", start);\r\n view.on(dp, \"onAfterSaveError\", (_id, _obj, response) => fail(response));\r\n view.on(dp, \"onAfterSave\", success);\r\n }\r\n }\r\n app.setService(\"status\", {\r\n getStatus,\r\n setStatus,\r\n track\r\n });\r\n if (config.remote) {\r\n view.on(app.webix, \"onRemoteCall\", start);\r\n }\r\n if (config.ajax) {\r\n view.on(app.webix, \"onBeforeAjax\", (_mode, _url, _data, _request, _headers, _files, promise) => {\r\n start(promise);\r\n });\r\n }\r\n if (config.data) {\r\n track(config.data);\r\n }\r\n}\n\nfunction Theme(app, _view, config) {\r\n config = config || {};\r\n const storage = config.storage;\r\n let theme = storage ?\r\n (storage.get(\"theme\") || \"flat-default\")\r\n :\r\n (config.theme || \"flat-default\");\r\n const service = {\r\n getTheme() { return theme; },\r\n setTheme(name, silent) {\r\n const parts = name.split(\"-\");\r\n const links = document.getElementsByTagName(\"link\");\r\n for (let i = 0; i < links.length; i++) {\r\n const lname = links[i].getAttribute(\"title\");\r\n if (lname) {\r\n if (lname === name || lname === parts[0]) {\r\n links[i].disabled = false;\r\n }\r\n else {\r\n links[i].disabled = true;\r\n }\r\n }\r\n }\r\n app.webix.skin.set(parts[0]);\r\n // remove old css\r\n app.webix.html.removeCss(document.body, \"theme-\" + theme);\r\n // add new css\r\n app.webix.html.addCss(document.body, \"theme-\" + name);\r\n theme = name;\r\n if (storage) {\r\n storage.put(\"theme\", name);\r\n }\r\n if (!silent) {\r\n app.refresh();\r\n }\r\n }\r\n };\r\n app.setService(\"theme\", service);\r\n service.setTheme(theme, true);\r\n}\n\nfunction copyParams(data, url, route) {\r\n for (let i = 0; i < route.length; i++) {\r\n data[route[i]] = url[i + 1] ? url[i + 1].page : \"\";\r\n }\r\n}\r\nfunction UrlParam(app, view, config) {\r\n const route = config.route || config;\r\n const data = {};\r\n view.on(app, \"app:urlchange\", function (subview, segment) {\r\n if (view === subview) {\r\n copyParams(data, segment.suburl(), route);\r\n segment.size(route.length + 1);\r\n }\r\n });\r\n const os = view.setParam;\r\n const og = view.getParam;\r\n view.setParam = function (name, value, show) {\r\n const index = route.indexOf(name);\r\n if (index >= 0) {\r\n data[name] = value;\r\n this._segment.update(\"\", value, index + 1);\r\n if (show) {\r\n return view.show(null);\r\n }\r\n }\r\n else {\r\n return os.call(this, name, value, show);\r\n }\r\n };\r\n view.getParam = function (key, mode) {\r\n const val = data[key];\r\n if (typeof val !== \"undefined\") {\r\n return val;\r\n }\r\n return og.call(this, key, mode);\r\n };\r\n copyParams(data, view.getUrl(), route);\r\n}\n\nfunction User(app, _view, config) {\r\n config = config || {};\r\n const login = config.login || \"/login\";\r\n const logout = config.logout || \"/logout\";\r\n const afterLogin = config.afterLogin || app.config.start;\r\n const afterLogout = config.afterLogout || \"/login\";\r\n const ping = config.ping || 5 * 60 * 1000;\r\n const model = config.model;\r\n let user = config.user;\r\n const service = {\r\n getUser() {\r\n return user;\r\n },\r\n getStatus(server) {\r\n if (!server) {\r\n return user !== null;\r\n }\r\n return model.status().catch(() => null).then(data => {\r\n user = data;\r\n });\r\n },\r\n login(name, pass) {\r\n return model.login(name, pass).then(data => {\r\n user = data;\r\n if (!data) {\r\n throw new Error(\"Access denied\");\r\n }\r\n app.callEvent(\"app:user:login\", [user]);\r\n app.show(afterLogin);\r\n });\r\n },\r\n logout() {\r\n user = null;\r\n return model.logout().then(res => {\r\n app.callEvent(\"app:user:logout\", []);\r\n return res;\r\n });\r\n }\r\n };\r\n function canNavigate(url, obj) {\r\n if (url === logout) {\r\n service.logout();\r\n obj.redirect = afterLogout;\r\n }\r\n else if (url !== login && !service.getStatus()) {\r\n obj.redirect = login;\r\n }\r\n }\r\n app.setService(\"user\", service);\r\n app.attachEvent(`app:guard`, function (url, _$root, obj) {\r\n if (config.public && config.public(url)) {\r\n return true;\r\n }\r\n if (typeof user === \"undefined\") {\r\n obj.confirm = service.getStatus(true).then(() => canNavigate(url, obj));\r\n }\r\n return canNavigate(url, obj);\r\n });\r\n if (ping) {\r\n setInterval(() => service.getStatus(true), ping);\r\n }\r\n}\n\n/*\r\nMIT License\r\nCopyright (c) 2019 XB Software\r\n*/\r\nlet webix = window.webix;\r\nif (webix) {\r\n patch(webix);\r\n}\r\nconst plugins = {\r\n UnloadGuard, Locale, Menu, Theme, User, Status, UrlParam\r\n};\r\nconst errors = { NavigationBlocked };\r\nconst w = window;\r\nif (!w.Promise) {\r\n w.Promise = w.webix.promise;\r\n}\n\nexport { plugins, errors, JetApp, JetView, HashRouter, StoreRouter, UrlRouter, EmptyRouter, SubRouter };\n//# sourceMappingURL=jet.js.map\n","var index = 1;\nfunction uid() {\n\treturn index++;\n}\n\nvar empty = undefined;\n\nexport function ignoreInitial(code) {\n\tlet init = false;\n\treturn function() {\n\t\tif (init) return code.apply(this, arguments);\n\t\telse init = true;\n\t};\n}\n\nvar context = null;\nexport function withContext(value, code) {\n\tcontext = value;\n\tcode();\n\tcontext = null;\n}\n\nexport function filter(rule, handler) {\n\treturn function(v, o, obj, meta) {\n\t\tif (rule(v, meta)) handler.apply(this, arguments);\n\t};\n}\n\nexport function link(source, target, key) {\n\tObject.defineProperty(target, key, {\n\t\tget: () => source[key],\n\t\tset: value => (source[key] = value),\n\t});\n}\n\nexport function debounce(handler, delay) {\n\tdelay = delay || 200;\n\tlet timer = null;\n\tlet data = null;\n\treturn function() {\n\t\tdata = arguments;\n\t\tif (!timer) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = null;\n\n\t\t\t\thandler.apply(this, data);\n\t\t\t}, delay);\n\t\t}\n\t};\n}\n\nexport function createState(data, config) {\n\tconfig = config || {};\n\tconst handlers = {};\n\tconst out = {};\n\n\tconst observe = function(mask, handler) {\n\t\tvar key = uid();\n\t\thandlers[key] = { mask, handler };\n\t\tif (mask === \"*\") handler(out, empty, mask);\n\t\telse handler(out[mask], empty, mask);\n\n\t\treturn key;\n\t};\n\n\tconst observeEnd = function(id) {\n\t\tdelete handlers[id];\n\t};\n\n\tconst queue = [];\n\tlet waitInQueue = false;\n\n\tvar batch = function(code) {\n\t\tif (typeof code !== \"function\") {\n\t\t\tconst values = code;\n\t\t\tcode = () => {\n\t\t\t\tfor (const key in values) out[key] = values[key];\n\t\t\t};\n\t\t}\n\n\t\twaitInQueue = true;\n\t\tcode(out);\n\t\twaitInQueue = false;\n\t\twhile (queue.length) {\n\t\t\tconst obj = queue.shift();\n\t\t\tnotify.apply(this, obj);\n\t\t}\n\t};\n\n\tconst notify = function(key, old, value, meta) {\n\t\tif (waitInQueue) {\n\t\t\tqueue.push([key, old, value, meta]);\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = Object.keys(handlers);\n\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\tconst obj = handlers[list[i]];\n\t\t\tif (!obj) continue;\n\t\t\tif (obj.mask === \"*\" || obj.mask === key) {\n\t\t\t\tobj.handler(value, old, key, meta);\n\t\t\t}\n\t\t}\n\t};\n\n\t// normal js object\n\tfor (const key2 in data) {\n\t\tif (data.hasOwnProperty(key2)) {\n\t\t\tconst test = data[key2];\n\t\t\tif (config.nested && typeof test === \"object\" && test) {\n\t\t\t\tout[key2] = createState(test, config);\n\t\t\t} else {\n\t\t\t\treactive(out, test, key2, notify);\n\t\t\t}\n\t\t}\n\t}\n\n\tObject.defineProperty(out, \"$changes\", {\n\t\tvalue: {\n\t\t\tattachEvent: observe,\n\t\t\tdetachEvent: observeEnd,\n\t\t},\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\tObject.defineProperty(out, \"$observe\", {\n\t\tvalue: observe,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\tObject.defineProperty(out, \"$batch\", {\n\t\tvalue: batch,\n\t\tenumerable: false,\n\t\tconfigurable: false,\n\t});\n\n\treturn out;\n}\n\nfunction reactive(obj, val, key, notify) {\n\tObject.defineProperty(obj, key, {\n\t\tget: function() {\n\t\t\treturn val;\n\t\t},\n\t\tset: function(value) {\n\t\t\tvar changed = false;\n\t\t\tif (val === null || value === null) {\n\t\t\t\tchanged = val !== value;\n\t\t\t} else {\n\t\t\t\tchanged = val.valueOf() != value.valueOf();\n\t\t\t}\n\n\t\t\tif (changed) {\n\t\t\t\tvar old = val;\n\t\t\t\tval = value;\n\t\t\t\tnotify(key, old, value, context);\n\t\t\t}\n\t\t},\n\t\tenumerable: true,\n\t\tconfigurable: false,\n\t});\n}","export default function handler(view) {\n\treturn {\n\t\tattachEvent: (key, handler) => {\n\t\t\twebix.UIManager.addHotKey(key, handler, view);\n\t\t\treturn { key, handler };\n\t\t},\n\t\tdetachEvent: ({ key, handler }) =>\n\t\t\twebix.UIManager.removeHotKey(key, handler, view),\n\t};\n}\n","export const folderIcon = \"\";\nexport const backIcon =\n\t\"\";\nexport const folderCardIcon =\n\t\"\";\nexport const menuIcon =\n\t\"\";\n\nexport const gridMode =\n\t\"\";\nexport const cardMode =\n\t\"\";\nexport const doubleMode =\n\t\"\";\n","import { JetView } from \"webix-jet\";\n\nconst FOLDER = 0x01;\nconst MANY = 0x02;\nconst TEXT = 0x04;\nconst VIEW = 0x08;\nconst FULL = 0x10;\nconst TREE = 0x20;\nconst SEARCH = 0x40;\n\nexport default class MenuBodyView extends JetView {\n\tconstructor(app, name, config) {\n\t\tsuper(app, name);\n\t\tthis.compact = !!config.compact;\n\t\tthis.tree = !!config.tree;\n\t}\n\tconfig() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\tconst options = [\n\t\t\t{\n\t\t\t\tid: \"download\",\n\t\t\t\tvalue: _(\"Download\"),\n\t\t\t\ticon: \"wxi-download\",\n\t\t\t\tshow: TREE,\n\t\t\t\thotkey: \"Ctrl+D\",\n\t\t\t},\n\t\t\t{\n\t\t\t\t$template: \"Separator\",\n\t\t\t\tshow: TREE,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"toggle-preview\",\n\t\t\t\tvalue: _(\"Preview\"),\n\t\t\t\ticon: \"wxi-eye\",\n\t\t\t\tshow: FULL | FOLDER,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"locate\",\n\t\t\t\tvalue: _(\"Open item location\"),\n\t\t\t\ticon: \"wxi-folder\",\n\t\t\t\thotkey: \"Ctrl+Alt+O\",\n\t\t\t\tshow: FOLDER | SEARCH,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"open\",\n\t\t\t\tvalue: _(\"Open\"),\n\t\t\t\ticon: \"wxi-folder-open\",\n\t\t\t\thotkey: \"Ctrl+O\",\n\t\t\t\tshow: VIEW,\n\t\t\t},\n\t\t\t// edit option (5)\n\t\t\t{\n\t\t\t\t$template: \"Separator\",\n\t\t\t\tshow: VIEW,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"copy\",\n\t\t\t\tvalue: _(\"Copy\"),\n\t\t\t\thotkey: \"Ctrl+C\",\n\t\t\t\ticon: \"fmi-content-copy\",\n\t\t\t\tshow: FOLDER | MANY | TREE,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"cut\",\n\t\t\t\tvalue: _(\"Cut\"),\n\t\t\t\thotkey: \"Ctrl+X\",\n\t\t\t\ticon: \"fmi-content-cut\",\n\t\t\t\tshow: FOLDER | MANY | TREE,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"paste\",\n\t\t\t\tvalue: _(\"Paste\"),\n\t\t\t\thotkey: \"Ctrl+V\",\n\t\t\t\ticon: \"fmi-content-paste\",\n\t\t\t\tshow: FOLDER | TREE,\n\t\t\t},\n\t\t\t{\n\t\t\t\t$template: \"Separator\",\n\t\t\t\tshow: FOLDER | MANY | TREE,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"rename\",\n\t\t\t\tvalue: _(\"Rename\"),\n\t\t\t\ticon: \"fmi-rename-box\",\n\t\t\t\thotkey: \"Ctrl+R\",\n\t\t\t\tshow: FOLDER,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"delete\",\n\t\t\t\tvalue: _(\"Delete\"),\n\t\t\t\ticon: \"wxi-close\",\n\t\t\t\thotkey: \"Del / ←\",\n\t\t\t\tshow: FOLDER | MANY,\n\t\t\t},\n\t\t];\n\n\t\tif (this.app.config.editor) {\n\t\t\toptions.splice(5, 0, {\n\t\t\t\tid: \"edit\",\n\t\t\t\tvalue: _(\"Edit\"),\n\t\t\t\ticon: \"wxi-pencil\",\n\t\t\t\thotkey: \"Ctrl+E\",\n\t\t\t\tshow: TEXT | MANY,\n\t\t\t});\n\t\t}\n\n\t\tconst menu = {\n\t\t\tview: \"menu\",\n\t\t\tcss: \"webix_fmanager_menu\",\n\t\t\tlayout: \"y\",\n\t\t\tautoheight: true,\n\t\t\tdata: options,\n\t\t\ttemplate: obj => {\n\t\t\t\treturn (\n\t\t\t\t\t(obj.icon\n\t\t\t\t\t\t? ``\n\t\t\t\t\t\t: \"\") +\n\t\t\t\t\tobj.value +\n\t\t\t\t\t(obj.hotkey\n\t\t\t\t\t\t? `${obj.hotkey}`\n\t\t\t\t\t\t: \"\")\n\t\t\t\t);\n\t\t\t},\n\t\t\ton: {\n\t\t\t\tonMenuItemClick: id => {\n\t\t\t\t\tthis.app.callEvent(\"app:action\", [id, this.Files]);\n\t\t\t\t\tthis.app.callEvent(\"app:filemenu:click\");\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn menu;\n\t}\n\tFilterOptions(files) {\n\t\tthis.Files = files;\n\n\t\tconst file = files[0];\n\t\tconst many = files.length > 1;\n\n\t\tconst vtypes = [\"image\", \"audio\", \"video\", \"code\", \"pdf\"];\n\t\tconst viewable = vtypes.find(t => t === file.type || t === file.$ext);\n\t\tconst search = this.app.getState().search;\n\n\t\tthis.getRoot().define(\"width\", search && !many ? 270 : 200);\n\n\t\tthis.getRoot().filter(o => {\n\t\t\treturn !(\n\t\t\t\t(many && !(o.show & MANY)) ||\n\t\t\t\t(file.type === \"folder\" && !(o.show & FOLDER)) ||\n\t\t\t\t(o.show & TEXT && file.type !== \"code\") ||\n\t\t\t\t(o.show & VIEW && !viewable) ||\n\t\t\t\t(o.show & FULL && !this.compact) ||\n\t\t\t\t(o.show & TREE && this.tree) ||\n\t\t\t\t(o.show & SEARCH && !search)\n\t\t\t);\n\t\t});\n\t}\n}\n","import { JetView } from \"webix-jet\";\n\nimport MenuBodyView from \"./menubody\";\n\nexport default class ContextMenuView extends JetView {\n\tconstructor(app, name, config) {\n\t\tsuper(app, name);\n\t\tthis._config = config;\n\t}\n\tconfig() {\n\t\treturn {\n\t\t\tview: \"context\",\n\t\t\tbody: {\n\t\t\t\t$subview: new (this.app.dynamic(MenuBodyView))(this.app, \"\", {\n\t\t\t\t\t...this._config,\n\t\t\t\t}),\n\t\t\t\tname: \"options\",\n\t\t\t},\n\t\t\ton: {\n\t\t\t\tonBeforeShow: e => {\n\t\t\t\t\tconst files = this._Locate(e);\n\t\t\t\t\tif (files) this.getSubView(\"options\").FilterOptions(files);\n\t\t\t\t\telse return false;\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tinit() {\n\t\tthis.on(this.app, \"app:filemenu:click\", () => this.getRoot().hide());\n\t}\n\tAttachTo(master, locate) {\n\t\tthis._Locate = locate;\n\t\tthis.getRoot().attachTo(master);\n\t}\n\tShow(trg) {\n\t\tthis.getRoot().show(trg, {\n\t\t\tx: -trg.offsetX,\n\t\t\ty: trg.target.offsetHeight - trg.offsetY,\n\t\t});\n\t}\n}\n","import { JetView } from \"webix-jet\";\nimport hotkey from \"jet-hotkey\";\n\nimport { folderIcon } from \"../../helpers/icons\";\n\nimport ContextMenuView from \"../menus/contextmenu\";\n\nexport default class DataViewBase extends JetView {\n\tinit() {\n\t\tthis.State = this.getParam(\"state\");\n\t\tthis.Local = this.app.getService(\"local\");\n\n\t\tthis._Track = true;\n\t\tthis.WTable.attachEvent(\"onAfterSelect\", () => this.ShiftFocus());\n\t\tthis.WTable.attachEvent(\"onSelectChange\", () => {\n\t\t\tif (this._Track) {\n\t\t\t\tconst newIDs = []\n\t\t\t\t\t.concat(\n\t\t\t\t\t\tthis.WTable.getSelectedId(true).map(a => this.WTable.getItem(a))\n\t\t\t\t\t)\n\t\t\t\t\t.filter(a => a.value !== \"..\");\n\t\t\t\tif (newIDs.length || this.State.selectedItem.length) {\n\t\t\t\t\tif (!newIDs.length) newIDs.$noSelect = true;\n\t\t\t\t\tthis.State.selectedItem = newIDs;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// refresh self on folder change\n\t\tthis.on(this.State.$changes, \"path\", (v, o) => {\n\t\t\tif (!this.State.search) {\n\t\t\t\tv = this.State.source === \"files\" ? v : this.State.source;\n\t\t\t\tif (!o) this.LoadData(v);\n\t\t\t\telse\n\t\t\t\t\tthis.Local.folders().then(hierarchy => {\n\t\t\t\t\t\tthis.State.selectedItem = this.GetPrevLocation(hierarchy, v, o);\n\t\t\t\t\t\tthis.LoadData(v);\n\t\t\t\t\t});\n\t\t\t} else if (o) {\n\t\t\t\tthis.State.$batch({\n\t\t\t\t\tsearch: \"\",\n\t\t\t\t\tsearchStats: null,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// refresh selection on localData.refresh\n\t\tthis.on(this.WTable.data, \"onStoreUpdated\", (i, o, m) => {\n\t\t\tif (!m && this.WTable.count() && this.State.selectedItem.length) {\n\t\t\t\tthis.SelectActive();\n\t\t\t}\n\t\t});\n\n\t\t// Shared hotkeys\n\t\tthis.AddHotkeys();\n\n\t\tconst compact = this.getParam(\"compact\", true);\n\t\tthis.Menu = this.ui(\n\t\t\tnew (this.app.dynamic(ContextMenuView))(this.app, \"\", {\n\t\t\t\tcompact,\n\t\t\t\tstate: this.State,\n\t\t\t})\n\t\t);\n\t\tthis.Menu.AttachTo(this.WTable, e => {\n\t\t\tconst id = this.WTable.locate(e);\n\t\t\tif (!id) return false;\n\n\t\t\tconst item = this.WTable.getItem(id);\n\t\t\tif (item.value == \"..\") return false;\n\n\t\t\tif (!this.WTable.isSelected(id)) this.WTable.select(id);\n\n\t\t\tlet sel = this.WTable.getSelectedId(true);\n\t\t\tif (sel.length === 1) return [item];\n\t\t\treturn sel.map(s => this.WTable.getItem(s));\n\t\t});\n\n\t\t// hide contexts on scroll\n\t\tthis.on(this.WTable, \"onAfterScroll\", () => webix.callEvent(\"onClick\"));\n\t}\n\n\t/**\n\t * Moves focus from one panel to the other in Total\n\t */\n\tShiftFocus() {\n\t\tif (this.getParam(\"trackActive\", true)) this.State.isActive = true;\n\t}\n\n\t/**\n\t * Opens a folder or file(s)\n\t * @param {Array} items - selected files and folders\n\t */\n\tActivate(items) {\n\t\tif (!items.length) return; // nothing selected - ignore\n\n\t\tif (items.length === 1) {\n\t\t\tconst item = items[0];\n\t\t\tif (item.type === \"folder\") {\n\t\t\t\tthis.ShowSubFolder(item.value === \"..\" ? item.value : item.id);\n\t\t\t} else {\n\t\t\t\tconst operation =\n\t\t\t\t\titem.type === \"code\" && this.app.config.editor ? \"edit\" : \"open\";\n\t\t\t\tthis.app.callEvent(\"app:action\", [operation, items]);\n\t\t\t}\n\t\t} else {\n\t\t\tconst operation = this.app.config.editor ? \"edit\" : \"open\";\n\t\t\tthis.app.callEvent(\"app:action\", [operation, items]);\n\t\t}\n\t}\n\n\t/**\n\t * Opens a selected directory\n\t * @param {string} id - the ID of the selected folder\n\t */\n\tShowSubFolder(id) {\n\t\tlet path;\n\t\tif (id == \"..\") {\n\t\t\tconst t = this.State.path.split(\"/\");\n\t\t\tpath = \"/\" + t.slice(1, t.length - 1).join(\"/\");\n\t\t} else {\n\t\t\tpath = id;\n\t\t}\n\n\t\tthis.State.path = path;\n\t}\n\n\t/**\n\t *\n\t * @param {Object} hierarchy - folders TreeCollection\n\t * @param {string} path - new opened path\n\t * @param {string} oldPath - old opened path\n\t * @returns {Array} with the previous opened path or an empty array\n\t */\n\tGetPrevLocation(hierarchy, path, oldPath) {\n\t\t// oldPath does not exist if path was changed after a folder renamed\n\t\tif (oldPath === \"/\" || !hierarchy.exists(oldPath)) return [];\n\n\t\tif (path === \"/\") path = \"../files\";\n\t\tlet id;\n\t\twhile (oldPath) {\n\t\t\tid = oldPath;\n\t\t\toldPath = hierarchy.getParentId(oldPath);\n\t\t\tif (oldPath === path) {\n\t\t\t\tconst obj = hierarchy.getItem(id);\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: obj.id,\n\t\t\t\t\t\tvalue: obj.value,\n\t\t\t\t\t\ttype: \"folder\",\n\t\t\t\t\t\tdate: new Date(obj.date),\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn [];\n\t}\n\n\t/**\n\t * Gets the target directory for a moved file or folder\n\t * @param {string} target - the ID of a folder\n\t * @returns {Object} - data object of the target folder\n\t */\n\tGetTargetFolder(target) {\n\t\tconst targetItem = target ? this.WTable.getItem(target) : null;\n\t\tconst invalidTarget =\n\t\t\t!targetItem || targetItem.type !== \"folder\" || targetItem.value === \"..\";\n\t\tconst targetFolder = invalidTarget ? this.State.path : targetItem.id;\n\t\treturn targetFolder;\n\t}\n\n\t/**\n\t * Selects the first item in the newly opened directory\n\t */\n\tSelectActive() {\n\t\tconst table = this.WTable;\n\t\tif (this.State.isActive !== false && !table.getSelectedId()) {\n\t\t\tlet sel = this.State.selectedItem;\n\n\t\t\tfor (let i = 0; i < sel.length; i++) {\n\t\t\t\tif (table.exists(sel[i].id)) table.select(sel[i].id, true);\n\t\t\t}\n\n\t\t\tif (!sel.$noSelect && !table.getSelectedId()) {\n\t\t\t\tconst id = table.getFirstId();\n\t\t\t\tif (id) {\n\t\t\t\t\ttable.select(id);\n\t\t\t\t\tsel.$noSelect = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twebix.delay(() => webix.UIManager.setFocus(table));\n\t\t}\n\t}\n\n\t/**\n\t * Returns currently selected files and directories\n\t * @returns {Array} - an array of file/directory data objects; an empty array if nothing is selected\n\t */\n\tGetSelection() {\n\t\treturn this.WTable.getSelectedId(true).map(file => {\n\t\t\treturn this.WTable.getItem(file);\n\t\t});\n\t}\n\n\t/**\n\t * Loads folders and files inside the opened directory\n\t * @param {string} path - the currently opened directory\n\t * @param {Boolean} search - pass true to signal that the data are loaded in response to a search query\n\t */\n\tLoadData(path, search) {\n\t\tthis._Track = false;\n\t\tconst table = this.WTable;\n\t\tif (search) {\n\t\t\ttable.clearAll();\n\t\t\tthis.app\n\t\t\t\t.getService(\"backend\")\n\t\t\t\t.search(path, search)\n\t\t\t\t.then(data => {\n\t\t\t\t\tfor (let i = 0; i < data.length; ++i) this.Local.prepareData(data[i]);\n\n\t\t\t\t\ttable.parse(data);\n\n\t\t\t\t\tthis.GetSearchStats(data);\n\t\t\t\t});\n\t\t} else {\n\t\t\tif (table.data.url !== path) {\n\t\t\t\ttable.clearAll();\n\t\t\t\tthis.Local.files(path).then(data => {\n\t\t\t\t\tthis.RenderData(data);\n\t\t\t\t\tthis.SelectActive();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._Track = true;\n\t}\n\n\t/**\n\t * Moves files and folders to a target directory\n\t * @param {Array} source - an array of data objects of files and folders that are being moved\n\t * @param {string} target - the ID of the target directory\n\t * @returns {Boolean} - must always be false to cancel default Webix logic for drag-and-drop\n\t */\n\tMoveFiles(source, target) {\n\t\tthis.app\n\t\t\t.getService(\"operations\")\n\t\t\t.move(source, this.GetTargetFolder(target));\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns a string with a file type icon\n\t * @param {Object} obj - the data object of a file\n\t * @returns {string} with HTML of a file type icon\n\t */\n\tIcon(obj) {\n\t\treturn ``;\n\t}\n\n\t/**\n\t * Defines the looks of the dragged node for drag-and-drop of files and folders\n\t * @param {Object} ctx - the context object of drag-and-drop Webix logic\n\t */\n\tDragMarker(ctx) {\n\t\tconst list = this.WTable;\n\n\t\t// remove \"..\"\n\t\tconst parent = list.find(f => f.value === \"..\", true);\n\t\tif (parent) {\n\t\t\tconst parentInd = ctx.source.indexOf(parent.id);\n\t\t\tif (parentInd !== -1) ctx.source.splice(parentInd, 1);\n\t\t}\n\n\t\tconst files = ctx.source.length;\n\t\tif (!files) return false;\n\n\t\tif (files === 1) list.select(ctx.source[0]);\n\n\t\tconst firstDragged = list.getItem(ctx.source[0]);\n\t\tlet icon;\n\t\tif (firstDragged.type === \"folder\") {\n\t\t\ticon = folderIcon;\n\t\t} else {\n\t\t\ticon = this.Icon(firstDragged);\n\t\t}\n\n\t\tlet html = \"
\";\n\t\thtml += `
${icon}${firstDragged.value}
`;\n\t\thtml += \"
\";\n\n\t\tif (files > 1) {\n\t\t\thtml = \"
\" + html + \"
\";\n\t\t\thtml += \"
\" + files + \"
\";\n\n\t\t\tlet multiple = \"
\";\n\t\t\tif (files > 2)\n\t\t\t\tmultiple = \"
\" + multiple;\n\n\t\t\thtml = multiple + html;\n\t\t}\n\n\t\tctx.html = html;\n\t}\n\n\t/**\n\t * Adds hotkeys for operations with directories and files\n\t */\n\tAddHotkeys() {\n\t\tconst ctrlKey = webix.env.isMac ? \"COMMAND\" : \"CTRL\";\n\n\t\tconst operations = [\n\t\t\t{ key: \"DELETE\", oper: \"delete\" },\n\t\t\t{ key: \"BACKSPACE\", oper: \"delete\" },\n\t\t\t{ key: `${ctrlKey}+C`, oper: \"copy\" },\n\t\t\t{ key: `${ctrlKey}+X`, oper: \"cut\" },\n\t\t\t{ key: `${ctrlKey}+V`, oper: \"paste\" },\n\t\t\t{ key: `${ctrlKey}+R`, oper: \"rename\" },\n\t\t\t{ key: `${ctrlKey}+O`, oper: \"open\" },\n\t\t\t{ key: `${ctrlKey}+D`, oper: \"download\" },\n\t\t\t{ key: `${ctrlKey}+Alt+O`, oper: \"locate\" },\n\t\t];\n\n\t\tif (this.app.config.editor) {\n\t\t\toperations.push({ key: `${ctrlKey}+E`, oper: \"edit\" });\n\t\t}\n\n\t\tfor (let i = 0; i < operations.length; ++i) {\n\t\t\tthis.on(hotkey(this.getRoot()), operations[i].key, (v, e) => {\n\t\t\t\tconst params = [operations[i].oper];\n\t\t\t\tthis.app.callEvent(\"app:action\", params);\n\t\t\t\twebix.html.preventEvent(e);\n\t\t\t});\n\t\t}\n\n\t\tthis.on(hotkey(this.getRoot()), `${ctrlKey}+A`, (v, e) => {\n\t\t\tthis.WTable.selectAll();\n\t\t\twebix.html.preventEvent(e);\n\t\t});\n\t}\n\n\t/**\n\t * Counts found folders and files\n\t * @param {Array} data - all directories and files that match a search query\n\t */\n\tGetSearchStats(data) {\n\t\tconst all = data.length;\n\t\tconst folders = data.filter(i => i.type === \"folder\");\n\t\tthis.State.searchStats = {\n\t\t\tfolders: folders ? folders.length : 0,\n\t\t\tfiles: all - folders.length,\n\t\t};\n\t}\n\n\t/**\n\t * Handles clicks on empty spaces in list or cards\n\t * If click happened in Total in the inactive half, this method will shift focus to this part\n\t */\n\tEmptyClick() {\n\t\tif (this.State.isActive !== false) this.WTable.unselectAll();\n\t\telse this.ShiftFocus();\n\t}\n}\n","import DataViewBase from \"views/sections/dataview\";\nimport { menuIcon, folderCardIcon } from \"../helpers/icons\";\n\nexport default class CardsView extends DataViewBase {\n\tconfig() {\n\t\tconst compact = this.getParam(\"compact\", true);\n\n\t\tconst smallSkin =\n\t\t\twebix.skin.$name === \"mini\" || webix.skin.$name === \"compact\";\n\t\tconst itemSize = smallSkin\n\t\t\t? {\n\t\t\t\t\theight: 149,\n\t\t\t\t\twidth: 181,\n\t\t\t\t\tpadding: 16,\n\t\t\t }\n\t\t\t: {\n\t\t\t\t\theight: 197,\n\t\t\t\t\twidth: 236,\n\t\t\t\t\tpadding: 20,\n\t\t\t };\n\n\t\treturn {\n\t\t\tview: \"dataview\",\n\t\t\tlocalId: \"cards\",\n\t\t\tdrag: !compact,\n\t\t\tselect: true,\n\t\t\tmultiselect: true,\n\t\t\tcss: \"webix_noselect webix_fmanager_cards\",\n\t\t\ttemplate: obj => this.CardTemplate(obj),\n\t\t\ttype: {\n\t\t\t\t...itemSize,\n\t\t\t\ttype: \"tiles\",\n\t\t\t},\n\t\t\ton: {\n\t\t\t\tonItemDblClick: () => this.Activate(this.GetSelection()),\n\t\t\t\tonEnter: () => this.Activate(this.GetSelection()),\n\t\t\t\tonBeforeDrag: ctx => this.DragMarker(ctx),\n\t\t\t\tonBeforeDrop: ctx => this.MoveFiles(ctx.source, ctx.target),\n\t\t\t},\n\t\t\tonClick: {\n\t\t\t\twebix_fmanager_menu_icon: e => {\n\t\t\t\t\tthis.Menu.Show(e);\n\t\t\t\t},\n\t\t\t\twebix_dataview: (e, id) => {\n\t\t\t\t\tif (!id) this.EmptyClick();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonContext: {},\n\t\t};\n\t}\n\tinit() {\n\t\tthis.WTable = this.$$(\"cards\");\n\t\tsuper.init();\n\t}\n\tRenderData(data) {\n\t\tthis.WTable.sync(data, () => this.WTable.filter(f => f.value !== \"..\"));\n\t}\n\tCardTemplate(obj) {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\tlet preview, panel;\n\t\tif (obj.type === \"folder\") {\n\t\t\tpreview = `
${folderCardIcon}
`;\n\n\t\t\tpanel = `
\n\t\t${_(\"Folder\")}\n\t\t${this.SearchTemplate(\n\t\t\tobj.value\n\t\t)}${menuIcon}\n\t\t
`;\n\t\t} else {\n\t\t\tconst skin = webix.skin.$active;\n\t\t\tconst picSize = skin.listItemHeight < 29 ? [163, 92] : [214, 124];\n\n\t\t\tconst origin = this.app\n\t\t\t\t.getService(\"backend\")\n\t\t\t\t.previewURL(obj, picSize[0], picSize[1]);\n\t\t\tconst img = ``;\n\n\t\t\tpreview = `
${img}
`;\n\n\t\t\tconst fileIcon = this.Icon(obj);\n\n\t\t\tpanel = `
\n\t\t${fileIcon}${this.SearchTemplate(\n\t\t\t\tobj.value\n\t\t\t)}${menuIcon}\n\t\t
`;\n\t\t}\n\n\t\treturn preview + panel;\n\t}\n\n\tSearchTemplate(name) {\n\t\tif (this.State.search) {\n\t\t\tconst rex = new RegExp(\"(\" + this.State.search + \")\", \"gi\");\n\t\t\treturn name.replace(\n\t\t\t\trex,\n\t\t\t\t\"$1\"\n\t\t\t);\n\t\t}\n\n\t\treturn name;\n\t}\n}\n","export function fileNameSelectMask(input) {\n\tconst extIndex = input.value.lastIndexOf(\".\");\n\tif (extIndex > -1) input.setSelectionRange(0, extIndex);\n\telse input.select();\n}\n\nexport function iterateAsync(arr, code, ctx) {\n\tctx = ctx || { i: 0, cancel: false };\n\n\tif (ctx.i >= arr.length) return;\n\n\treturn code(arr[ctx.i], ctx.i).then(() => {\n\t\tctx.i += 1;\n\t\tif (!ctx.cancel) return iterateAsync(arr, code, ctx);\n\t});\n}\n\nexport function formatTemplate(size) {\n\tif (size >= 1000000000) return (size / 1000000000).toFixed(1) + \" Gb\";\n\tif (size >= 1000000) return (size / 1000000).toFixed(1) + \" Mb\";\n\tif (size >= 1000) return (size / 1000).toFixed(1) + \" kb\";\n\n\treturn size + \" b\";\n}\n\nexport function ext(path) {\n\tif (!path) return \"\";\n\tconst parts = path.split(\".\");\n\tif (parts.length < 2) return \"\";\n\treturn parts[parts.length - 1];\n}\n\nexport function getLastSelected(files) {\n\treturn files.length\n\t\t? files[files.length - 1]\n\t\t: { type: \"empty\", value: \"Nothing is selected\" };\n}\n\nexport function safeName(str) {\n\tstr = str.replace(/[/\\\\:*?\"<>|]/g, \"\").trim();\n\twhile (str[0] === \".\") str = str.substr(1).trim();\n\n\treturn str;\n}\n\nexport function capitalize(str) {\n\tif (!str) return \"\";\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n","webix.protoUI({\r\n\tname: \"codemirror-editor\",\r\n\tdefaults: {\r\n\t\tmode: \"javascript\",\r\n\t\tlineNumbers: true,\r\n\t\tmatchBrackets: true,\r\n\t\ttheme: \"default\"\r\n\t},\r\n\t$init: function (config) {\r\n\t\tthis.$view.innerHTML = \"\";\r\n\t\tthis._textarea = this.$view.firstChild;\r\n\t\tthis._waitEditor = webix.promise.defer();\r\n\t\tthis.$ready.push(this._render_cm_editor);\r\n\t},\r\n\tcomplex_types: {\r\n\t\tphp: {\r\n\t\t\tmode: [\"xml\", \"javascript\", \"css\", \"htmlmixed\", \"clike\"]\r\n\t\t},\r\n\t\thtmlembedded: {\r\n\t\t\tmode: [\"xml\", \"javascript\", \"css\", \"htmlmixed\"],\r\n\t\t\taddon: [\"mode/multiplex\"]\r\n\t\t},\r\n\t\thtmlmixed: {\r\n\t\t\tmode: [\"xml\", \"javascript\", \"css\"]\r\n\t\t},\r\n\t\tdockerfile: {\r\n\t\t\taddon: [\"mode/simple\"]\r\n\t\t}\r\n\t},\r\n\t_render_cm_editor: function () {\r\n\r\n\t\tif (this.config.cdn === false) {\r\n\t\t\tthis._render_when_ready;\r\n\t\t\treturn;\r\n\t\t};\r\n\r\n\t\tvar cdn = this.config.cdn || \"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.48.4/\";\r\n\t\t// basic\r\n\t\tvar sources = [\r\n\t\t\tcdn + \"/codemirror.css\",\r\n\t\t\tcdn + \"/codemirror.js\"\r\n\t\t];\r\n\r\n\t\t// mode\r\n\t\tvar mode = this.config.mode ? this.config.mode : \"javascript\";\r\n\t\t// complex modes based on others: htmlmixed, htmlembedded, php\r\n\t\tvar extras = this.complex_types[mode];\r\n\t\tif (extras) {\r\n\t\t\tif (extras[\"mode\"]) {\r\n\t\t\t\textras[\"mode\"].forEach(function (name) {\r\n\t\t\t\t\tvar path = \"/mode/\" + name + \"/\" + name + \".js\";\r\n\t\t\t\t\tsources.push(cdn + path);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t\tif (extras[\"addon\"]) {\r\n\t\t\t\textras[\"addon\"].forEach(function (name) {\r\n\t\t\t\t\tvar path = \"/addon/\" + name + \".js\";\r\n\t\t\t\t\tsources.push(cdn + path);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t};\r\n\t\tsources.push(cdn + \"/mode/\" + mode + \"/\" + mode + \".js\");\r\n\r\n\t\t// theme\r\n\t\tif (this.config.theme && this.config.theme !== \"default\") {\r\n\t\t\tsources.push(cdn + \"/theme/\" + this.config.theme + \".css\")\r\n\t\t};\r\n\r\n\t\t// matchbrackets add-on\r\n\t\tif (this.config.matchBrackets) {\r\n\t\t\tsources.push(cdn + \"/addon/edit/matchbrackets.js\")\r\n\t\t};\r\n\r\n\t\twebix.require(sources)\r\n\t\t\t.then(webix.bind(this._render_when_ready, this))\r\n\t\t\t.catch(function (e) {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t},\r\n\t_render_when_ready: function () {\r\n\t\tthis._editor = CodeMirror.fromTextArea(this._textarea, {\r\n\t\t\tmode: this.config.mode,\r\n\t\t\tlineNumbers: this.config.lineNumbers,\r\n\t\t\tmatchBrackets: this.config.matchBrackets,\r\n\t\t\ttheme: this.config.theme\r\n\t\t});\r\n\r\n\t\tthis._waitEditor.resolve(this._editor);\r\n\r\n\t\tthis.setValue(this.config.value);\r\n\t\tif (this._focus_await)\r\n\t\t\tthis.focus();\r\n\t},\r\n\t_set_inner_size: function () {\r\n\t\tif (!this._editor || !this.$width) return;\r\n\r\n\t\tthis._updateScrollSize();\r\n\t\tthis._editor.scrollTo(0, 0); //force repaint, mandatory for IE\r\n\t},\r\n\t_updateScrollSize: function () {\r\n\t\tvar box = this._editor.getWrapperElement();\r\n\t\tvar height = (this.$height || 0) + \"px\";\r\n\r\n\t\tbox.style.height = height;\r\n\t\tbox.style.width = (this.$width || 0) + \"px\";\r\n\r\n\t\tvar scroll = this._editor.getScrollerElement();\r\n\t\tif (scroll.style.height != height) {\r\n\t\t\tscroll.style.height = height;\r\n\t\t\tthis._editor.refresh();\r\n\t\t}\r\n\t},\r\n\t$setSize: function (x, y) {\r\n\t\tif (webix.ui.view.prototype.$setSize.call(this, x, y)) {\r\n\t\t\tthis._set_inner_size();\r\n\t\t}\r\n\t},\r\n\tsetValue: function (value) {\r\n\t\tif (!value && value !== 0)\r\n\t\t\tvalue = \"\";\r\n\r\n\t\tthis.config.value = value;\r\n\t\tif (this._editor) {\r\n\t\t\tthis._editor.setValue(value);\r\n\t\t\t//by default - clear editor's undo history when setting new value\r\n\t\t\tif (!this.config.preserveUndoHistory)\r\n\t\t\t\tthis._editor.clearHistory();\r\n\t\t\tthis._updateScrollSize();\r\n\t\t}\r\n\t},\r\n\tgetValue: function () {\r\n\t\treturn this._editor ? this._editor.getValue() : this.config.value;\r\n\t},\r\n\tfocus: function () {\r\n\t\tthis._focus_await = true;\r\n\t\tif (this._editor)\r\n\t\t\tthis._editor.focus();\r\n\t},\r\n\tgetEditor: function (waitEditor) {\r\n\t\treturn waitEditor ? this._waitEditor : this._editor;\r\n\t},\r\n\t//undo, redo, etc\r\n\tundo: function () {\r\n\t\tthis._editor.undo();\r\n\t},\r\n\tredo: function () {\r\n\t\tthis._editor.redo();\r\n\t},\r\n\tundoLength: function () {\r\n\t\treturn this._editor.historySize().undo;\r\n\t}\r\n}, webix.ui.view);","import \"@wbx/view-codemirror-editor\";\n\nimport { JetView } from \"webix-jet\";\nimport { iterateAsync } from \"helpers/common\";\nimport hotkey from \"jet-hotkey\";\n\nconst typeHash = {\n\tcss: [\"css\", \"less\"],\n\tgo: [\"go\"],\n\thtmlmixed: [\"html\", \"xml\", \"svg\"],\n\tjavascript: [\"js\", \"mjs\", \"json\", \"ts\", \"coffee\"],\n\tmarkdown: [\"md\"],\n\tphp: [\"php\", \"phtml\", \"php3\", \"php4\", \"php5\", \"php7\", \"php-s\", \"pht\", \"phar\"],\n\tpython: [\"py\", \"pyc\", \"pyd\", \"pyo\", \"pyw\", \"pyz\"],\n\tsql: [\"sql\", \"sqlite3\", \"sqlite\", \"db\"],\n\tyaml: [\"yaml\", \"yml\"],\n\tshell: [\"sh\"],\n};\n\nexport default class EditorView extends JetView {\n\tconfig() {\n\t\tthis._ = this.app.getService(\"locale\")._;\n\t\tthis.Files = this.getParam(\"files\");\n\n\t\tconst tabbar = {\n\t\t\tview: \"tabbar\",\n\t\t\tlocalId: \"tabbar\",\n\t\t\tcss: \"webix_fmanager_editor_tabs\",\n\t\t\tborderless: true,\n\t\t\ttabMinWidth: 170,\n\t\t\tmoreTemplate:\n\t\t\t\t\"\",\n\t\t\ttooltip: obj => obj.id,\n\t\t\toptions: [],\n\t\t\ton: {\n\t\t\t\tonChange: id => this.OpenDoc(id),\n\t\t\t\tonBeforeTabClick: (id, e) => this.TabAction(id, e),\n\t\t\t},\n\t\t\ttabbarPopup: {\n\t\t\t\tcss: \"webix_gantt_editor_popup\",\n\t\t\t},\n\t\t};\n\n\t\tconst skin = webix.skin.$active;\n\t\tconst toolbar = {\n\t\t\tview: \"toolbar\",\n\t\t\tcss: \"webix_fmanager_editor_bar\",\n\t\t\tpadding: { left: 4, right: 4, top: 0, bottom: 0 },\n\t\t\theight: skin.toolbarHeight + !(skin.toolbarHeight % 2),\n\t\t\tcols: webix.env.touch ? this.GetMobileControls() : [tabbar],\n\t\t};\n\n\t\tif (webix.env.touch) {\n\t\t\ttoolbar.cols.push(this.GetCloseAll(true));\n\t\t} else {\n\t\t\ttoolbar.cols.push({ width: 12 }, this.GetCloseAll());\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"wide\",\n\t\t\trows: [\n\t\t\t\ttoolbar,\n\t\t\t\t{\n\t\t\t\t\tview: \"codemirror-editor\",\n\t\t\t\t\tlocalId: \"editor\",\n\t\t\t\t\ttheme: webix.skin.$name === \"contrast\" ? \"monokai\" : \"default\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\t/**\n\t * Returns the Save button and file name label (in FM used for editor on touch devices)\n\t * @returns {Array} - of objects with control configuration\n\t */\n\tGetMobileControls() {\n\t\treturn [\n\t\t\t{\n\t\t\t\tview: \"button\",\n\t\t\t\tlocalId: \"saveBtn\",\n\t\t\t\ttype: \"icon\",\n\t\t\t\tlabel: this._(\"Save\"),\n\t\t\t\ticon: \"wxi-check\",\n\t\t\t\tcss: \"webix_primary webix_fmanager_editor_save\",\n\t\t\t\twidth: 90,\n\t\t\t\tclick: () => this.Save(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tview: \"label\",\n\t\t\t\tlabel: \" \",\n\t\t\t\tlocalId: \"name\",\n\t\t\t\tcss: \"webix_fmanager_editor_name\",\n\t\t\t},\n\t\t];\n\t}\n\n\t/**\n\t *\n\t * @param {Boolean} mobile - true - returns the icon for mobile devices; false - desktop\n\t * @returns {Object} with icon widget configuration\n\t */\n\tGetCloseAll(mobile) {\n\t\treturn {\n\t\t\tview: \"icon\",\n\t\t\ticon: mobile ? \"wxi-close\" : \"fmi-exit-to-app\",\n\t\t\tclick: () => this.ConfirmAll(),\n\t\t\ttooltip: this._(\"Close the editor\") + \" (Esc)\",\n\t\t};\n\t}\n\n\tinit() {\n\t\tconst editor = this.$$(\"editor\");\n\t\twebix.extend(editor, webix.ProgressBar);\n\t\teditor.showProgress({\n\t\t\ttype: \"top\",\n\t\t});\n\n\t\tif (webix.env.touch) {\n\t\t\tconst file = this.Files[0];\n\t\t\tthis.$$(\"name\").setValue(this.GetFileLabel(file));\n\t\t}\n\n\t\tthis._oldValue = {};\n\t\tthis._changed = {};\n\t\tthis._buffers = {}; // codemirror buffers\n\n\t\teditor.getEditor(true).then(editorObj => {\n\t\t\titerateAsync(this.Files, file => {\n\t\t\t\treturn this.app\n\t\t\t\t\t.getService(\"operations\")\n\t\t\t\t\t.read(file.id)\n\t\t\t\t\t.then(text => this.AddDoc(file, text));\n\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (!webix.env.touch) {\n\t\t\t\t\t\tconst tabbar = this.$$(\"tabbar\");\n\t\t\t\t\t\tfor (let i = 0; i < this.Files.length; ++i) {\n\t\t\t\t\t\t\tthis.AddTab(tabbar, this.Files[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttabbar.setValue(tabbar.config.options[0].id);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.OpenDoc(this.Files[0].id);\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\teditor.hideProgress();\n\t\t\t\t});\n\n\t\t\tthis.HandleChanges(editorObj);\n\t\t});\n\n\t\t// editor hotkeys for saving\n\t\tconst ctrlKey = webix.env.isMac ? \"COMMAND\" : \"CTRL\";\n\t\tthis.on(hotkey(), `${ctrlKey} + S`, (v, e) => {\n\t\t\tthis.Save();\n\t\t\twebix.html.preventEvent(e);\n\t\t});\n\t\tthis.on(hotkey(), `${ctrlKey} + Shift + S`, () => this.SaveAll());\n\t\tthis.on(hotkey(), \"ESC\", () => this.ConfirmAll());\n\t}\n\n\t/**\n\t * Adds a handler for changes in the editor (checks for changes comparing to the original text and updates the 'light bulb')\n\t * @param {Object} editor - CodeMirror.Editor instance\n\t */\n\tHandleChanges(editor) {\n\t\teditor.on(\"changes\", () => {\n\t\t\tthis.TextChanged(this.GetActiveFile());\n\t\t});\n\t}\n\n\t/**\n\t * Saves a file contents to the buffer\n\t * @param {Object} file - the file data object\n\t * @param {string} text - the contents of the file\n\t */\n\tAddDoc(file, text) {\n\t\tthis._oldValue[file.id] = text;\n\t\tthis._buffers[file.id] = CodeMirror.Doc(text, this.GetFileType(file));\n\t}\n\n\t/**\n\t * Prepares a label with file name for tabs\n\t * @param {Object} file - a file data object\n\t * @param {Boolean} short - (optional) if true, only the file name (without directory) will be returned; if not passed/false, the full path to the file will be returned\n\t * @returns {string}\n\t */\n\tGetFileLabel(file, short) {\n\t\treturn `
${this.ClipName(\n\t\t\tshort ? file.value : file.id\n\t\t)}
.${file.$ext}`;\n\t}\n\n\t/**\n\t * Cuts off the file extension from its name/ID\n\t * @param {string} path - the file ID or name\n\t * @returns {string}\n\t */\n\tClipName(path) {\n\t\tif (!path) return \"\";\n\t\tconst parts = path.split(\".\");\n\t\treturn parts.slice(0, parts.length - 1).join(\".\");\n\t}\n\n\t/**\n\t * Adds a tab to tabbar for each loaded file if there are several of them\n\t * @param {Object} tabbar - this.$$(\"tabbar\")\n\t * @param {Object} file - a file data object\n\t */\n\tAddTab(tabbar, file) {\n\t\tconst icon = ``;\n\t\tconst tabContent = `
${this.GetFileLabel(\n\t\t\tfile,\n\t\t\ttrue\n\t\t)}${icon}
`;\n\n\t\tconst width =\n\t\t\twebix.html.getTextSize(file.value, \"webix_item_tab\").width + 90;\n\t\ttabbar.addOption({\n\t\t\tid: file.id,\n\t\t\tvalue: tabContent,\n\t\t\tcss: \"webix_fmanager_editor_tab\",\n\t\t\twidth: width > 250 ? 250 : width,\n\t\t});\n\t}\n\n\t/**\n\t * Opens a file in the editor, the previous file stays in the buffer (in multi mode)\n\t * @param {string} name - the file ID (the full path to the file, here serves as the key)\n\t */\n\tOpenDoc(name) {\n\t\tthis.$$(\"editor\")\n\t\t\t.getEditor(true)\n\t\t\t.then(editor => {\n\t\t\t\teditor.swapDoc(this._buffers[name]);\n\t\t\t\teditor.focus();\n\t\t\t});\n\t}\n\n\t/**\n\t * Closes the editor and returns to main FM view\n\t */\n\tBack() {\n\t\tthis.show(\"/top\", { params: { state: this.getParam(\"state\") } });\n\t}\n\n\t/**\n\t * Opens a confirmation dialogue if the user decides to close the editor, but there are unsaved changes\n\t * Closes the editor, if the user doesn't mind loosing changes or there are no unsaved changes\n\t */\n\tConfirmAll() {\n\t\tif (this.CheckChanges())\n\t\t\twebix\n\t\t\t\t.confirm({\n\t\t\t\t\ttext: this._(\"Are you sure you want to exit without saving?\"),\n\t\t\t\t})\n\t\t\t\t.then(() => this.Back());\n\t\telse this.Back();\n\t}\n\n\t/**\n\t * Handles clicks on tab icons\n\t * @param {string} id - the ID of a text file\n\t * @param {MouseEvent} e - the browser click event\n\t * @returns {Boolean} - the return value is used by inner Webix logic, see comments below\n\t */\n\tTabAction(id, e) {\n\t\t// clicks on the More popup will not send the native event object + we need to just select the tab there anyway\n\t\tif (e) {\n\t\t\tconst classes = e.target.className;\n\t\t\tconst actionIcon =\n\t\t\t\tclasses.indexOf(\"webix_icon\") !== -1 &&\n\t\t\t\tid == this.$$(\"tabbar\").getValue();\n\n\t\t\tif (actionIcon) {\n\t\t\t\tif (classes.indexOf(\"close\") !== -1) {\n\t\t\t\t\tthis.CloseTab(id);\n\t\t\t\t} else if (classes.indexOf(\"circle\") !== -1) {\n\t\t\t\t\tthis.ConfirmOne(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !actionIcon; // must return false if the action is to be executed;\n\t\t\t// otherwise Webix tabbar selection will happen and will ruin the work of logic behind tab option removal\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Opens a confirmation dialogue if the user decides to close the currently active tab\n\t * Will close the file anyway, but if the user clicks OK will save the file before that\n\t * @param {string} id - the file ID\n\t */\n\tConfirmOne(id) {\n\t\twebix\n\t\t\t.confirm({\n\t\t\t\ttext: this._(\"Save before closing?\"),\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\tthis.Save(id).then(() => this.CloseTab(id));\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tthis.CloseTab(id);\n\t\t\t});\n\t}\n\n\t/**\n\t * Checks if there are unsaved changes\n\t * @returns {Boolean}\n\t */\n\tCheckChanges() {\n\t\tfor (let f in this._changed) {\n\t\t\tif (this._changed[f]) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Saves all unsaved changes\n\t * Note that the function inside iterateAsync must return a promise\n\t */\n\tSaveAll() {\n\t\tconst files = this.Files.filter(f => this._changed[f.id]);\n\t\tif (files.length) {\n\t\t\titerateAsync(files, file => {\n\t\t\t\treturn this.WriteFileContent(file.id);\n\t\t\t}).then(() => {\n\t\t\t\tthis.ChangeTextState(false);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Saves the file in the currently active tab (multi mode) or the only file in single mode\n\t * @param {string} id - the file ID\n\t * @returns {Promise}\n\t */\n\tSave(id) {\n\t\tif (!id) id = this.GetActiveFile();\n\t\tif (this._changed[id]) {\n\t\t\treturn this.WriteFileContent(id).then(() => {\n\t\t\t\tthis.ChangeTextState(false, id);\n\t\t\t});\n\t\t}\n\t\treturn webix.promise.resolve();\n\t}\n\n\t/**\n\t * Saves changes of 1 file\n\t * @param {string} id - the file ID\n\t * @returns {Promise} that resolves with a file data object\n\t */\n\tWriteFileContent(id) {\n\t\tconst content = this._buffers[id].getValue();\n\t\treturn this.app\n\t\t\t.getService(\"operations\")\n\t\t\t.write(id, content)\n\t\t\t.then(() => {\n\t\t\t\tthis._oldValue[id] = content;\n\t\t\t});\n\t}\n\n\t/**\n\t * Gets the ID of the currently active file\n\t * @returns {string} - the file ID\n\t */\n\tGetActiveFile() {\n\t\treturn webix.env.touch ? this.Files[0].id : this.$$(\"tabbar\").getValue();\n\t}\n\n\t/**\n\t * Returns the file type of the given file\n\t * @param {Object} file - a file data object\n\t * @returns {string} - the file type accepted by CodeMirror\n\t */\n\tGetFileType(file) {\n\t\tif (file.value === \"Dockerfile\") return \"dockerfile\";\n\n\t\tif (file.$ext) {\n\t\t\tfor (var type in typeHash) {\n\t\t\t\tif (typeHash[type].indexOf(file.$ext) !== -1) {\n\t\t\t\t\treturn type;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn \"htmlmixed\"; // the most versatile mode\n\t}\n\n\t/**\n\t * Checks if the file text was changed by the latest edit (comparing with the latest save)\n\t * and then turns on/off the 'light bulbs' on the Save button and on file tabs\n\t * @param {string} file - a file ID\n\t */\n\tTextChanged(file) {\n\t\tconst isEqual = this._buffers[file] == this._oldValue[file];\n\t\t// if current state does not correspond to _changed flag\n\t\tthis.ChangeTextState(!isEqual, file);\n\t}\n\n\t/**\n\t * Turns on/off the 'light bulbs' on file tabs or Save button\n\t * @param {Boolean} state - true if changed, false if unchanged\n\t * @param {string} file - (optional) a file ID; if not passed, all files are marked as unchanged/saved\n\t */\n\tChangeTextState(state, file) {\n\t\tif (file && state === !!this._changed[file]) return;\n\n\t\tif (file) this._changed[file] = state;\n\t\telse this._changed = {};\n\n\t\tif (webix.env.touch) {\n\t\t\tthis.ChangeButtonState(state);\n\t\t} else {\n\t\t\tthis.ChangeTabsState(state, file);\n\t\t}\n\t}\n\n\t/**\n\t * Turns on/off the 'light bulbs' on the Save button\n\t * @param {Boolean} state - true if changed, false if unchanged\n\t */\n\tChangeButtonState(state) {\n\t\tconst button = this.$$(\"saveBtn\");\n\t\tbutton.config.icon = state ? \"webix_fmanager_icon fmi-circle\" : \"wxi-check\";\n\t\tbutton.refresh();\n\t}\n\n\t/**\n\t * Turns on/off the 'light bulbs' on file tabs\n\t * @param {Boolean} state - true if changed, false if unchanged\n\t * @param {string} file - (optional) a file ID; if not passed, all files are marked as unchanged/saved\n\t */\n\tChangeTabsState(state, file) {\n\t\tconst tabbar = this.$$(\"tabbar\");\n\t\tif (file) {\n\t\t\tlet tab = tabbar.getOption(file);\n\t\t\tthis.ChangeTabState(tab, state);\n\t\t} else {\n\t\t\tconst tabs = tabbar.config.options;\n\t\t\tfor (let i = 0; i < tabs.length; ++i) {\n\t\t\t\tthis.ChangeTabState(tabs[i], state);\n\t\t\t}\n\t\t}\n\t\ttabbar.refresh();\n\t}\n\n\t/**\n\t * Turns on/off a 'light bulb' on 1 tab\n\t * @param {Object} tab - a configuration object of a tab\n\t * @param {Boolean} state - on/off (file changed/unchanged)\n\t */\n\tChangeTabState(tab, state) {\n\t\ttab.value = tab.value.replace(\n\t\t\tstate ? \"wxi-close\" : \"webix_fmanager_icon fmi-circle\",\n\t\t\tstate ? \"webix_fmanager_icon fmi-circle\" : \"wxi-close\"\n\t\t);\n\t}\n\n\t/**\n\t * Closes a tab with file and removes it from the buffer\n\t * Webix logic ensures that the next visible tab is selected\n\t * If this is the last tab, the editor closes\n\t * @param {string} id - the file ID\n\t */\n\tCloseTab(id) {\n\t\tconst tabbar = this.$$(\"tabbar\");\n\t\ttabbar.removeOption(id);\n\n\t\tif (!tabbar.getValue()) {\n\t\t\treturn this.Back();\n\t\t}\n\n\t\tdelete this._buffers[id];\n\t\tdelete this._changed[id];\n\t\tdelete this._oldValue[id];\n\t}\n}\n","import { safeName } from \"helpers/common\";\n\nexport function prompt(config) {\n\tconst result = new webix.promise.defer();\n\n\tconst p = webix.ui({\n\t\tview: \"window\",\n\t\tcss: \"webix_fmanager_prompt\",\n\t\tmodal: true,\n\t\tmove: true,\n\t\thead: {\n\t\t\tview: \"toolbar\",\n\t\t\tpadding: { left: 12, right: 4 },\n\t\t\tborderless: true,\n\t\t\telements: [\n\t\t\t\t{ view: \"label\", label: config.text },\n\t\t\t\t{\n\t\t\t\t\tview: \"icon\",\n\t\t\t\t\ticon: \"wxi-close\",\n\t\t\t\t\thotkey: \"esc\",\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tresult.reject(\"prompt cancelled\");\n\t\t\t\t\t\tp.close();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tposition: config.master ? \"\" : \"center\",\n\t\tbody: {\n\t\t\tview: \"form\",\n\t\t\tpadding: { top: 0, left: 12, right: 12, bottom: 12 },\n\t\t\trows: [\n\t\t\t\t{\n\t\t\t\t\tmargin: 10,\n\t\t\t\t\tcols: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tview: \"text\",\n\t\t\t\t\t\t\tname: \"name\",\n\t\t\t\t\t\t\tvalue: config.value,\n\t\t\t\t\t\t\twidth: 230,\n\t\t\t\t\t\t\tvalidate: safeName,\n\t\t\t\t\t\t\tcss: \"webix_fmanager_prompt_input\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tview: \"button\",\n\t\t\t\t\t\t\tvalue: config.button,\n\t\t\t\t\t\t\tcss: \"webix_primary\",\n\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\thotkey: \"enter\",\n\t\t\t\t\t\t\tclick: function() {\n\t\t\t\t\t\t\t\tconst popup = this.getTopParentView();\n\t\t\t\t\t\t\t\tconst form = popup.getBody();\n\n\t\t\t\t\t\t\t\tif (form.validate()) {\n\t\t\t\t\t\t\t\t\tconst newname = form.getValues().name;\n\t\t\t\t\t\t\t\t\tresult.resolve(newname);\n\t\t\t\t\t\t\t\t\tpopup.close();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\twebix.UIManager.setFocus(form);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\ton: {\n\t\t\tonShow() {\n\t\t\t\tconst input = this.getBody().elements.name.getInputNode();\n\t\t\t\tinput.focus();\n\t\t\t\tif (config.selectMask) config.selectMask(input);\n\t\t\t\telse input.select();\n\t\t\t},\n\t\t},\n\t});\n\n\tconst position = config.master ? { x: 50 } : null;\n\twebix.delay(() => p.show(config.master, position));\n\n\treturn result;\n}\n","import { JetView } from \"webix-jet\";\nimport { prompt } from \"../../helpers/prompt\";\nimport { fileNameSelectMask, safeName } from \"../../helpers/common\";\n\nexport default class AddNewMenuView extends JetView {\n\tconfig() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\treturn {\n\t\t\tview: \"popup\",\n\t\t\twidth: 198,\n\t\t\tbody: {\n\t\t\t\tview: \"menu\",\n\t\t\t\tautoheight: true,\n\t\t\t\tlayout: \"y\",\n\t\t\t\tcss: \"webix_fmanager_add_new_menu\",\n\t\t\t\tdata: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"makefile\",\n\t\t\t\t\t\tvalue: _(\"Add new file\"),\n\t\t\t\t\t\ticon: \"webix_fmanager_icon fmi-file-plus-outline\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"makedir\",\n\t\t\t\t\t\tvalue: _(\"Add new folder\"),\n\t\t\t\t\t\ticon: \"webix_fmanager_icon fmi-folder-plus-outline\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"upload\",\n\t\t\t\t\t\tvalue: _(\"Upload file\"),\n\t\t\t\t\t\ticon: \"webix_fmanager_icon fmi-file-upload-outline\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\ton: {\n\t\t\t\t\tonMenuItemClick: id => {\n\t\t\t\t\t\tif (id === \"makefile\" || id === \"makedir\") {\n\t\t\t\t\t\t\tconst _ = this.app.getService(\"locale\")._;\n\t\t\t\t\t\t\tprompt({\n\t\t\t\t\t\t\t\ttext: _(\"Enter a new name\"),\n\t\t\t\t\t\t\t\tbutton: _(\"Add\"),\n\t\t\t\t\t\t\t\tselectMask: fileNameSelectMask,\n\t\t\t\t\t\t\t\tvalue: \"New \" + (id === \"makefile\" ? \"file.txt\" : \"folder\"),\n\t\t\t\t\t\t\t}).then(name => {\n\t\t\t\t\t\t\t\tthis.app.callEvent(\"app:action\", [id, safeName(name)]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.app.callEvent(\"app:action\", [id]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.getRoot().hide();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\tShow(target) {\n\t\tthis.getRoot().show(target, { x: 20 });\n\t}\n}\n","import { JetView } from \"webix-jet\";\nimport AddNewMenuView from \"./menus/addnewmenu\";\nimport ContextMenuView from \"./menus/contextmenu\";\n\nimport { formatTemplate } from \"../helpers/common\";\n\nexport default class FoldersView extends JetView {\n\tconfig() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\tconst button = {\n\t\t\tview: \"button\",\n\t\t\tvalue: _(\"Add New\"),\n\t\t\tinputWidth: 210,\n\t\t\tcss: \"webix_primary\",\n\t\t\talign: \"center\",\n\t\t\tclick: function() {\n\t\t\t\tthis.$scope.Menu.Show(this.$view);\n\t\t\t},\n\t\t};\n\n\t\tconst navbar = {\n\t\t\tview: \"tree\",\n\t\t\tlocalId: \"tree\",\n\t\t\tcss: \"webix_fmanager_tree\",\n\t\t\tselect: true,\n\t\t\tdrag: \"target\",\n\t\t\ttype: {\n\t\t\t\ttemplate: (o, common) => {\n\t\t\t\t\treturn `${common.icon(o)}${common.folder(o)} ${\n\t\t\t\t\t\to.$level === 1 ? _(o.value) : o.value\n\t\t\t\t\t}`;\n\t\t\t\t},\n\t\t\t\tfolder: o => `
`,\n\t\t\t},\n\t\t\tborderless: true,\n\t\t\ton: {\n\t\t\t\tonBeforeDrop: ctx => this.MoveFiles(ctx.source, ctx.target),\n\t\t\t\tonBeforeContextMenu: id => {\n\t\t\t\t\tif (id.substr(0, 2) !== \"..\") this.Tree.select(id);\n\t\t\t\t\telse return false;\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tconst FSStats = {\n\t\t\tlocalId: \"fs:stats\",\n\t\t\tborderless: true,\n\t\t\theight: 68,\n\t\t\tcss: \"webix_fmanager_fsstats\",\n\t\t\ttemplate: obj => {\n\t\t\t\tconst used = Math.floor((obj.used / obj.total) * 100);\n\n\t\t\t\tconst activeSkinAccentColor = webix.skin.$active.timelineColor;\n\t\t\t\tconst svg = `\n\n`;\n\n\t\t\t\tconst label = `
${formatTemplate(\n\t\t\t\t\tobj.used || 0\n\t\t\t\t)} ${_(\"of\")} ${formatTemplate(obj.total || 0)} ${_(\"used\")}
`;\n\n\t\t\t\treturn svg + label;\n\t\t\t},\n\t\t};\n\n\t\tconst navpanel = {\n\t\t\tview: \"proxy\",\n\t\t\tbody: {\n\t\t\t\trows: [button, navbar, FSStats],\n\t\t\t\tpadding: { top: 8, bottom: 4 },\n\t\t\t},\n\t\t};\n\n\t\treturn navpanel;\n\t}\n\n\tinit() {\n\t\tthis.State = this.getParam(\"state\");\n\t\tthis.Tree = this.$$(\"tree\");\n\n\t\tthis.Ready = this.app\n\t\t\t.getService(\"local\")\n\t\t\t.folders()\n\t\t\t.then(h => {\n\t\t\t\tthis.Tree.sync(h);\n\t\t\t\tthis.Subscribe();\n\t\t\t\tthis.GetFsStats();\n\t\t\t});\n\n\t\tthis.Menu = this.ui(AddNewMenuView);\n\n\t\tthis.ContextMenu = this.ui(\n\t\t\tnew (this.app.dynamic(ContextMenuView))(this.app, \"\", {\n\t\t\t\tcompact: false,\n\t\t\t\ttree: true,\n\t\t\t})\n\t\t);\n\t\tthis.ContextMenu.AttachTo(this.Tree, e => {\n\t\t\tconst id = this.Tree.locate(e);\n\t\t\treturn id ? [this.Tree.getItem(id)] : null;\n\t\t});\n\n\t\tthis.on(this.app, \"reload:fs:stats\", () => this.GetFsStats(true));\n\t}\n\n\tSubscribe() {\n\t\tthis.Tree.attachEvent(\"onAfterSelect\", () => {\n\t\t\tlet v = this.Tree.getSelectedId();\n\t\t\tif (v.substr(0, 2) == \"..\") {\n\t\t\t\tthis.State.$batch({\n\t\t\t\t\tsource: v.slice(3),\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.State.$batch({\n\t\t\t\t\tsource: this.GetRootId(v).slice(3),\n\t\t\t\t\tpath: v,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.on(this.State.$changes, \"path\", v => {\n\t\t\tthis.State.path = v;\n\t\t\tif (this.Tree.exists(v)) {\n\t\t\t\tthis.Tree.select(v);\n\t\t\t\tvar parent = this.Tree.getParentId(v);\n\t\t\t\tif (parent) this.Tree.open(parent);\n\t\t\t\tthis.Tree.showItem(v);\n\t\t\t} else this.Tree.select(\"../\" + this.State.source);\n\t\t});\n\t}\n\n\tGetFsStats(force) {\n\t\tthis.app\n\t\t\t.getService(\"backend\")\n\t\t\t.getInfo(force)\n\t\t\t.then(data => {\n\t\t\t\tthis.$$(\"fs:stats\").setValues(data.stats);\n\t\t\t});\n\t}\n\n\tMoveFiles(source, target) {\n\t\tif (target === \"../files\") target = \"/\";\n\t\tthis.app.getService(\"operations\").move(source, target);\n\t\treturn false;\n\t}\n\n\tGetRootId(path) {\n\t\tlet root;\n\t\twhile (path) {\n\t\t\troot = path;\n\t\t\tpath = this.Tree.getParentId(path);\n\t\t}\n\t\treturn root;\n\t}\n}\n","import DataViewBase from \"views/sections/dataview\";\nimport hotkey from \"jet-hotkey\";\n\nimport { folderIcon, backIcon } from \"../helpers/icons\";\nimport { formatTemplate } from \"../helpers/common\";\n\nexport default class GridView extends DataViewBase {\n\tconfig() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\tconst compact = this.getParam(\"compact\", true);\n\n\t\tconst grid = {\n\t\t\tview: \"datatable\",\n\t\t\tlocalId: \"table\",\n\t\t\tcss: \"webix_noselect webix_header_border webix_fmanager_filelist\",\n\t\t\tselect: \"row\",\n\t\t\tmultiselect: true,\n\t\t\tdrag: true,\n\t\t\tresizeColumn: { headerOnly: true },\n\t\t\tsort: \"multi\",\n\t\t\ttype: {\n\t\t\t\tbackIcon: () => backIcon,\n\t\t\t\tbackLabel: () => _(\"back to parent folder\"),\n\t\t\t},\n\t\t\ton: {\n\t\t\t\tonItemDblClick: () => this.Activate(this.GetSelection()),\n\t\t\t\tonEnter: () => this.Activate(this.GetSelection()),\n\t\t\t\tonBeforeDrag: ctx => this.DragMarker(ctx),\n\t\t\t\tonBeforeDrop: ctx => this.MoveFiles(ctx.source, ctx.target),\n\t\t\t\t\"data->onStoreLoad\": () => {\n\t\t\t\t\t// needed for folder content reloads or path change after some sorting\n\t\t\t\t\tthis.WTable.markSorting();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonClick: {\n\t\t\t\twebix_ss_center_scroll: () => this.EmptyClick(),\n\t\t\t\twebix_column: () => false,\n\t\t\t},\n\t\t\tcolumns: [\n\t\t\t\t{\n\t\t\t\t\tid: \"value\",\n\t\t\t\t\theader: \"\",\n\t\t\t\t\ttemplate: obj => this.NameTemplate(obj),\n\t\t\t\t\tsort: sort(\"value\"),\n\t\t\t\t\tfillspace: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"size\",\n\t\t\t\t\theader: _(\"Size\"),\n\t\t\t\t\ttemplate: obj =>\n\t\t\t\t\t\tobj.type !== \"folder\" ? formatTemplate(obj.size) : \"\",\n\t\t\t\t\tsort: sort(\"size\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"date\",\n\t\t\t\t\theader: _(\"Date\"),\n\t\t\t\t\tsort: sort(\"date\"),\n\t\t\t\t\tformat: date => {\n\t\t\t\t\t\tif (date instanceof Date && !isNaN(date))\n\t\t\t\t\t\t\treturn webix.i18n.longDateFormatStr(date);\n\t\t\t\t\t\telse return \"\";\n\t\t\t\t\t},\n\t\t\t\t\twidth: 150,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tif (compact) {\n\t\t\tgrid.columns.splice(1, 2);\n\t\t}\n\n\t\treturn grid;\n\t}\n\tinit() {\n\t\tthis.WTable = this.$$(\"table\");\n\t\tsuper.init();\n\n\t\tthis.on(this.State.$changes, \"isActive\", v => {\n\t\t\tif (!v) {\n\t\t\t\tthis._Track = false;\n\t\t\t\tthis.WTable.unselect();\n\t\t\t\tthis._Track = true;\n\t\t\t} else {\n\t\t\t\tthis.SelectActive();\n\t\t\t\twebix.delay(() => webix.UIManager.setFocus(this.WTable));\n\t\t\t}\n\t\t});\n\n\t\t// other hotkeys are shared, this one is specific\n\t\tthis.on(hotkey(this.getRoot()), \"TAB\", () => {\n\t\t\tif (this.getParam(\"trackActive\", true)) this.State.isActive = false;\n\t\t});\n\t}\n\tRenderData(data) {\n\t\tthis.WTable.sync(data);\n\t}\n\tNameTemplate(obj) {\n\t\treturn obj.type === \"folder\"\n\t\t\t? folderIcon + obj.value\n\t\t\t: `${this.Icon(obj)}${obj.value}`;\n\t}\n}\n\nfunction sort(by) {\n\treturn function(a, b) {\n\t\tif (\n\t\t\ta.value === \"..\" ||\n\t\t\tb.value === \"..\" ||\n\t\t\t(a.type === \"folder\" && b.type !== \"folder\") ||\n\t\t\t(b.type === \"folder\" && a.type !== \"folder\")\n\t\t)\n\t\t\treturn 0;\n\n\t\tif (by === \"value\")\n\t\t\treturn a.value.localeCompare(b.value, undefined, {\n\t\t\t\tignorePunctuation: true,\n\t\t\t\tnumeric: true,\n\t\t\t});\n\n\t\treturn a[by] < b[by] ? -1 : a[by] > b[by] ? 1 : 0;\n\t};\n}\n","import { JetView } from \"webix-jet\";\n\nexport default class PreviewPopupView extends JetView {\n\tconfig() {\n\t\treturn {\n\t\t\tview: \"window\",\n\t\t\thead: false,\n\t\t\tfullscreen: true,\n\t\t\tbody: { $subview: true, branch: true, name: \"preview\" },\n\t\t};\n\t}\n\tIsVisible() {\n\t\treturn this.getRoot().isVisible();\n\t}\n\tShow(params) {\n\t\tthis.show(\"preview\", {\n\t\t\ttarget: \"preview\",\n\t\t\tparams: { state: params.state, compact: true },\n\t\t});\n\t\tthis.getRoot().show();\n\t}\n\tHide() {\n\t\tthis.show(\"_blank\", {\n\t\t\ttarget: \"preview\",\n\t\t});\n\t\tthis.getRoot().hide();\n\t}\n}\n","import { JetView } from \"webix-jet\";\n\nimport FoldersTree from \"../folders\";\n\nexport default class SideTreeView extends JetView {\n\tconfig() {\n\t\treturn {\n\t\t\tview: \"sidemenu\",\n\t\t\twidth: 300,\n\t\t\tstate: state => {\n\t\t\t\tconst toolbarHeight = webix.skin.$active.toolbarHeight + 14;\n\t\t\t\tstate.top = toolbarHeight;\n\t\t\t\tstate.height -= toolbarHeight;\n\t\t\t},\n\t\t\tbody: FoldersTree,\n\t\t};\n\t}\n\tIsVisible() {\n\t\treturn this.getRoot().isVisible();\n\t}\n\tShow() {\n\t\tthis.getRoot().show();\n\t}\n}\n","import { JetView } from \"webix-jet\";\nimport { createState } from \"jet-restate\";\n\nexport default class DoublePanelView extends JetView {\n\tconfig() {\n\t\tconst panels = {\n\t\t\ttype: \"wide\",\n\t\t\tcols: [\n\t\t\t\t{ $subview: true, branch: true, name: \"left\" },\n\t\t\t\t{ view: \"resizer\" },\n\t\t\t\t{ $subview: true, branch: true, name: \"right\" },\n\t\t\t],\n\t\t};\n\n\t\treturn panels;\n\t}\n\tinit() {\n\t\tthis.State = this.getParam(\"state\");\n\n\t\tconst left = createState({\n\t\t\tselectedItem: [].concat(this.State.selectedItem),\n\t\t\tpath: this.State.path,\n\t\t\tsource: this.GetSource(\"left\"),\n\t\t\tmode: \"list\",\n\t\t\tisActive: true,\n\t\t});\n\t\tleft.selectedItem.$noSelect = this.State.selectedItem.$noSelect;\n\n\t\tconst right = createState({\n\t\t\tselectedItem: [],\n\t\t\tpath: this.State.path,\n\t\t\tsource: this.GetSource(\"right\"),\n\t\t\tmode: \"list\",\n\t\t\tisActive: false,\n\t\t});\n\n\t\tthis._TrackChanges(left, right);\n\t\tthis._TrackChanges(right, left);\n\n\t\tthis.show(\"panel/list\", {\n\t\t\ttarget: \"left\",\n\t\t\tparams: { trackActive: true, state: left },\n\t\t});\n\t\tthis.show(\"panel/list\", {\n\t\t\ttarget: \"right\",\n\t\t\tparams: { trackActive: true, state: right },\n\t\t});\n\t}\n\n\t_TrackChanges(state, next) {\n\t\tthis.on(state.$changes, \"path\", v => {\n\t\t\tif (state.isActive) this.State.path = v;\n\t\t});\n\t\tthis.on(state.$changes, \"source\", v => (this.State.source = v));\n\t\tthis.on(state.$changes, \"selectedItem\", v => {\n\t\t\tif (state.isActive) this.State.selectedItem = v;\n\t\t});\n\t\tthis.on(state.$changes, \"isActive\", v => {\n\t\t\tif (v)\n\t\t\t\tthis.State.$batch({\n\t\t\t\t\tpath: state.path,\n\t\t\t\t\tsource: state.source,\n\t\t\t\t});\n\t\t\tnext.isActive = !v;\n\t\t});\n\t\tthis.on(this.app, \"pathChanged\", (opath, npath) => {\n\t\t\tif (\n\t\t\t\t!state.isActive &&\n\t\t\t\t(state.path === opath || state.path.indexOf(opath + \"/\") === 0)\n\t\t\t) {\n\t\t\t\tstate.path = state.path.replace(opath, npath);\n\t\t\t}\n\t\t});\n\t}\n\tGetSource() {\n\t\treturn this.State.source;\n\t}\n}\n","import { JetView } from \"webix-jet\";\n\nexport default class PanelSearchView extends JetView {\n\tconfig() {\n\t\tthis.State = this.getParam(\"state\");\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\tconst back = {\n\t\t\tview: \"icon\",\n\t\t\ticon: \"wxi-angle-left\",\n\t\t\tclick: () => {\n\t\t\t\tthis.State.$batch({\n\t\t\t\t\tsearch: \"\",\n\t\t\t\t\tsearchStats: null,\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\n\t\tconst toolbar = {\n\t\t\tview: \"toolbar\",\n\t\t\tcols: [\n\t\t\t\tback,\n\t\t\t\t{\n\t\t\t\t\tlocalId: \"header\",\n\t\t\t\t\ttype: \"header\",\n\t\t\t\t\tborderless: true,\n\t\t\t\t\tcss: \"webix_fmanager_path\",\n\t\t\t\t\ttemplate: obj => {\n\t\t\t\t\t\tconst text = _(\"Search results in\");\n\t\t\t\t\t\tconst root = this.app.getService(\"backend\").getRootName();\n\t\t\t\t\t\tlet path = \"\";\n\t\t\t\t\t\tif (obj && obj.path && obj.path !== \"/\") {\n\t\t\t\t\t\t\tpath = webix.template.escape(obj.path);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn `${text} ${root}${path}`;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t],\n\t\t};\n\n\t\treturn {\n\t\t\trows: [toolbar, { $subview: true, params: { state: this.State } }],\n\t\t};\n\t}\n\tinit() {\n\t\tthis.$$(\"header\").setValues({ path: this.State.path });\n\t}\n\tready() {\n\t\tthis.on(this.State.$changes, \"search\", v => {\n\t\t\tv = v.trim();\n\t\t\tif (v) {\n\t\t\t\tthis.State.selectedItem = [];\n\t\t\t\tthis.getSubView().LoadData(this.State.path, v);\n\t\t\t}\n\t\t});\n\t}\n}\n","import { JetView } from \"webix-jet\";\n\nexport default class PanelView extends JetView {\n\tconfig() {\n\t\tconst path = {\n\t\t\tview: \"template\",\n\t\t\tlocalId: \"path\",\n\t\t\ttype: \"header\",\n\t\t\tborderless: true,\n\t\t\tcss: \"webix_fmanager_path\",\n\t\t\ttemplate: obj => this.RenderPath(obj),\n\t\t\tonClick: {\n\t\t\t\twebix_fmanager_path_chunk: e => this.ChangePath(e),\n\t\t\t},\n\t\t};\n\n\t\tconst refresh = {\n\t\t\tview: \"icon\",\n\t\t\ticon: \"wxi-sync\",\n\t\t\tcss: \"webix_fmanager_spec_icon\",\n\t\t\ttooltip: \"Refresh\",\n\t\t\tclick: () => {\n\t\t\t\tthis.app.getService(\"local\").refresh(this.State.path);\n\t\t\t},\n\t\t};\n\n\t\tconst toolbar = {\n\t\t\tview: \"toolbar\",\n\t\t\tpaddingX: 4,\n\t\t\tcols: [refresh, path],\n\t\t};\n\n\t\treturn {\n\t\t\trows: [\n\t\t\t\ttoolbar,\n\t\t\t\t{ $subview: true, params: { state: this.getParam(\"state\") } },\n\t\t\t],\n\t\t};\n\t}\n\tinit() {\n\t\tthis.State = this.getParam(\"state\");\n\n\t\tthis.on(this.State.$changes, \"path\", v => this.ProcessPath(v));\n\n\t\tconst uapi = this.app.getService(\"upload\").getUploader();\n\t\tuapi.addDropZone(this.getRoot().$view);\n\t\tthis.on(uapi, \"onBeforeFileDrop\", (files, e) => {\n\t\t\tif (this.getRoot().$view.contains(e.target))\n\t\t\t\tuapi.config.tempUrlData = { id: this.State.path };\n\t\t});\n\t}\n\n\tProcessPath(v) {\n\t\tthis.app\n\t\t\t.getService(\"local\")\n\t\t\t.folders()\n\t\t\t.then(dirs => {\n\t\t\t\tlet path = [\"/\"];\n\t\t\t\tif (v !== \"/\") {\n\t\t\t\t\tconst p = v.split(\"/\");\n\t\t\t\t\tfor (let i = 1, id = \"\"; i < p.length; ++i) {\n\t\t\t\t\t\tid += `/${p[i]}`;\n\t\t\t\t\t\tpath.push(dirs.getItem(id).value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$(\"path\").setValues({ path: path });\n\t\t\t});\n\t}\n\n\tRenderPath(obj) {\n\t\tif (obj.path && obj.path.length) {\n\t\t\tconst icon = \"\";\n\t\t\tconst rootName = this.app.getService(\"backend\").getRootName();\n\n\t\t\t// template data is initially undefined\n\t\t\tlet htmlPath = \"\";\n\t\t\tobj.path.forEach((chunk, index) => {\n\t\t\t\t// as folders may have the same name, index is stored as \"data-path\" attribute\n\t\t\t\thtmlPath += `${\n\t\t\t\t\tindex ? chunk : rootName\n\t\t\t\t}`;\n\t\t\t\tif (index < obj.path.length - 1) htmlPath += icon;\n\t\t\t});\n\n\t\t\treturn htmlPath;\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tChangePath(e) {\n\t\tconst chunkInd = e.target.getAttribute(\"data-path\") * 1;\n\t\tconst path = this.State.path.split(\"/\");\n\t\tpath.splice(chunkInd + 1, path.length - 1);\n\t\tconst newPath = path.join(\"/\") || \"/\";\n\t\tthis.State.path = newPath;\n\t}\n}\n","import { JetView } from \"webix-jet\";\nimport {\n\tformatTemplate,\n\tgetLastSelected,\n\tcapitalize,\n} from \"../../helpers/common\";\n\nexport default class InfoPreview extends JetView {\n\tconfig() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\tconst dateTimeFormat = webix.Date.dateToStr(\n\t\t\t\"%M %j, %Y    %H:%i:%s\"\n\t\t);\n\n\t\tconst mainInfo = {\n\t\t\tcss: \"webix_fmanager_preview_info\",\n\t\t\tlocalId: \"info\",\n\t\t\tborderless: true,\n\t\t\tautoheight: true,\n\t\t\ttemplate: obj => {\n\t\t\t\tif (!obj.id) return \"\";\n\t\t\t\tconst _ = this.app.getService(\"locale\")._;\n\t\t\t\tconst keys = (obj.type === \"folder\"\n\t\t\t\t\t? [\"Type\", \"Date\"]\n\t\t\t\t\t: [\"Type\", \"Size\", \"Date\"]\n\t\t\t\t).map(k => `
${_(k)}
`);\n\n\t\t\t\tconst keyCol = `
${keys.join(\"\")}
`;\n\n\t\t\t\tconst values = (obj.type === \"folder\"\n\t\t\t\t\t? [capitalize(_(obj.type)), dateTimeFormat(obj.date)]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tcapitalize(_(obj.type)),\n\t\t\t\t\t\t\tformatTemplate(obj.size),\n\t\t\t\t\t\t\tdateTimeFormat(obj.date),\n\t\t\t\t\t ]\n\t\t\t\t).map(v => `
${v}
`);\n\n\t\t\t\tconst valueCol = `
${values.join(\"\")}
`;\n\n\t\t\t\treturn `
${keyCol}${valueCol}
`;\n\t\t\t},\n\t\t};\n\n\t\tconst extraInfo = {\n\t\t\tcss: \"webix_fmanager_preview_info extra\",\n\t\t\tlocalId: \"extra:info\",\n\t\t\thidden: true,\n\t\t\tautoheight: true,\n\t\t\ttemplate: obj => {\n\t\t\t\tconst tags = Object.keys(obj);\n\t\t\t\tlet keyCol = \"
\";\n\t\t\t\tfor (let i = 0; i < tags.length; ++i) {\n\t\t\t\t\tkeyCol += `
${tags[i]}
`;\n\t\t\t\t}\n\t\t\t\tkeyCol += \"
\";\n\n\t\t\t\tlet valueCol = \"
\";\n\t\t\t\tfor (let val in obj) {\n\t\t\t\t\tlet value = obj[val].trim();\n\t\t\t\t\tvalueCol += `
${\n\t\t\t\t\t\tvalue && value != \"0\"\n\t\t\t\t\t\t\t? value\n\t\t\t\t\t\t\t: \"Unknown\"\n\t\t\t\t\t}
`;\n\t\t\t\t}\n\t\t\t\tvalueCol += \"
\";\n\n\t\t\t\treturn `
\n\nExtra info\n
${keyCol}${valueCol}
`;\n\t\t\t},\n\t\t};\n\n\t\tconst counter = {\n\t\t\tlocalId: \"search:counter\",\n\t\t\tcss: \"webix_fmanager_preview_info\",\n\t\t\theight: 104,\n\t\t\tborderless: true,\n\t\t\ttemplate: o => {\n\t\t\t\tconst keys = [_(\"Folders\"), _(\"Files\")].map(\n\t\t\t\t\tk => `
${_(k)}
`\n\t\t\t\t);\n\t\t\t\tconst keyCol = ``;\n\n\t\t\t\tconst values = [o.folders, o.files].map(\n\t\t\t\t\tv => `
${v}
`\n\t\t\t\t);\n\n\t\t\t\tconst valueCol = `
${values.join(\n\t\t\t\t\t\"\"\n\t\t\t\t)}
`;\n\n\t\t\t\treturn `
${keyCol}${valueCol}
`;\n\t\t\t},\n\t\t};\n\n\t\tconst infoTabs = {\n\t\t\tlocalId: \"info:tabs\",\n\t\t\tview: \"tabview\",\n\t\t\tcss: \"webix_fmanager_info_tab\",\n\t\t\tcells: [\n\t\t\t\t{\n\t\t\t\t\theader: _(\"Information\"),\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tpadding: 14,\n\t\t\t\t\t\tmargin: 14,\n\t\t\t\t\t\trows: [mainInfo, extraInfo, {}],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theader: _(\"Search results\"),\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tpadding: 14,\n\t\t\t\t\t\tmargin: 14,\n\t\t\t\t\t\trows: [counter, {}],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\treturn infoTabs;\n\t}\n\tinit() {\n\t\tthis.Tabview = this.$$(\"info:tabs\");\n\t\tthis.State = this.getParam(\"state\");\n\n\t\tthis.on(this.State.$changes, \"selectedItem\", v => {\n\t\t\tthis.ShowInfo(getLastSelected(v));\n\t\t});\n\n\t\tthis.on(this.State.$changes, \"searchStats\", v => {\n\t\t\tif (v) {\n\t\t\t\tthis.$$(\"search:counter\").setValues(v);\n\t\t\t} else {\n\t\t\t\tif (!this.State.selectedItem.length) this.Tabview.hide();\n\t\t\t}\n\t\t});\n\t}\n\tShowInfo(v) {\n\t\tconst tabbar = this.Tabview.getTabbar();\n\t\tconst infoId = tabbar.config.options[0].id;\n\t\tconst counterId = tabbar.config.options[1].id;\n\n\t\tif (v.type !== \"empty\") {\n\t\t\tthis.SetInfo(this.$$(\"info\"), v);\n\t\t\tthis.SwitchTabs(tabbar, counterId, infoId);\n\n\t\t\tconst extraInfo = this.$$(\"extra:info\");\n\t\t\tconst meta = this.app.getService(\"backend\").getMeta(v);\n\t\t\t// if feature is disabled getMeta returns false\n\t\t\tif (!meta) extraInfo.hide();\n\t\t\telse\n\t\t\t\tmeta\n\t\t\t\t\t.then(data => this.SetExtraInfo(extraInfo, data))\n\t\t\t\t\t.fail(() => extraInfo.hide());\n\t\t} else {\n\t\t\tif (!this.State.search) this.Tabview.hide();\n\t\t\telse this.SwitchTabs(tabbar, infoId, counterId);\n\t\t}\n\t}\n\tSetExtraInfo(view, data) {\n\t\tif (!_isEmpty(data)) {\n\t\t\tthis.SetInfo(view, data);\n\t\t} else view.hide();\n\t}\n\tSetInfo(view, data) {\n\t\tview.setValues(data);\n\t\tview.show();\n\t}\n\tSwitchTabs(tab, hide, show) {\n\t\ttab.hideOption(hide);\n\t\ttab.setValue(show);\n\t\ttab.showOption(show);\n\t\tthis.Tabview.show();\n\t}\n}\n\n// if all tags empty or obj has no keys, do not show them at all\nfunction _isEmpty(obj) {\n\tfor (let i in obj) {\n\t\tif (typeof obj[i] === \"object\") return _isEmpty(obj[i]);\n\t\telse if (obj[i] && obj[i] !== \"0\") return false;\n\t}\n\treturn true;\n}\n","import { JetView } from \"webix-jet\";\nimport InfoPreview from \"./info\";\nimport { getLastSelected } from \"../../helpers/common\";\n\nexport default class PreviewView extends JetView {\n\tconfig() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\tconst compact = this.getParam(\"compact\");\n\t\tconst skin = webix.skin.$active;\n\n\t\tconst toolbar = {\n\t\t\tview: \"toolbar\",\n\t\t\tlocalId: \"toolbar\",\n\t\t\theight: skin.toolbarHeight + 2,\n\t\t\tpadding: { right: 6 },\n\t\t\telements: [\n\t\t\t\t{\n\t\t\t\t\tview: \"label\",\n\t\t\t\t\tlocalId: \"filename:label\",\n\t\t\t\t\tcss: \"webix_fmanager_preview_name\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tview: \"icon\",\n\t\t\t\t\ticon: \"wxi-download\",\n\t\t\t\t\tcss: \"webix_fmanager_spec_icon\",\n\t\t\t\t\tlocalId: \"download\",\n\t\t\t\t\ttooltip: _(\"Download file\"),\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tthis.app.callEvent(\"app:action\", [\"download\", [this.FileInfo]]);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tview: \"icon\",\n\t\t\t\t\ticon: \"wxi-close\",\n\t\t\t\t\thidden: !compact,\n\t\t\t\t\tclick: () => this.app.callEvent(\"app:action\", [\"toggle-preview\"]),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tconst preview = {\n\t\t\tview: \"proxy\",\n\t\t\tminHeight: 413,\n\t\t\tborderless: true,\n\t\t\tbody: {\n\t\t\t\t$subview: true,\n\t\t\t\tname: \"preview\",\n\t\t\t},\n\t\t};\n\n\t\treturn {\n\t\t\tmargin: 0.1,\n\t\t\trows: [\n\t\t\t\ttoolbar,\n\t\t\t\t{\n\t\t\t\t\tview: \"scrollview\",\n\t\t\t\t\tborderless: true,\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttype: \"wide\",\n\t\t\t\t\t\tmargin: 10,\n\t\t\t\t\t\trows: [preview, InfoPreview],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\tinit() {\n\t\tthis.on(this.getParam(\"state\").$changes, \"selectedItem\", v => {\n\t\t\tlet lastSelected = getLastSelected(v);\n\n\t\t\tthis.ShowInfo(lastSelected);\n\t\t\tthis.FileInfo = lastSelected;\n\n\t\t\tconst downloadIcon = this.$$(\"download\");\n\t\t\tif (lastSelected.type === \"folder\") {\n\t\t\t\tdownloadIcon.hide();\n\t\t\t} else {\n\t\t\t\tdownloadIcon.show();\n\t\t\t}\n\t\t});\n\t}\n\n\tShowInfo(v) {\n\t\tlet previewUrl = \"preview.template\";\n\n\t\tconst player = this.app.config.player;\n\t\tif (player && (v.type === \"audio\" || v.type === \"video\")) {\n\t\t\tpreviewUrl = \"preview.media\";\n\t\t}\n\n\t\tif (v.type !== \"empty\") {\n\t\t\tthis.$$(\"filename:label\").setValue(v.value);\n\t\t\tthis.$$(\"toolbar\").show();\n\t\t} else {\n\t\t\tthis.$$(\"toolbar\").hide();\n\t\t}\n\n\t\tthis.show(previewUrl, {\n\t\t\ttarget: \"preview\",\n\t\t\tparams: {\n\t\t\t\tinfo: v,\n\t\t\t},\n\t\t});\n\t}\n}\n","webix.protoUI({\r\n\tname:\"plyr-player\",\r\n\tdefaults:{\r\n\t\tconfig:{},\r\n\t\tsource:{}\r\n\t},\r\n\t$init:function(){\r\n\t\tthis.$view.innerHTML = '
';\r\n\t\tthis._container = this.$view.firstChild.firstChild;\r\n\t\t// visibility of tooltips and popup menu\r\n\t\tthis.$view.style.overflow = \"visible\";\r\n\r\n\t\tthis._waitView = webix.promise.defer();\r\n\t\tthis.$ready.push(this.render);\r\n\t},\r\n\tgetPlayer:function(wait){\r\n\t\treturn wait?this._waitView:this._player;\r\n\t},\r\n\trender:function(){\r\n\t\tif (this.config.cdn === false || window.Plyr){\r\n\t\t\tthis._initPlyr();\r\n\t\t\treturn;\r\n\t\t};\r\n\r\n\t\tvar cdn = this.config.cdn ? this.config.cdn : \"https://cdn.plyr.io/3.5.10\";\r\n\r\n\t\twebix.require([\r\n\t\t\tcdn+\"/plyr.js\",\r\n\t\t\tcdn+\"/plyr.css\"\r\n\t\t])\r\n\t\t.then( webix.bind(this._initPlyr, this) )\r\n\t\t.catch(function(e){\r\n\t\t\tconsole.log(e);\r\n\t\t});\r\n\t\t\r\n\t},\r\n\t_initPlyr:function(){\r\n\t\tif (this.$view){\r\n\t\t\tvar options = webix.extend({}, this.config.config);\r\n\t\t\tthis._player = new Plyr(this._container, options);\r\n\t\t\tthis._player.elements.container.setAttribute(\"tabindex\", \"-1\");\r\n\t\t\t// ensure proper desctruction\r\n\t\t\tthis.attachEvent(\"onDestroy\", function(){\r\n\t\t\t\tif (this._player){\r\n\t\t\t\t\tthis._player.destroy();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis._waitView.resolve(this._player);\r\n\r\n\t\t\tthis._player.on(\"canplay\", webix.bind(function(){\r\n\t\t\t\tif (this._player.media){\r\n\t\t\t\t\t// prevent focusing on media tag outside the expected UI\r\n\t\t\t\t\tthis._player.media.setAttribute(\"tabindex\", \"-1\");\t\r\n\t\t\t\t\tthis._normalizeRatio();\r\n\t\t\t\t}\r\n\t\t\t}, this));\r\n\t\t\tthis._player.on(\"ready\", webix.bind(function(){\r\n\t\t\t\tif (this.$view){\r\n\t\t\t\t\t// allow width less than 200px\r\n\t\t\t\t\tthis.$view.querySelector(\".plyr--full-ui\").style[\"min-width\"] = \"0px\";\t\t\t\r\n\t\t\t\t\tthis._normalizeRatio();\r\n\t\t\t\t}\r\n\t\t\t}, this));\t\t\t\r\n\t\t}\r\n\t},\r\n\t$setSize:function(x,y){\r\n\t\tthis.$view.firstChild.style.width = x+\"px\";\r\n\t\tthis.$view.firstChild.style.height = (y-2)+\"px\";\r\n\t\tif (this._player)\r\n\t\t\tthis._normalizeRatio(x, y);\r\n\t},\r\n\tsource_setter:function(value){\r\n\t\tthis._waitView.then(function(player){\r\n\t\t\tif (value)\r\n\t\t\t\tplayer.source = value;\r\n\t\t});\r\n\t},\r\n\tgetPlyr:function(wait){\r\n\t\treturn wait ? this._waitView : this._player;\r\n\t},\r\n\t_gcdRatio:function(x, y){\r\n\t\tx = Math.abs(x);\r\n\t\ty = Math.abs(y);\r\n\t\twhile(y) {\r\n\t\t\tvar t = y;\r\n\t\t\ty = x % y;\r\n\t\t\tx = t;\r\n\t\t}\r\n\t\treturn x;\r\n\t},\r\n\t_normalizeRatio:function(x, y){\r\n\t\tif (this.$view){\r\n\t\t\tx = x || this.$view.clientWidth;\r\n\t\t\ty = y || this.$view.clientHeight;\r\n\t\t\tvar div = this._gcdRatio(x, y),\r\n\t\t\t\tratioX = (x/div).toString(),\r\n\t\t\t\tratioY = (y/div).toString(),\r\n\t\t\t\tratio = ratioX+\":\"+ratioY;\t\t\t\r\n\t\t\tthis._player.ratio = ratio;\r\n\t\t}\r\n\t}\r\n}, webix.ui.view, webix.EventSystem);","import { JetView } from \"webix-jet\";\nimport \"@wbx/view-plyr\";\n\nexport default class MediaPreview extends JetView {\n\tconfig() {\n\t\treturn {\n\t\t\trows: [\n\t\t\t\t{\n\t\t\t\t\tlocalId: \"albumArt\",\n\t\t\t\t\thidden: true,\n\t\t\t\t\tcss: \"webix_fmanager_preview\",\n\t\t\t\t\ttemplate: ``,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tview: \"plyr-player\",\n\t\t\t\t\tcss: \"webix_fmanager_player\",\n\t\t\t\t\tlocalId: \"player\",\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tcontrols: [\n\t\t\t\t\t\t\t\"play-large\",\n\t\t\t\t\t\t\t\"play\",\n\t\t\t\t\t\t\t\"progress\",\n\t\t\t\t\t\t\t\"current-time\",\n\t\t\t\t\t\t\t\"mute\",\n\t\t\t\t\t\t\t\"volume\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\tinit() {\n\t\tconst node = this.$$(\"albumArt\").$view;\n\t\twebix.event(node, \"dblclick\", () => {\n\t\t\tconst info = this.getParam(\"info\");\n\t\t\tthis.app.callEvent(\"app:action\", [\"open\", [info]]);\n\t\t});\n\t}\n\turlChange() {\n\t\tconst info = this.getParam(\"info\");\n\t\tthis.ShowPreview(info);\n\t}\n\tShowPreview(info) {\n\t\tif (!info) return;\n\n\t\tconst url = this.app.getService(\"backend\").directLink(info.id);\n\t\tthis.SetMedia(url, info.type, info.$ext);\n\n\t\tconst art = this.$$(\"albumArt\");\n\t\tconst player = this.$$(\"player\");\n\t\tif (info.type === \"audio\") {\n\t\t\tplayer.config.height = 52;\n\t\t\tart.show();\n\t\t} else {\n\t\t\tplayer.config.height = 0;\n\t\t\tart.hide();\n\t\t}\n\t}\n\tSetMedia(src, type, ext) {\n\t\tconst player = this.$$(\"player\");\n\n\t\tplayer.define({\n\t\t\tsource: {\n\t\t\t\ttype,\n\t\t\t\tsources: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsrc,\n\t\t\t\t\t\ttype: `${type}/${ext}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t}\n}\n","import { JetView } from \"webix-jet\";\n\nexport default class TemplatePreview extends JetView {\n\tconfig() {\n\t\treturn {\n\t\t\tview: \"template\",\n\t\t\tlocalId: \"preview\",\n\t\t\tcss: \"webix_fmanager_preview\",\n\t\t};\n\t}\n\tinit() {\n\t\tconst node = this.getRoot().$view;\n\t\twebix.event(node, \"dblclick\", () => {\n\t\t\tconst info = this.getParam(\"info\");\n\t\t\tif (info.type === \"code\" && this.app.config.editor) {\n\t\t\t\tthis.app.callEvent(\"app:action\", [\"edit\", [info]]);\n\t\t\t} else if (info.type !== \"folder\" && info.type !== \"empty\") {\n\t\t\t\tthis.app.callEvent(\"app:action\", [\"open\", [info]]);\n\t\t\t}\n\t\t});\n\t}\n\turlChange() {\n\t\tconst info = this.getParam(\"info\");\n\t\tthis.ShowPreview(info);\n\t}\n\tShowPreview(info) {\n\t\tconst preview = this.$$(\"preview\");\n\n\t\tif (info.type === \"folder\") {\n\t\t\tpreview.setHTML(\n\t\t\t\t``\n\t\t\t);\n\t\t} else if (info.type === \"empty\") {\n\t\t\tpreview.setHTML(\n\t\t\t\t``\n\t\t\t);\n\t\t} else {\n\t\t\tlet origin = this.app.getService(\"backend\").previewURL(info, 464, 407);\n\t\t\tpreview.setHTML(\n\t\t\t\t``\n\t\t\t);\n\t\t}\n\t}\n}\n","import { JetView } from \"webix-jet\";\nimport { createState } from \"jet-restate\";\nimport { iterateAsync } from \"../helpers/common\";\n\nexport default class ProgressView extends JetView {\n\tconfig() {\n\t\tthis.Config = this.getParam(\"config\");\n\n\t\treturn {\n\t\t\tview: \"window\",\n\t\t\tposition: \"center\",\n\t\t\tmodal: true,\n\t\t\tcss: \"webix_fmanager_progress\",\n\t\t\thead: {\n\t\t\t\ttemplate: this.Config.head,\n\t\t\t\tcss: \"webix_fmanager_progress_head\",\n\t\t\t\theight: 54,\n\t\t\t},\n\t\t\tbody: {\n\t\t\t\tpadding: { top: 0, bottom: 20, left: 20, right: 20 },\n\t\t\t\tmargin: 10,\n\t\t\t\trows: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttemplate: obj =>\n\t\t\t\t\t\t\t`
\n
${obj.done} of ${obj.total} items
\n
${obj.file}
`,\n\t\t\t\t\t\tlocalId: \"counter\",\n\t\t\t\t\t\tborderless: true,\n\t\t\t\t\t\theight: 59,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tview: \"button\",\n\t\t\t\t\t\tvalue: \"Stop\",\n\t\t\t\t\t\tcss: \"webix_fmanager_progress_cancel\",\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\tthis.State.cancel = true;\n\t\t\t\t\t\t\tthis.getRoot().disable();\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t}\n\tinit() {\n\t\tthis.WaitClose = webix.promise.defer();\n\t\tthis.Counter = this.$$(\"counter\");\n\n\t\tthis.Counter.setValues({\n\t\t\tdone: 0,\n\t\t\ttotal: this.Config.files.length,\n\t\t\tfile: this.Config.files[0],\n\t\t});\n\t\twebix.extend(this.Counter, webix.ProgressBar);\n\n\t\tthis.State = createState({ i: 0, cancel: false });\n\t\titerateAsync(this.Config.files, this.Config.code, this.State).finally(() =>\n\t\t\tthis.Close()\n\t\t);\n\n\t\tthis.on(this.State.$changes, \"i\", i => this.Step(i + 1));\n\t}\n\tClose() {\n\t\tthis.Counter.showProgress({ type: \"bottom\", position: 1, delay: 100 });\n\t\t// FIXME - _hidden\n\t\tthis.show(\"_blank\", { target: \"popup\" });\n\t\tthis.WaitClose.resolve();\n\t}\n\tStep(i) {\n\t\tlet done = this.Counter.getValues().done;\n\t\tthis.Counter.setValues({ done: i, file: this.Config.files[i - 1] }, true);\n\n\t\tdone = (done + 1) / this.Config.files.length;\n\t\tthis.Counter.showProgress({\n\t\t\ttype: \"bottom\",\n\t\t\tposition: Math.min(1, done),\n\t\t\tdelay: 100,\n\t\t});\n\t}\n}\n","webix.protoUI(\n\t{\n\t\tname: \"r-layout\",\n\t\tsizeTrigger(width, handler, value) {\n\t\t\tthis._compactValue = value;\n\t\t\tthis._compactWidth = width;\n\t\t\tthis._compactHandler = handler;\n\n\t\t\tthis._checkTrigger(this.$view.width, value);\n\t\t},\n\t\t_checkTrigger(x, value) {\n\t\t\tif (this._compactWidth) {\n\t\t\t\tif (\n\t\t\t\t\t(x <= this._compactWidth && !value) ||\n\t\t\t\t\t(x > this._compactWidth && value)\n\t\t\t\t) {\n\t\t\t\t\tthis._compactWidth = null;\n\t\t\t\t\tthis._compactHandler(!value);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t$setSize(x, y) {\n\t\t\tif (this._checkTrigger(x, this._compactValue))\n\t\t\t\treturn webix.ui.layout.prototype.$setSize.call(this, x, y);\n\t\t},\n\t},\n\twebix.ui.layout\n);\n","import { JetView } from \"webix-jet\";\nimport { cardMode, gridMode, doubleMode } from \"../helpers/icons\";\nimport { capitalize } from \"../helpers/common\";\nimport hotkey from \"jet-hotkey\";\n\nexport default class TopBarView extends JetView {\n\tconfig() {\n\t\tconst compact = this.getParam(\"compact\");\n\t\tconst skin = webix.skin.$active;\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\tconst bar = {\n\t\t\tview: \"toolbar\",\n\t\t\theight: skin.toolbarHeight + 12,\n\t\t\tmargin: 20,\n\t\t\tpaddingY: 9,\n\t\t\tpaddingX: 12,\n\t\t\tcols: [\n\t\t\t\t{\n\t\t\t\t\tview: \"icon\",\n\t\t\t\t\ticon: \"webix_fmanager_icon fmi-file-tree\",\n\t\t\t\t\tclick: () => this.app.callEvent(\"app:action\", [\"toggle-folders\"]),\n\t\t\t\t\thidden: !compact,\n\t\t\t\t},\n\t\t\t\t{ view: \"label\", label: _(\"Files\"), autowidth: true, hidden: compact },\n\t\t\t\t{\n\t\t\t\t\tview: \"search\",\n\t\t\t\t\twidth: compact ? 0 : 300,\n\t\t\t\t\tlocalId: \"search\",\n\t\t\t\t\tplaceholder: _(\"Search files and folders\"),\n\t\t\t\t},\n\t\t\t\t{ hidden: compact },\n\t\t\t\t{\n\t\t\t\t\tview: \"toggle\",\n\t\t\t\t\tcss: \"webix_fmanager_preview_toggle\",\n\t\t\t\t\ttype: \"icon\",\n\t\t\t\t\ticon: \"wxi-eye\",\n\t\t\t\t\ttooltip: _(\"Preview\"),\n\t\t\t\t\twidth: skin.toolbarHeight < 37 ? 48 : 60,\n\t\t\t\t\tlocalId: \"previewMode\",\n\t\t\t\t\tclick: () => this.app.callEvent(\"app:action\", [\"toggle-preview\"]),\n\t\t\t\t\thidden: compact,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tview: \"segmented\",\n\t\t\t\t\twidth: 124,\n\t\t\t\t\toptionWidth: 40,\n\t\t\t\t\tlocalId: \"modes\",\n\t\t\t\t\ttooltip: conf => {\n\t\t\t\t\t\tswitch (conf.id) {\n\t\t\t\t\t\t\tcase \"grid\":\n\t\t\t\t\t\t\t\treturn _(\"Table\");\n\t\t\t\t\t\t\tcase \"cards\":\n\t\t\t\t\t\t\t\treturn _(\"Cards\");\n\t\t\t\t\t\t\tcase \"double\":\n\t\t\t\t\t\t\t\treturn _(\"Total\");\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\treturn capitalize(conf.id + \"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ value: gridMode, id: \"grid\" },\n\t\t\t\t\t\t{ value: cardMode, id: \"cards\" },\n\t\t\t\t\t\t{ value: doubleMode, id: \"double\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\treturn bar;\n\t}\n\n\tinit() {\n\t\tconst common = this.getParam(\"state\");\n\t\tconst modes = this.$$(\"modes\");\n\n\t\tmodes.attachEvent(\"onChange\", v => {\n\t\t\tif (v) {\n\t\t\t\tcommon.$batch({\n\t\t\t\t\tmode: v,\n\t\t\t\t\tsearch: \"\",\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthis.on(common.$changes, \"mode\", v => {\n\t\t\tif (modes.getOption(v)) modes.setValue(v);\n\t\t\telse modes.setValue();\n\t\t});\n\n\t\tconst search = this.$$(\"search\");\n\t\tsearch.attachEvent(\"onTimedKeyPress\", () => {\n\t\t\tcommon.search = search.getValue().trim();\n\t\t});\n\n\t\tthis.on(common.$changes, \"search\", s => {\n\t\t\ts = s.trim();\n\t\t\tsearch.setValue(s);\n\t\t});\n\n\t\t// global hotkey to move focus to search input\n\t\tthis.on(hotkey(), `${webix.env.isMac ? \"COMMAND\" : \"CTRL\"} + F`, (v, e) => {\n\t\t\tsearch.focus();\n\t\t\twebix.html.preventEvent(e);\n\t\t});\n\t}\n}\n","import { JetView } from \"webix-jet\";\n\nimport \"../helpers/responsive\";\n\nimport TopBar from \"./topbar\";\nimport FoldersTree from \"./folders\";\n\nimport SideTreeView from \"./mobile/sidetree\";\nimport PreviewPopupView from \"./mobile/previewpopup\";\n\nexport default class TopView extends JetView {\n\tconfig() {\n\t\tconst fCompact = this.getParam(\"forceCompact\");\n\t\tif (typeof fCompact !== \"undefined\") this.setParam(\"compact\", fCompact);\n\t\tthis.Compact = this.getParam(\"compact\");\n\n\t\tconst tree = {\n\t\t\tview: \"proxy\",\n\t\t\tlocalId: \"tree\",\n\t\t\twidth: 240,\n\t\t\tminWidth: 240,\n\t\t\tmaxWidth: 400,\n\t\t\thidden: true,\n\t\t\tborderless: true,\n\t\t\tbody: FoldersTree,\n\t\t};\n\n\t\tconst panels = {\n\t\t\ttype: \"wide\",\n\t\t\tcols: [\n\t\t\t\t{ $subview: true, name: \"center\", branch: true },\n\t\t\t\t{\n\t\t\t\t\tview: \"proxy\",\n\t\t\t\t\tborderless: true,\n\t\t\t\t\twidth: 470,\n\t\t\t\t\thidden: true,\n\t\t\t\t\tlocalId: \"r-side\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\t$subview: \"\",\n\t\t\t\t\t\tbranch: true,\n\t\t\t\t\t\tname: \"r-side\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tif (!this.Compact) panels.cols.unshift(tree, { view: \"resizer\" });\n\n\t\treturn {\n\t\t\tview: typeof fCompact === \"undefined\" ? \"r-layout\" : \"layout\",\n\t\t\ttype: \"wide\",\n\t\t\trows: [TopBar, panels, { $subview: true, popup: true, name: \"popup\" }],\n\t\t};\n\t}\n\tinit() {\n\t\t// responsive UI\n\t\tconst root = this.getRoot();\n\t\tif (root.sizeTrigger)\n\t\t\troot.sizeTrigger(\n\t\t\t\tthis.app.config.compactWidth,\n\t\t\t\tmode => this.SetCompactMode(mode),\n\t\t\t\t!!this.Compact\n\t\t\t);\n\n\t\tconst state = this.getParam(\"state\");\n\t\tthis.State = state;\n\n\t\tif (this.Compact) {\n\t\t\tthis.Tree = { show: dummy, hide: dummy };\n\t\t\tthis.SideTree = this.ui(SideTreeView);\n\t\t\tthis.PreviewPopup = this.ui(PreviewPopupView);\n\t\t} else {\n\t\t\tthis.Tree = this.$$(\"tree\");\n\t\t}\n\n\t\tthis.on(this.app, \"app:action\", name => {\n\t\t\tswitch (name) {\n\t\t\t\tcase \"toggle-preview\":\n\t\t\t\t\tthis.TogglePreview();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"toggle-folders\":\n\t\t\t\t\tthis.ToggleFolders();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\tthis.on(state.$changes, \"mode\", (v, o) => this.ShowMode(v, o));\n\t\tthis.on(state.$changes, \"search\", v => this.ShowSearch(v));\n\n\t\tthis.app\n\t\t\t.getService(\"progress\")\n\t\t\t.handle(this.getRoot(), this.ShowProgress.bind(this));\n\t}\n\n\tShowMode(v, o) {\n\t\tconst params = { state: this.getParam(\"state\"), compact: this.Compact };\n\t\tif (v === \"grid\") {\n\t\t\tthis.Tree.show();\n\t\t\tthis.show(\"panel/list\", {\n\t\t\t\ttarget: \"center\",\n\t\t\t\tparams,\n\t\t\t});\n\t\t} else if (v === \"cards\") {\n\t\t\tthis.Tree.show();\n\t\t\tthis.show(\"panel/cards\", {\n\t\t\t\ttarget: \"center\",\n\t\t\t\tparams,\n\t\t\t});\n\t\t} else if (v === \"double\") {\n\t\t\tthis.Tree.hide();\n\t\t\tthis.show(\"panel-double\", {\n\t\t\t\ttarget: \"center\",\n\t\t\t\tparams,\n\t\t\t});\n\t\t} else if (v === \"search\") {\n\t\t\tthis.Tree.hide();\n\t\t\tthis.PrevMode = this.PrevMode || o;\n\t\t\tthis.show(\"panel-search/cards\", {\n\t\t\t\ttarget: \"center\",\n\t\t\t\tparams,\n\t\t\t});\n\t\t}\n\t}\n\n\tShowProgress(params) {\n\t\treturn this.show(\"./progress\", {\n\t\t\ttarget: \"popup\",\n\t\t\tparams,\n\t\t}).then(() => this.getSubView(\"popup\"));\n\t}\n\n\tTogglePreview() {\n\t\tif (!this.Compact) {\n\t\t\t// invert value, to get new mode\n\t\t\tconst side = this.$$(\"r-side\");\n\n\t\t\tif (!side.isVisible()) {\n\t\t\t\tthis.show(\"preview\", {\n\t\t\t\t\ttarget: \"r-side\",\n\t\t\t\t\tparams: { state: this.State },\n\t\t\t\t});\n\t\t\t\tside.show();\n\t\t\t} else {\n\t\t\t\tthis.show(\"_blank\", { target: \"r-side\" });\n\t\t\t\tside.hide();\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.PreviewPopup.IsVisible()) {\n\t\t\t\tthis.PreviewPopup.Show({ state: this.State });\n\t\t\t} else {\n\t\t\t\tthis.PreviewPopup.Hide();\n\t\t\t}\n\t\t}\n\t}\n\n\tToggleFolders() {\n\t\tif (!this.SideTree.IsVisible()) {\n\t\t\tthis.SideTree.Show();\n\t\t}\n\t}\n\n\tShowSearch(value) {\n\t\tif (value) {\n\t\t\tthis.State.mode = \"search\";\n\t\t} else {\n\t\t\tif (this.State.mode === \"search\")\n\t\t\t\tthis.State.mode = this.PrevMode || \"grid\";\n\t\t\tthis.PrevMode = \"\";\n\t\t}\n\t}\n\n\tSetCompactMode(mode) {\n\t\tthis.setParam(\"compact\", mode);\n\t\tthis.refresh();\n\t}\n}\n\nfunction dummy() {}\n","import m0 from \"views/cards\";\nimport m1 from \"views/editor\";\nimport m2 from \"views/folders\";\nimport m3 from \"views/list\";\nimport m4 from \"views/menus/addnewmenu\";\nimport m5 from \"views/menus/contextmenu\";\nimport m6 from \"views/menus/menubody\";\nimport m7 from \"views/mobile/previewpopup\";\nimport m8 from \"views/mobile/sidetree\";\nimport m9 from \"views/panel-double\";\nimport m10 from \"views/panel-search\";\nimport m11 from \"views/panel\";\nimport m12 from \"views/preview/index.js\";\nimport m13 from \"views/preview/info\";\nimport m14 from \"views/preview/media\";\nimport m15 from \"views/preview/template\";\nimport m16 from \"views/progress\";\nimport m17 from \"views/sections/dataview\";\nimport m18 from \"views/top\";\nimport m19 from \"views/topbar\";\nimport { JetView } from \"webix-jet\";\n\nconst views = { JetView };\nviews[\"cards\"] = m0;\nviews[\"editor\"] = m1;\nviews[\"folders\"] = m2;\nviews[\"list\"] = m3;\nviews[\"menus/addnewmenu\"] = m4;\nviews[\"menus/contextmenu\"] = m5;\nviews[\"menus/menubody\"] = m6;\nviews[\"mobile/previewpopup\"] = m7;\nviews[\"mobile/sidetree\"] = m8;\nviews[\"panel-double\"] = m9;\nviews[\"panel-search\"] = m10;\nviews[\"panel\"] = m11;\nviews[\"preview\"] = m12;\nviews[\"preview/info\"] = m13;\nviews[\"preview/media\"] = m14;\nviews[\"preview/template\"] = m15;\nviews[\"progress\"] = m16;\nviews[\"sections/dataview\"] = m17;\nviews[\"top\"] = m18;\nviews[\"topbar\"] = m19;\n\nexport default views;\n","export default class Backend {\n\tconstructor(app, url) {\n\t\tthis.app = app;\n\t\tthis._url = url;\n\t\tthis._features = { preview: {}, meta: {} };\n\t}\n\n\turl(path) {\n\t\treturn this._url + path;\n\t}\n\n\tsearch(id, search) {\n\t\tid = id || \"/\";\n\t\treturn this._files(this.url(\"files\"), { id, search });\n\t}\n\n\tfiles(id) {\n\t\tid = id || \"/\";\n\t\treturn this._files(this.url(\"files\"), { id });\n\t}\n\n\t_files(url, params) {\n\t\tconst data = webix.ajax(url, params).then(res => res.json());\n\t\treturn this.getInfo().then(() => data);\n\t}\n\n\tfolders(id) {\n\t\tid = id || \"/\";\n\t\tconst data = webix.ajax(this.url(\"folders\"), { id });\n\t\treturn data.then(a => a.json());\n\t}\n\n\ticon(obj, size) {\n\t\treturn this.url(`icons/${size || \"small\"}/${obj.type}/${obj.$ext}.svg`);\n\t}\n\n\tupload() {\n\t\treturn this.url(\"upload\");\n\t}\n\n\treadText(id) {\n\t\treturn webix.ajax(this.url(\"text\"), { id }).then(data => data.text());\n\t}\n\n\twriteText(id, content) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"text\"), {\n\t\t\t\tid,\n\t\t\t\tcontent,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tdirectLink(id, download) {\n\t\treturn this.url(\n\t\t\t`direct?id=${encodeURIComponent(id)}${download ? \"&download=true\" : \"\"}`\n\t\t);\n\t}\n\n\tpreviewURL(obj, width, height) {\n\t\tif (!this._features.preview[obj.type]) return this.icon(obj, \"big\");\n\n\t\treturn this.url(\n\t\t\t`preview?width=${width}&height=${height}&id=${encodeURIComponent(obj.id)}`\n\t\t);\n\t}\n\n\tremove(id) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"delete\"), {\n\t\t\t\tid,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tmakedir(id, name) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"makedir\"), {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tmakefile(id, name) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"makefile\"), {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tcopy(id, to) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"copy\"), {\n\t\t\t\tid,\n\t\t\t\tto,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tmove(id, to) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"move\"), {\n\t\t\t\tid,\n\t\t\t\tto,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\trename(id, name) {\n\t\treturn webix\n\t\t\t.ajax()\n\t\t\t.post(this.url(\"rename\"), {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tgetRootName() {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\treturn _(\"My Files\");\n\t}\n\n\tgetMeta(obj) {\n\t\tif (!this._features.meta[obj.type]) return false;\n\n\t\treturn webix\n\t\t\t.ajax(this.url(\"meta\"), {\n\t\t\t\tid: obj.id,\n\t\t\t})\n\t\t\t.then(r => r.json());\n\t}\n\n\tgetInfo(force) {\n\t\t// cache global info\n\t\tif (this._info && !force) return this._info;\n\n\t\treturn (this._info = webix.ajax(this.url(\"info\")).then(resp => {\n\t\t\tresp = resp.json();\n\t\t\tthis._features = resp.features;\n\t\t\treturn resp;\n\t\t}));\n\t}\n}\n","export default class Cache {\n\tconstructor(limit) {\n\t\tthis._store = new Map();\n\t\tthis._limit = limit;\n\t\tthis._i = 1;\n\t}\n\teach(code) {\n\t\tthis._store.forEach(a => code(a.obj));\n\t}\n\tset(key, obj) {\n\t\tif (this._store.size >= this._limit) this.prune();\n\n\t\tthis._store.set(key, {\n\t\t\tobj,\n\t\t\tkey,\n\t\t\tt: this._i++,\n\t\t});\n\t}\n\tget(key) {\n\t\tconst rec = this._store.get(key);\n\t\tif (!rec) return null;\n\n\t\trec.t = this._i++;\n\t\treturn rec.obj;\n\t}\n\tprune() {\n\t\tlet temp = [];\n\t\tthis._store.forEach(a => temp.push(a));\n\t\ttemp = temp.sort((a, b) => (a.t > b.t ? -1 : 1));\n\t\tfor (var i = Math.floor(this._limit / 2); i < temp.length; i++) {\n\t\t\tthis._store.delete(temp[i].key);\n\t\t}\n\t}\n\tdelete(key) {\n\t\tif (this._store.has(key)) this._store.delete(key);\n\t}\n\tclear() {\n\t\tthis._store.clear();\n\t}\n}\n","import Cache from \"./Cache\";\nimport { ext } from \"helpers/common\";\n\nexport default class LocalData {\n\tconstructor(app, size) {\n\t\tthis.app = app;\n\t\tthis.fscache = new Cache(size);\n\t\tthis.hierarchy = new webix.TreeCollection();\n\t\tthis.folders_ready = null;\n\t}\n\n\tdefaultDir(id) {\n\t\tconst dir = [];\n\t\tif (id !== \"/\")\n\t\t\tdir.push({\n\t\t\t\ttype: \"folder\",\n\t\t\t\tvalue: \"..\",\n\t\t\t\t$row: (obj, common) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tcommon.backIcon() +\n\t\t\t\t\t\t`${common.backLabel()}`\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\t\treturn dir;\n\t}\n\n\tfiles(path, sync) {\n\t\tlet fs = this.fscache.get(path);\n\t\tif (sync) return fs;\n\t\tif (fs) return Promise.resolve(fs);\n\n\t\tfs = new webix.DataCollection({\n\t\t\tscheme: {\n\t\t\t\t$change: this.prepareData,\n\t\t\t\t$serialize: this.serializeData,\n\t\t\t},\n\t\t});\n\t\tthis.fscache.set(path, fs);\n\t\treturn this.reload(fs, path);\n\t}\n\n\tserializeData(a) {\n\t\tif (a.value == \"..\") return false;\n\t\telse {\n\t\t\tconst o = {};\n\t\t\tfor (let f in a) {\n\t\t\t\tif (f.indexOf(\"$\") !== 0) o[f] = a[f];\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t}\n\n\tprepareData(a) {\n\t\tif (typeof a.date === \"number\") a.date = new Date(a.date * 1000);\n\n\t\tif (a.type === \"folder\") a.$css = a.type;\n\t\telse a.$ext = ext(a.value);\n\t}\n\n\treload(fs, path) {\n\t\treturn this.app\n\t\t\t.getService(\"backend\")\n\t\t\t.files(path)\n\t\t\t.then(data => {\n\t\t\t\tfs.clearAll();\n\t\t\t\tfs.parse(this.defaultDir(path).concat(data));\n\t\t\t\treturn fs;\n\t\t\t});\n\t}\n\n\trefresh(path) {\n\t\tconst fs = this.fscache.get(path);\n\t\tif (fs) return this.reload(fs, path);\n\t}\n\n\taddFile(id, item) {\n\t\tvar fs = this.fscache.get(id);\n\n\t\tif (fs) {\n\t\t\tif (!fs.exists(item.id)) {\n\t\t\t\tfs.add(item, this.getFsPosition(fs, item));\n\t\t\t}\n\t\t}\n\n\t\tif (item.type === \"folder\") {\n\t\t\tif (id === \"/\") id = \"../files\";\n\t\t\tthis.hierarchy.add(item, null, id);\n\t\t}\n\t}\n\n\tgetFsPosition(fs, item) {\n\t\tif (item.type !== \"folder\") return -1;\n\n\t\tconst d = fs.data;\n\t\treturn d.order.findIndex(a => d.getItem(a).type !== \"folder\");\n\t}\n\n\tdeleteFile(item) {\n\t\tconst { fscache, hierarchy } = this;\n\n\t\tfscache.each(fs => {\n\t\t\tif (fs && fs.exists(item)) fs.remove(item);\n\t\t});\n\n\t\tfscache.delete(item);\n\n\t\tif (hierarchy.exists(item)) hierarchy.remove(item);\n\t}\n\n\tupdateFile(oldId, data, newId) {\n\t\tconst hierarchy = this.hierarchy;\n\n\t\tthis.fscache.each(fs => {\n\t\t\tif (fs && fs.exists(oldId)) {\n\t\t\t\tfs.updateItem(oldId, data);\n\t\t\t\tif (newId && oldId != newId) fs.data.changeId(oldId, newId);\n\t\t\t}\n\t\t});\n\n\t\tif (hierarchy.exists(oldId)) {\n\t\t\thierarchy.updateItem(oldId, data);\n\t\t\tif (newId && oldId != newId) {\n\t\t\t\thierarchy.data.changeId(oldId, newId);\n\t\t\t}\n\t\t}\n\t}\n\n\tdefaultTree() {\n\t\treturn [{ value: \"My Files\", id: \"../files\", open: true }];\n\t}\n\n\tfolders(force) {\n\t\tconst hierarchy = this.hierarchy;\n\n\t\tif (force || !this.folders_ready) {\n\t\t\tthis.folders_ready = this.app\n\t\t\t\t.getService(\"backend\")\n\t\t\t\t.folders()\n\t\t\t\t.then(data => {\n\t\t\t\t\thierarchy.clearAll();\n\t\t\t\t\thierarchy.parse(this.defaultTree());\n\t\t\t\t\thierarchy.parse({ parent: \"../files\", data });\n\n\t\t\t\t\treturn hierarchy;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this.folders_ready;\n\t}\n}\n","export default class UploadHandler {\n\tconstructor(app, state) {\n\t\tthis.initUploader(app);\n\t\tthis.initEvents(app, state);\n\t}\n\n\tinitEvents(app, state) {\n\t\tapp.attachEvent(\"app:action\", (name, info) => {\n\t\t\tif (name == \"upload\") {\n\t\t\t\tinfo = info || (state.path || \"/\");\n\t\t\t\tapp.getService(\"upload\").fileDialog(info);\n\t\t\t}\n\t\t});\n\t}\n\n\tinitUploader(app) {\n\t\tthis.uploader = webix.ui({\n\t\t\tview: \"uploader\",\n\t\t\tapiOnly: true,\n\t\t\tupload: app.getService(\"backend\").upload(),\n\t\t\ton: {\n\t\t\t\tonAfterFileAdd: function(item) {\n\t\t\t\t\titem.urlData = this.config.tempUrlData;\n\t\t\t\t},\n\t\t\t\tonFileUpload: (file, res) => {\n\t\t\t\t\tapp.getService(\"local\").addFile(file.urlData.id, res);\n\t\t\t\t},\n\t\t\t\tonUploadComplete: () => {\n\t\t\t\t\tapp.getService(\"progress\").end();\n\t\t\t\t\tapp.callEvent(\"reload:fs:stats\", []);\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tthis.uploader.$updateProgress = function(_, percent) {\n\t\t\tapp.getService(\"progress\").start(percent / 100);\n\t\t};\n\t}\n\n\tgetUploader() {\n\t\treturn this.uploader;\n\t}\n\n\tfileDialog(id) {\n\t\tthis.uploader.config.tempUrlData = { id };\n\t\tthis.uploader.fileDialog();\n\t}\n}\n","export default class Progress {\n\tconstructor() {\n\t\tthis.view = null;\n\t\tthis.popup = null;\n\t}\n\n\thandle(view, popup) {\n\t\tthis.view = view;\n\t\twebix.extend(view, webix.ProgressBar);\n\n\t\tthis.popup = popup;\n\t}\n\n\tstart(size) {\n\t\tconst view = this.view;\n\t\tif (!view || view.$destructed) return;\n\n\t\tview.showProgress({\n\t\t\ttype: \"top\",\n\t\t\tdelay: 3000,\n\t\t\thide: true,\n\t\t\tprogress: size || 0,\n\t\t});\n\t}\n\n\tend() {\n\t\tconst view = this.view;\n\t\tif (!view || view.$destructed) return;\n\n\t\tview.hideProgress();\n\t}\n\n\tfiles(head, files, code) {\n\t\tif (!files.length) return;\n\t\tif (files.length == 1) {\n\t\t\tthis.start();\n\t\t\treturn code(files[0], 0).finally(() => this.end());\n\t\t}\n\n\t\tif (this.popup)\n\t\t\treturn this.popup({\n\t\t\t\tconfig: { head, files, code },\n\t\t\t}).then(popup => popup.WaitClose);\n\t}\n}\n","import { prompt } from \"../helpers/prompt\";\nimport { fileNameSelectMask, safeName } from \"../helpers/common\";\n\nexport default class Operations {\n\t/**\n\t * @constructor\n\t * @param {Object} app - the Jet app\n\t * @param {Object} state - the reactive state\n\t */\n\tconstructor(app, state) {\n\t\tthis.app = app;\n\t\tthis.state = state;\n\n\t\tthis.initEvents();\n\t}\n\n\t/**\n\t * Returns the Backend service\n\t * @returns {Object}\n\t */\n\tbackend() {\n\t\treturn this.app.getService(\"backend\");\n\t}\n\n\t/**\n\t * Returns the Local service\n\t * @returns {Object}\n\t */\n\tlocal() {\n\t\treturn this.app.getService(\"local\");\n\t}\n\n\t/**\n\t * Adds event handlers to app actions\n\t */\n\tinitEvents() {\n\t\tthis.app.attachEvent(\"app:action\", (name, info) => {\n\t\t\tswitch (name) {\n\t\t\t\tcase \"open\":\n\t\t\t\t\tthis.open(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"download\":\n\t\t\t\t\tthis.download(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"edit\":\n\t\t\t\t\tthis.edit(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.remove(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"makefile\":\n\t\t\t\t\tthis.makeFile(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"makedir\":\n\t\t\t\t\tthis.makeFolder(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"rename\":\n\t\t\t\t\tthis.rename(info);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"copy\":\n\t\t\t\tcase \"cut\":\n\t\t\t\t\tthis.addToClipboard(name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"paste\":\n\t\t\t\t\tthis.paste();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"locate\":\n\t\t\t\t\tthis.goUp(info);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Saves new content to a text file\n\t * @param {string} id - the ID of a text file\n\t * @param {string} content - the new content of the file\n\t * @returns {Promise} that resolves with a file data object\n\t */\n\twrite(id, content) {\n\t\treturn this.backend()\n\t\t\t.writeText(id, content)\n\t\t\t.then(data =>\n\t\t\t\tthis.local().updateFile(id, { size: data.size, date: data.date })\n\t\t\t);\n\t}\n\n\t/**\n\t * Opens a text file and reads its contents\n\t * @param {string} id - the ID of a text file\n\t * @returns {Promise} that resolves with the contents of a text file (string)\n\t */\n\tread(id) {\n\t\treturn this.backend().readText(id);\n\t}\n\n\t/**\n\t * Creates a new file in the currently opened directory or in the root\n\t * @param {string} name - the name of the new file\n\t */\n\tmakeFile(name) {\n\t\tconst id = this.state.path || \"/\";\n\t\tthis.backend()\n\t\t\t.makefile(id, name)\n\t\t\t.then(res => {\n\t\t\t\tif (!res.invalid) this.local().addFile(id, res);\n\t\t\t});\n\t}\n\n\t/**\n\t * Creates a new folder in the currently opened directory or in the root\n\t * @param {string} name - the name of the folder\n\t */\n\tmakeFolder(name) {\n\t\tconst id = this.state.path || \"/\";\n\t\tthis.backend()\n\t\t\t.makedir(id, name)\n\t\t\t.then(res => {\n\t\t\t\tif (!res.invalid) this.local().addFile(id, res);\n\t\t\t});\n\t}\n\n\t/**\n\t * Opens the files in a text editor (files of type:\"code\")\n\t * @param {Array} files - an array of file data objects\n\t */\n\tedit(files) {\n\t\tconst state = this.state;\n\t\tif (!files) files = state.selectedItem;\n\t\tfiles = files.filter(file => file.type === \"code\");\n\t\tif (files.length) {\n\t\t\tthis.app.show(\"/editor\", {\n\t\t\t\tparams: {\n\t\t\t\t\tfiles,\n\t\t\t\t\tstate,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Opens files in new browser tabs\n\t * @param {Array} files - an array of file data objects\n\t */\n\topen(files) {\n\t\tif (!files) files = this.state.selectedItem;\n\t\tfor (let i = 0; i < files.length; ++i) {\n\t\t\tif (files[i].type != \"folder\") {\n\t\t\t\twindow.open(this.backend().directLink(files[i].id), \"_blank\");\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Downloads a file\n\t * @param {Array} files - an array with a file data object\n\t */\n\tdownload(files) {\n\t\tif (!files) files = this.state.selectedItem;\n\t\twindow.open(this.backend().directLink(files[0].id, true), \"_self\");\n\t}\n\n\t/**\n\t * Removes files and files forever\n\t * @param {Array} files - an array of folder/file data objects\n\t * @returns {Promise} - empty promise\n\t */\n\tremove(sfiles) {\n\t\tconst state = this.state;\n\n\t\tconst files = this.extractIds(sfiles || state.selectedItem);\n\t\tif (!files.length) return webix.promise.reject();\n\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\treturn webix\n\t\t\t.confirm({\n\t\t\t\ttitle: _(\"Delete files\"),\n\t\t\t\ttext: this.removeConfirmMessage(sfiles || state.selectedItem),\n\t\t\t\tcss: \"webix_fmanager_confirm\",\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\treturn this.app\n\t\t\t\t\t.getService(\"progress\")\n\t\t\t\t\t.files(_(\"Deleting...\"), files, f => {\n\t\t\t\t\t\treturn this.backend()\n\t\t\t\t\t\t\t.remove(f)\n\t\t\t\t\t\t\t.then(res => {\n\t\t\t\t\t\t\t\tif (!res.invalid) {\n\t\t\t\t\t\t\t\t\tthis.local().deleteFile(f);\n\t\t\t\t\t\t\t\t\tif (state.path === f) {\n\t\t\t\t\t\t\t\t\t\tstate.path = \"/\";\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t// reset inactive path in 'double'\n\t\t\t\t\t\t\t\t\tthis.app.callEvent(\"pathChanged\", [f, \"/\"]);\n\t\t\t\t\t\t\t\t\tthis.app.callEvent(\"reload:fs:stats\", []);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\t// relaunch search\n\t\t\t\tif (state.search) {\n\t\t\t\t\tstate.search = state.search + \" \";\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * Returns a message for a confirmation dialogue for file/folder removal\n\t * @param {Array} files - an array of file/folder data objects\n\t * @returns {string}\n\t */\n\tremoveConfirmMessage(files) {\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\tlet message = `
${_(\n\t\t\t\"Are you sure you want to delete\"\n\t\t)} ${files.length > 1 ? _(\"these items:\") : _(\"this item:\")}
`;\n\n\t\tlet i = 0;\n\t\tconst icon = \"● \";\n\t\tfor (const limit = files.length < 6 ? files.length : 5; i < limit; ++i) {\n\t\t\tmessage += `
${icon}${files[i].value}
`;\n\t\t}\n\t\tif (i < files.length) {\n\t\t\tmessage += `
${icon}${_(\"and\")} ${files.length - i} ${_(\n\t\t\t\t\"more file(s)\"\n\t\t\t)}
`;\n\t\t}\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Renames a file/folder\n\t * @param {Array} f - an array with a file/folder data object\n\t */\n\trename(f) {\n\t\tconst state = this.state;\n\t\tconst file = f ? f[0] : state.selectedItem[0];\n\t\tif (!file) return;\n\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\tconst oldId = file.id;\n\n\t\tprompt({\n\t\t\ttext: _(\"Enter a new name\"),\n\t\t\tbutton: _(\"Rename\"),\n\t\t\tvalue: file.value,\n\t\t\tselectMask: file.type !== \"folder\" ? fileNameSelectMask : null,\n\t\t}).then(name => {\n\t\t\tname = safeName(name);\n\t\t\tif (name && name !== file.value)\n\t\t\t\tthis.backend()\n\t\t\t\t\t.rename(oldId, name)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.local().updateFile(\n\t\t\t\t\t\t\toldId,\n\t\t\t\t\t\t\t{ value: res.id.split(\"/\").pop() },\n\t\t\t\t\t\t\tres.id\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (file.type === \"folder\")\n\t\t\t\t\t\t\tthis.reloadBranch(res.id).then(() => {\n\t\t\t\t\t\t\t\t// reset active path in 'list'/'cards' if folder was renamed\n\t\t\t\t\t\t\t\tif (state.path === oldId) {\n\t\t\t\t\t\t\t\t\tstate.path = res.id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// reset inactive path in 'double'\n\t\t\t\t\t\t\t\tthis.app.callEvent(\"pathChanged\", [oldId, res.id]);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// relaunch search\n\t\t\t\t\t\tif (state.search) {\n\t\t\t\t\t\t\tstate.search = state.search + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Reloads the contents of a directory\n\t * @param {string} id - the ID of a directory\n\t * @returns {Promise}\n\t */\n\treloadBranch(id) {\n\t\tconst hierarchy = this.local().hierarchy;\n\t\treturn this.app\n\t\t\t.getService(\"backend\")\n\t\t\t.folders(id)\n\t\t\t.then(data => {\n\t\t\t\tconst toRemove = [];\n\t\t\t\thierarchy.data.eachChild(id, obj => toRemove.push(obj.id));\n\t\t\t\thierarchy.parse({ parent: id, data });\n\t\t\t\thierarchy.remove(toRemove);\n\t\t\t});\n\t}\n\n\t/**\n\t * Copies files and folders to a target directory\n\t * @param {Array} files - an array of item IDs\n\t * @param {string} targetFolder - the ID of the target directory\n\t * @returns {Promise} - empty promise\n\t */\n\tcopy(files, targetFolder) {\n\t\tif (!files.length) return webix.promise.reject();\n\t\tconst local = this.local();\n\t\tconst _ = this.app.getService(\"locale\")._;\n\n\t\treturn this.app.getService(\"progress\").files(_(\"Copying...\"), files, f => {\n\t\t\treturn this.backend()\n\t\t\t\t.copy(f, targetFolder)\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (!res.invalid) {\n\t\t\t\t\t\tlocal.addFile(targetFolder, res);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Moves files and folders to a target directory\n\t * @param {Array} files - an array of item IDs\n\t * @param {string} targetFolder - the ID of the target directory\n\t * @returns {Promise} - empty promise\n\t */\n\tmove(files, targetFolder) {\n\t\tif (!files.length || !targetFolder) return webix.promise.reject();\n\t\tconst local = this.local();\n\n\t\t// prevent move to the existing location\n\t\tconst tfs = local.files(targetFolder, true);\n\t\tif (tfs) files = files.filter(a => !tfs.exists(a));\n\t\t// prevent moving folder into itself\n\t\tfiles = files.filter(a => a != targetFolder);\n\t\tif (!files.length) return webix.promise.reject();\n\n\t\tconst _ = this.app.getService(\"locale\")._;\n\t\treturn this.app.getService(\"progress\").files(_(\"Moving...\"), files, f => {\n\t\t\treturn this.backend()\n\t\t\t\t.move(f, targetFolder)\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (!res.invalid) {\n\t\t\t\t\t\tlocal.deleteFile(f);\n\t\t\t\t\t\tlocal.addFile(targetFolder, res);\n\n\t\t\t\t\t\tif (this.state.path === f) {\n\t\t\t\t\t\t\tthis.state.path = res.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// reset inactive path in 'double'\n\t\t\t\t\t\tthis.app.callEvent(\"pathChanged\", [f, res.id]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Returns file/folder IDs\n\t * @param {Array} files - an array of file/folder data objects\n\t * @returns {Array} - an array of IDs\n\t */\n\textractIds(files) {\n\t\tif (!files.length || typeof files[0] == \"string\") return files;\n\n\t\tconst ids = [];\n\t\tfor (let i = 0; i < files.length; ++i) {\n\t\t\t// for actions from context menu, filter out \"back to parent\"\n\t\t\tif (files[i].value !== \"..\") ids.push(files[i].id);\n\t\t}\n\t\treturn ids;\n\t}\n\t/**\n\t * Adds selected files and folders to the clipboard\n\t * @param {string} mode - \"cut\" or \"copy\"\n\t */\n\taddToClipboard(mode) {\n\t\tconst ids = this.extractIds(this.state.selectedItem);\n\t\tif (ids.length)\n\t\t\tthis.state.clipboard = {\n\t\t\t\tfiles: ids,\n\t\t\t\tmode: mode,\n\t\t\t};\n\t}\n\n\t/**\n\t * Clears the clipboard\n\t */\n\tclearClipboard() {\n\t\tthis.state.clipboard = null;\n\t}\n\n\t/**\n\t * Moves or copies files and folders from clipboard to the currently opened directory\n\t */\n\tpaste() {\n\t\tconst state = this.state;\n\n\t\tif (!state.clipboard) return;\n\n\t\tif (state.clipboard.mode === \"copy\") {\n\t\t\tthis.copy(state.clipboard.files, state.path);\n\t\t} else if (state.clipboard.mode === \"cut\") {\n\t\t\tthis.move(state.clipboard.files, state.path);\n\t\t}\n\t\tthis.clearClipboard();\n\t}\n\n\t/**\n\t * Opens the directory that contains the selected item (used in search output view)\n\t * @param {*} files\n\t */\n\tgoUp(files) {\n\t\tconst state = this.state;\n\t\tif (state.search) {\n\t\t\tconst file = files ? files[0] : state.selectedItem[0];\n\t\t\tif (!file) return;\n\t\t\tconst up = file.id.split(\"/\");\n\n\t\t\tconst path = \"/\" + up.slice(1, up.length - 1).join(\"/\");\n\t\t\tstate.$batch({\n\t\t\t\tsearch: \"\",\n\t\t\t\tsearchStats: null,\n\t\t\t\tpath: path,\n\t\t\t});\n\t\t}\n\t}\n}\n","import { JetApp, plugins, EmptyRouter } from \"webix-jet\";\nimport { createState, link } from \"jet-restate\";\n\nimport views from \"./export_views\";\nimport en from \"locales/en\";\n\nimport Backend from \"./models/Backend\";\nimport LocalData from \"./models/LocalData\";\nimport Upload from \"./models/Upload\";\nimport Progress from \"./models/Progress\";\nimport Operations from \"./models/Operations\";\n\nexport class App extends JetApp {\n\tconstructor(config) {\n\t\tconst state = createState({\n\t\t\tmode: config.mode || \"grid\",\n\t\t\tselectedItem: [],\n\t\t\tsearch: \"\",\n\t\t\tsearchStats: null,\n\t\t\tpath: config.path || \"/\",\n\t\t\tsource: config.source || \"files\",\n\t\t\tclipboard: null,\n\t\t});\n\n\t\tconst defaults = {\n\t\t\trouter: EmptyRouter,\n\t\t\tversion: VERSION,\n\t\t\tdebug: DEBUG,\n\t\t\tstart: \"/top\",\n\t\t\tparams: { state, forceCompact: config.compact },\n\t\t\teditor: true,\n\t\t\tplayer: true,\n\t\t\tcompactWidth: 640,\n\t\t};\n\n\t\tsuper({ ...defaults, ...config });\n\n\t\tthis.setService(\n\t\t\t\"backend\",\n\t\t\tnew (this.dynamic(Backend))(this, this.config.url)\n\t\t);\n\t\tthis.setService(\"local\", new (this.dynamic(LocalData))(this, 10));\n\t\tthis.setService(\"progress\", new (this.dynamic(Progress))(this));\n\t\tthis.setService(\"upload\", new (this.dynamic(Upload))(this, state));\n\t\tthis.setService(\"operations\", new (this.dynamic(Operations))(this, state));\n\n\t\tthis.use(\n\t\t\tplugins.Locale,\n\t\t\tthis.config.locale || {\n\t\t\t\tlang: \"en\",\n\t\t\t\twebix: {\n\t\t\t\t\ten: \"en-US\",\n\t\t\t\t\tzh: \"zh-CN\",\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t}\n\n\tdynamic(obj) {\n\t\treturn this.config.override ? this.config.override.get(obj) || obj : obj;\n\t}\n\n\trequire(type, name) {\n\t\tif (type === \"jet-views\") return views[name];\n\t\telse if (type === \"jet-locales\") return locales[name];\n\n\t\treturn null;\n\t}\n\n\t// for external users\n\tgetState() {\n\t\treturn this.config.params.state;\n\t}\n}\n\nwebix.protoUI(\n\t{\n\t\tname: \"filemanager\",\n\t\tapp: App,\n\t\tgetState() {\n\t\t\treturn this.$app.getState();\n\t\t},\n\t\tgetService(name) {\n\t\t\treturn this.$app.getService(name);\n\t\t},\n\t\t$init() {\n\t\t\tconst state = this.$app.getState();\n\t\t\tfor (let key in state) {\n\t\t\t\tlink(state, this.config, key);\n\t\t\t}\n\t\t},\n\t},\n\twebix.ui.jetapp\n);\n\n// re-export for customization\nconst services = { Backend, LocalData, Upload, Progress, Operations };\nconst locales = { en };\nexport { views, locales, services };\n","export default {\n\tSave: \"Save\",\n\t\"Save all\": \"Save all\",\n\tRename: \"Rename\",\n\tOpen: \"Open\",\n\tEdit: \"Edit\",\n\tDelete: \"Delete\",\n\tFolder: \"Folder\",\n\t\"Add New\": \"Add New\",\n\t\"My Files\": \"My Files\",\n\tSize: \"Size\",\n\tDate: \"Date\",\n\t\"back to parent folder\": \"back to parent folder\",\n\tDownload: \"Download\",\n\tType: \"Type\",\n\tInformation: \"Information\",\n\tFiles: \"Files\",\n\tTable: \"Table\",\n\tCards: \"Cards\",\n\tTotal: \"Total\",\n\t\"Are you sure ?\": \"Are you sure ?\",\n\tDetails: \"Details\",\n\t\"Enter a new name\": \"Enter a new name\",\n\tAdd: \"Add\",\n\t\"Select something\": \"Select something\",\n\t\"Download file\": \"Download file\",\n\tPreview: \"Preview\",\n\tRefresh: \"Refresh\",\n\t\"Are you sure you want to exit without saving?\":\n\t\t\"Are you sure you want to exit without saving?\",\n\t\"Save before closing?\": \"Save before closing?\",\n\tCopy: \"Copy\",\n\tCut: \"Cut\",\n\tPaste: \"Paste\",\n\t\"Deleting...\": \"Deleting...\",\n\t\"Copying...\": \"Copying...\",\n\t\"Moving...\": \"Moving...\",\n\tFolders: \"Folders\",\n\t\"Search results\": \"Search results\",\n\t\"Search results in\": \"Search results in\",\n\t\"Search files and folders\": \"Search files and folders\",\n\t\"Add new file\": \"Add new file\",\n\t\"Add new folder\": \"Add new folder\",\n\t\"Upload file\": \"Upload file\",\n\tfolder: \"folder\",\n\tfile: \"file\",\n\tarchive: \"archive\",\n\taudio: \"audio\",\n\timage: \"image\",\n\tvideo: \"video\",\n\tcode: \"code\",\n\tdocument: \"document\",\n\tof: \"of\",\n\tused: \"used\",\n\t\"Open item location\": \"Open item location\",\n\t\"Are you sure you want to delete\": \"Are you sure you want to delete\",\n\t\"these items:\": \"these items:\",\n\t\"this item:\": \"this item:\",\n\t\"Delete files\": \"Delete files\",\n\tand: \"and\",\n\t\"more file(s)\": \"more file(s)\",\n\t\"Close the editor\": \"Close the editor\",\n\t\"Close this file\": \"Close this file\",\n};\n"],"names":["webix","config","this","webixJet","_events","_subs","_data","params","extend","JetBase","_root","_detachEvents","_destroySubs","_container","app","_parent","id","value","url","_segment","update","show","parent","view","getParentView","getParam","suburl","toString","root_1","getRoot","queryView","obj","localId","$scope","name","code","attachEvent","push","key","kid","contains","sub","getSubViewInfo","subview","popup","events","i","length","detachEvent","subView","destructor","current","default","branch","child","_getDefaultSub","_routed_view","parse","substr","parts","split","chunks","test","result","pos","indexOf","params_1","_i","dchunk","decodeURIComponent","page","isNew","url2str","stack","stack_1","chunk","obj2str","join","str","encodeURIComponent","route","index","_next","path","Route","slice","setParams","old","kids","reset","concat","_join","Promise","res","rej","redirect","confirm","resolve","callEvent","NavigationBlocked","catch","err","then","_this","n","_super","_children","__extends","JetView","ui","container","jetview","createView","render","setParam","parent_1","target","_renderFrameLock","_show","segment","_init_url_data","_urlChange","linkRouter","getRouter","set","silent","_$view","_$","_$url","message","destroy","_destroyKids","plugin","getUrl","tagName","refresh","_render","root","document","body","toNode","cfg","_render_final","response","slot","$$","reject","copyConfig","oldui","parent_2","asWin","setPosition","isVisible","_init","_initUrl","ready","e","_initError","init","waits","frame","wait","all","urlChange","lock","_renderFrame","next","_createSubView","shift","_override","error","createFromURL","uis","_ui","JetViewRaw","cb","SubRouter","a","append","_once","window","version","start","_services","EventSystem","JetAppBase","_subSegment","handler","getSubView","prototype","$subview","addSubView","isArray","Array","method","point","DataCollection","RegExp","Map","Date","copy","$router","srcElement","getAttribute","trigger_1","_forView","trigger","cancelBubble","preventDefault","route_1","parentNode","clickHandler","views","_loadError","Error","hidden","replace","require","module","__esModule","loadView","over","override","dv","get","router","rest","apply","data","bind","er","debug","console","text","innerHTML","type","expire","event","_first_start","top","base","setTimeout","animation","node_1","html","addCss","removeCss","now","urlString","template","uid","_detectPrefix","onpopstate","HashRouter","routes","compare","history","pushState","prefix","sufix","_getRaw","routerPrefix","location","href","isPatched","patch","w","win","promise","freeze","some","$freeze","resize","baseAdd","baselayout","addView","baseRemove","removeView","jview_1","subs_1","arguments","subs","layout","protoUI","$init","$app","$ready","proxy","JetApp","UrlRouter","pathname","search","_$config","EmptyRouter","has","store","Object","hasOwnProperty","call","forEach","context","warn","x","String","russianPluralGroups","end","pluralTypes","arabic","lastTwo","bosnian_serbian","chinese","croatian","french","german","russian","lithuanian","czech","polish","icelandic","slovenian","pluralTypeToLanguages","pluralTypeName","locale","ret","langToPluralType","langs","lang","en","escape","token","dollarRegex","defaultTokenRegex","transformPhrase","phrase","substitutions","tokenRegex","TypeError","interpolationRegex","options","smart_count","texts","count","pluralTypeIndex","expression","argument","Polyglot","opts","phrases","currentLocale","allowMissing","onMissingKey","suffix","RangeError","constructTokenRegex","interpolation","newLocale","morePhrases","prefixedKey","unset","clear","newPhrases","t","_","webixPolyglot","plugins","_view","storage","setLangData","pconfig","polyglot","poly","service","put","locName","i18n","setLocale","setLang","getLang","setService","link","source","defineProperty","createState","handlers","out","observe","mask","undefined","queue","waitInQueue","notify","meta","list","keys","key2","nested","reactive","enumerable","configurable","values_1","val","valueOf","UIManager","addHotKey","_a","removeHotKey","folderIcon","menuIcon","compact","tree","MenuBodyView","getService","icon","hotkey","$template","FULL","FOLDER","editor","splice","TEXT","css","autoheight","on","onMenuItemClick","Files","files","file","many","viewable","find","$ext","getState","define","filter","o","_config","ContextMenuView","dynamic","onBeforeShow","_Locate","FilterOptions","hide","master","locate","attachTo","trg","offsetX","y","offsetHeight","offsetY","DataViewBase","State","Local","_Track","WTable","ShiftFocus","newIDs","getSelectedId","map","getItem","selectedItem","$noSelect","$changes","v","$batch","searchStats","folders","hierarchy","GetPrevLocation","LoadData","m","SelectActive","AddHotkeys","Menu","state","AttachTo","item","isSelected","select","sel","s","isActive","items","ShowSubFolder","operation","oldPath","exists","getParentId","date","targetItem","table","getFirstId","delay","setFocus","clearAll","prepareData","GetSearchStats","RenderData","move","GetTargetFolder","ctx","f","parentInd","firstDragged","Icon","multiple","ctrlKey","env","isMac","operations","oper","this_1","preventEvent","selectAll","unselectAll","CardsView","smallSkin","skin","$name","drag","multiselect","CardTemplate","height","width","padding","onItemDblClick","Activate","GetSelection","onEnter","onBeforeDrag","DragMarker","onBeforeDrop","MoveFiles","onClick","webix_fmanager_menu_icon","Show","webix_dataview","EmptyClick","onContext","sync","preview","panel","SearchTemplate","picSize","$active","listItemHeight","origin_1","previewURL","rex","fileNameSelectMask","input","extIndex","lastIndexOf","setSelectionRange","iterateAsync","arr","cancel","formatTemplate","size","toFixed","getLastSelected","safeName","trim","capitalize","charAt","toUpperCase","defaults","mode","lineNumbers","matchBrackets","theme","$view","_textarea","firstChild","_waitEditor","defer","_render_cm_editor","complex_types","php","htmlembedded","addon","htmlmixed","dockerfile","cdn","sources","extras","_render_when_ready","log","_editor","CodeMirror","fromTextArea","setValue","_focus_await","focus","_set_inner_size","$width","_updateScrollSize","scrollTo","box","getWrapperElement","$height","style","scroll","getScrollerElement","$setSize","preserveUndoHistory","clearHistory","getValue","getEditor","waitEditor","undo","redo","undoLength","historySize","typeHash","go","javascript","markdown","python","sql","yaml","shell","EditorView","tabbar","borderless","tabMinWidth","moreTemplate","tooltip","onChange","OpenDoc","onBeforeTabClick","TabAction","tabbarPopup","toolbar","left","right","bottom","toolbarHeight","cols","touch","GetMobileControls","GetCloseAll","rows","label","click","Save","mobile","ConfirmAll","ProgressBar","showProgress","GetFileLabel","_oldValue","_changed","_buffers","editorObj","read","AddDoc","AddTab","finally","hideProgress","HandleChanges","SaveAll","TextChanged","GetActiveFile","Doc","GetFileType","short","ClipName","tabContent","getTextSize","addOption","swapDoc","CheckChanges","Back","classes","className","actionIcon","CloseTab","ConfirmOne","WriteFileContent","ChangeTextState","content","write","isEqual","ChangeButtonState","ChangeTabsState","button","tab","getOption","ChangeTabState","tabs","removeOption","prompt","p","modal","head","elements","close","position","margin","validate","getTopParentView","form","getBody","newname","getValues","onShow","getInputNode","selectMask","AddNewMenuView","_1","FoldersView","inputWidth","align","common","folder","$level","onBeforeContextMenu","Tree","Math","floor","used","total","timelineColor","Ready","h","Subscribe","GetFsStats","ContextMenu","GetRootId","open","showItem","force","getInfo","setValues","stats","GridView","grid","resizeColumn","headerOnly","sort","backIcon","backLabel","data->onStoreLoad","markSorting","webix_ss_center_scroll","webix_column","columns","header","NameTemplate","fillspace","format","isNaN","longDateFormatStr","unselect","by","b","localeCompare","ignorePunctuation","numeric","PreviewPopupView","fullscreen","SideTreeView","FoldersTree","DoublePanelView","GetSource","_TrackChanges","trackActive","opath","npath","PanelSearchView","getRootName","PanelView","paddingX","RenderPath","webix_fmanager_path_chunk","ChangePath","ProcessPath","uapi","getUploader","addDropZone","tempUrlData","dirs","rootName_1","htmlPath_1","chunkInd","newPath","InfoPreview","dateTimeFormat","dateToStr","mainInfo","k","extraInfo","tags","keyCol","valueCol","counter","cells","Tabview","ShowInfo","getTabbar","infoId","counterId","SetInfo","SwitchTabs","extraInfo_1","getMeta","SetExtraInfo","fail","_isEmpty","hideOption","showOption","PreviewView","FileInfo","minHeight","lastSelected","downloadIcon","previewUrl","player","info","overflow","_waitView","getPlayer","_player","Plyr","_initPlyr","setAttribute","media","_normalizeRatio","querySelector","source_setter","getPlyr","_gcdRatio","abs","clientWidth","clientHeight","div","ratio","MediaPreview","controls","node","ShowPreview","directLink","SetMedia","art","src","ext","TemplatePreview","setHTML","ProgressView","Config","done","disable","WaitClose","Counter","Close","Step","min","sizeTrigger","_compactValue","_compactWidth","_compactHandler","_checkTrigger","TopBarView","paddingY","autowidth","placeholder","optionWidth","conf","modes","TopView","fCompact","Compact","minWidth","maxWidth","panels","unshift","TopBar","compactWidth","SetCompactMode","dummy","SideTree","PreviewPopup","TogglePreview","ToggleFolders","ShowMode","ShowSearch","handle","ShowProgress","PrevMode","IsVisible","Hide","side","m0","m1","m2","m3","m4","m5","m6","m7","m8","m9","m10","m11","m12","m13","m14","m15","m16","m17","m18","m19","_url","_features","Backend","_files","ajax","json","post","r","download","to","_info","resp","features","limit","_store","_limit","Cache","prune","rec","temp","delete","fscache","TreeCollection","folders_ready","LocalData","dir","$row","fs","scheme","$change","$serialize","serializeData","reload","$css","defaultDir","add","getFsPosition","d","order","findIndex","each","remove","oldId","newId","updateItem","changeId","defaultTree","initUploader","initEvents","UploadHandler","fileDialog","uploader","apiOnly","upload","onAfterFileAdd","urlData","onFileUpload","addFile","onUploadComplete","$updateProgress","percent","Progress","$destructed","progress","Operations","edit","makeFile","makeFolder","rename","addToClipboard","paste","goUp","backend","writeText","local","updateFile","readText","makefile","invalid","makedir","sfiles","extractIds","title","removeConfirmMessage","deleteFile","pop","reloadBranch","toRemove","eachChild","targetFolder","tfs","ids","clipboard","clearClipboard","up","forceCompact","Upload","use","zh","App","locales","jetapp","services","Save all","Rename","Open","Edit","Delete","Folder","Add New","My Files","Size","back to parent folder","Download","Type","Information","Table","Cards","Total","Are you sure ?","Details","Enter a new name","Add","Select something","Download file","Preview","Refresh","Are you sure you want to exit without saving?","Save before closing?","Copy","Cut","Paste","Deleting...","Copying...","Moving...","Folders","Search results","Search results in","Search files and folders","Add new file","Add new folder","Upload file","archive","audio","image","video","of","Open item location","Are you sure you want to delete","these items:","this item:","Delete files","and","more file(s)","Close the editor","Close this file"],"mappings":"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"}