| | |
| | | this.setState({visible: true}) |
| | | } |
| | | |
| | | resetconfig = (item, Tab, copyBtns) => { |
| | | resetconfig = (item, Tab, copyBtns, uuids = {}) => { |
| | | item.floor = Tab.floor + 1 |
| | | item.tabId = Tab.uuid |
| | | item.parentId = Tab.parentId |
| | | |
| | | if (item.type === 'tabs') { |
| | | item.uuid = MenuUtils.getuuid() |
| | | uuids[item.uuid] = MenuUtils.getuuid() |
| | | item.uuid = uuids[item.uuid] |
| | | item.setting.name = item.setting.name + MenuUtils.getdataName().toUpperCase().substr(-4) |
| | | item.name = item.setting.name |
| | | |
| | | item.subtabs.forEach(tab => { |
| | | tab.uuid = MenuUtils.getuuid() |
| | | uuids[tab.uuid] = MenuUtils.getuuid() |
| | | tab.uuid = uuids[tab.uuid] |
| | | tab.parentId = item.uuid |
| | | |
| | | if (item.floor >= 3) { |
| | |
| | | } |
| | | |
| | | tab.components = tab.components.map(cell => { |
| | | cell = this.resetconfig(cell, tab, copyBtns) |
| | | cell = this.resetconfig(cell, tab, copyBtns, uuids) |
| | | return cell |
| | | }) |
| | | }) |
| | | } else if (item.type === 'group') { |
| | | item.uuid = MenuUtils.getuuid() |
| | | uuids[item.uuid] = MenuUtils.getuuid() |
| | | item.uuid = uuids[item.uuid] |
| | | item.setting.name = item.setting.name + MenuUtils.getdataName().toUpperCase().substr(-4) |
| | | item.name = item.setting.name |
| | | |
| | |
| | | cell.tabId = Tab.uuid |
| | | cell.parentId = Tab.parentId |
| | | |
| | | cell = MenuUtils.resetComponentConfig(cell, copyBtns) |
| | | cell = MenuUtils.resetComponentConfig(cell, copyBtns, uuids) |
| | | |
| | | return cell |
| | | }) |
| | | } else { |
| | | item = MenuUtils.resetComponentConfig(item, copyBtns) |
| | | item = MenuUtils.resetComponentConfig(item, copyBtns, uuids) |
| | | } |
| | | |
| | | return item |
| | |
| | | this.setState({visible: true}) |
| | | } |
| | | |
| | | resetconfig = (item, copyBtns) => { |
| | | resetconfig = (item, copyBtns, uuids = {}) => { |
| | | let appType = sessionStorage.getItem('appType') |
| | | |
| | | if (item.type === 'tabs') { |
| | | item.uuid = MenuUtils.getuuid() |
| | | uuids[item.uuid] = MenuUtils.getuuid() |
| | | item.uuid = uuids[item.uuid] |
| | | item.setting.name = item.setting.name + MenuUtils.getdataName().toUpperCase().substr(-4) |
| | | item.name = item.setting.name |
| | | |
| | | item.subtabs.forEach(tab => { |
| | | tab.uuid = MenuUtils.getuuid() |
| | | uuids[tab.uuid] = MenuUtils.getuuid() |
| | | tab.uuid = uuids[tab.uuid] |
| | | tab.parentId = item.uuid |
| | | |
| | | if (appType !== 'mob') { |
| | |
| | | cell.tabId = tab.uuid |
| | | cell.parentId = tab.parentId |
| | | |
| | | cell = this.resetconfig(cell, copyBtns) |
| | | cell = this.resetconfig(cell, copyBtns, uuids) |
| | | return cell |
| | | }) |
| | | }) |
| | | } else if (item.type === 'group') { |
| | | item.uuid = MenuUtils.getuuid() |
| | | uuids[item.uuid] = MenuUtils.getuuid() |
| | | item.uuid = uuids[item.uuid] |
| | | item.setting.name = item.setting.name + MenuUtils.getdataName().toUpperCase().substr(-4) |
| | | item.name = item.setting.name |
| | | |
| | |
| | | cell.tabId = item.tabId || '' |
| | | cell.parentId = item.parentId || '' |
| | | |
| | | cell = MenuUtils.resetComponentConfig(cell, copyBtns) |
| | | cell = MenuUtils.resetComponentConfig(cell, copyBtns, uuids) |
| | | return cell |
| | | }) |
| | | } else { |
| | | item = MenuUtils.resetComponentConfig(item, copyBtns) |
| | | item = MenuUtils.resetComponentConfig(item, copyBtns, uuids) |
| | | } |
| | | |
| | | return item |
| | |
| | | MenuID: MenuId |
| | | } |
| | | |
| | | if (sessionStorage.getItem('appType') === 'pc') { |
| | | param.TypeCharOne = sessionStorage.getItem('kei_no') |
| | | param.Typename = 'pc' |
| | | } |
| | | |
| | | Api.getSystemConfig(param).then(result => { |
| | | if (result.status) { |
| | | let config = null |
| | |
| | | LText: [] |
| | | } |
| | | |
| | | btnParam.LText = this.getMenuMessage() |
| | | btnParam.LText = btnParam.LText.join(' union all ') |
| | | btnParam.LText = Utils.formatOptions(btnParam.LText) |
| | | btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp) |
| | | if (sessionStorage.getItem('appType') === 'pc') { |
| | | param.TypeCharOne = sessionStorage.getItem('kei_no') |
| | | param.Typename = 'pc' |
| | | |
| | | btnParam.LText = '' |
| | | } else { |
| | | btnParam.LText = this.getMenuMessage() |
| | | btnParam.LText = btnParam.LText.join(' union all ') |
| | | btnParam.LText = Utils.formatOptions(btnParam.LText) |
| | | btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp) |
| | | } |
| | | |
| | | new Promise(resolve => { |
| | | if (delButtons.length === 0) { |
| | |
| | | error = `组件《${item.name}》未设置数据源!` |
| | | } else if (item.setting.interType && !item.setting.primaryKey) { |
| | | error = `组件《${item.name}》未设置主键!` |
| | | } else if (!item.setting.supModule) { |
| | | error = `组件《${item.name}》未设置上级组件!` |
| | | } |
| | | } |
| | | if (item.type === 'bar' || item.type === 'line' || item.type === 'pie') { |
| | |
| | | { type: 'menu', url: Carousel, component: 'carousel', subtype: 'datacard', title: '轮播-动态数据', width: 24 }, |
| | | { type: 'menu', url: Carousel1, component: 'carousel', subtype: 'propcard', title: '轮播-静态数据', width: 24 }, |
| | | { type: 'menu', url: NormalTable, component: 'table', subtype: 'normaltable', title: '常用表', width: 24 }, |
| | | { type: 'menu', url: NormalTable, component: 'table', subtype: 'editable', title: '表格(可编辑)', width: 24 }, |
| | | { type: 'menu', url: TableCard, component: 'table', subtype: 'tablecard', title: '表格(卡片)', width: 12 }, |
| | | { type: 'menu', url: tree, component: 'tree', subtype: 'normaltree', title: '树形列表', width: 12 }, |
| | | { type: 'menu', url: line, component: 'line', subtype: 'line', title: '折线图', width: 24 }, |
| | |
| | | .custom-popview.popview-modal { |
| | | >.ant-modal-content >.ant-modal-body { |
| | | padding: 0; |
| | | .custom-page-wrap { |
| | | min-height: 200px; |
| | | } |
| | | } |
| | | } |
| | | .custom-drawer-popview { |
| | |
| | | text-align: right; |
| | | box-shadow: 0 0 3px #cbcbcb; |
| | | } |
| | | .custom-page-wrap { |
| | | min-height: calc(100vh - 110px); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | config.MenuNo = param.MenuNo |
| | | config.easyCode = '' |
| | | config.components = MenuUtils.resetConfig(config.components) |
| | | config.enabled = false |
| | | |
| | | param.LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(config))) |
| | | } |
| | |
| | | * @description 重置菜单配置,页面整体复制 |
| | | * @return {String} components 配置信息 |
| | | */ |
| | | static resetConfig = (components) => { |
| | | static resetConfig = (components, uuids = {}) => { |
| | | return components.map(item => { |
| | | if (item.type === 'navbar') { |
| | | return item |
| | | } |
| | | |
| | | item.uuid = this.getuuid() |
| | | uuids[item.uuid] = this.getuuid() |
| | | item.uuid = uuids[item.uuid] |
| | | |
| | | if (item.type === 'tabs') { |
| | | item.subtabs.forEach(tab => { |
| | | tab.uuid = this.getuuid() |
| | | uuids[tab.uuid] = this.getuuid() |
| | | tab.uuid = uuids[tab.uuid] |
| | | tab.parentId = item.uuid |
| | | |
| | | tab.components = tab.components.map(cell => { |
| | |
| | | cell.parentId = item.uuid |
| | | return cell |
| | | }) |
| | | tab.components = this.resetConfig(tab.components) |
| | | tab.components = this.resetConfig(tab.components, uuids) |
| | | }) |
| | | } else if (item.type === 'group') { |
| | | item.components = item.components.map(cell => { |
| | | cell.parentId = item.uuid |
| | | return cell |
| | | }) |
| | | item.components = this.resetConfig(item.components) |
| | | item.components = this.resetConfig(item.components, uuids) |
| | | } else if (item.type === 'menubar') { |
| | | item.subMenus = item.subMenus.map(cell => { |
| | | cell.uuid = this.getuuid() |
| | |
| | | }) |
| | | } |
| | | |
| | | if (item.setting && item.setting.supModule && item.setting.supModule[0] !== 'empty') { |
| | | let em = false |
| | | item.setting.supModule = item.setting.supModule.map(c => { |
| | | if (!uuids[c]) { |
| | | em = true |
| | | } |
| | | return uuids[c] || '' |
| | | }) |
| | | if (em) { |
| | | item.setting.supModule = '' |
| | | } |
| | | } |
| | | |
| | | if (item.wrap && item.wrap.doubleClick) { |
| | | item.wrap.doubleClick = oriUids[item.wrap.doubleClick] || '' |
| | | } |
| | |
| | | * @description 重置组件配置 |
| | | * @return {String} item 组件信息 |
| | | */ |
| | | static resetComponentConfig = (item, copyBtns) => { |
| | | static resetComponentConfig = (item, copyBtns, uuids = {}) => { |
| | | if (item.type === 'navbar') { |
| | | return item |
| | | } |
| | | |
| | | item.uuid = this.getuuid() |
| | | let _uuid = this.getuuid() |
| | | |
| | | uuids[item.uuid] = _uuid |
| | | |
| | | item.uuid = _uuid |
| | | |
| | | if (item.dataName) { |
| | | item.dataName = this.getdataName() |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | if (item.setting && item.setting.supModule) { |
| | | item.setting.supModule = '' |
| | | if (item.setting && item.setting.supModule && item.setting.supModule[0] !== 'empty') { |
| | | let em = false |
| | | item.setting.supModule = item.setting.supModule.map(c => { |
| | | if (!uuids[c]) { |
| | | em = true |
| | | } |
| | | return uuids[c] || '' |
| | | }) |
| | | if (em) { |
| | | item.setting.supModule = '' |
| | | } |
| | | } |
| | | |
| | | if (item.wrap && item.wrap.doubleClick) { |
| | |
| | | // 控制台打印数据 |
| | | let conLtext = [] |
| | | |
| | | let _Ltext = data.map((item, lindex) => { |
| | | let _Ltext = data.map(item => { |
| | | let vals = [] |
| | | let convals = [] |
| | | columns.forEach(col => { |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Form, Row, Col, Input, Select, notification } from 'antd' |
| | | import { Form, Row, Col, Input, Select, notification, Tooltip, Icon } from 'antd' |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | |
| | | <Form {...formItemLayout} className="app-script-form"> |
| | | <Row gutter={24}> |
| | | <Col span={12}> |
| | | <Form.Item label="类型"> |
| | | <Form.Item label={ |
| | | <Tooltip placement="topLeft" title="1、初次升级或应用基本信息修改时,请首先添加应用(基本信息);2、子应用整体升级时,请添加子应用(升级内容包括页面及权限树);3、单个页面升级时,请添加页面;4、涉及权限更新时,请添加权限树"> |
| | | <Icon style={{color: '#c49f47', marginRight: '5px'}} type="question-circle" />类型 |
| | | </Tooltip> |
| | | }> |
| | | {getFieldDecorator('VType', { |
| | | initialValue: 'subapp', |
| | | rules: [{ |
| | |
| | | max: 20, |
| | | message: '传输号不可超过20个字符!' |
| | | }] |
| | | })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)} |
| | | })(<Input placeholder="" autoFocus autoComplete="off" onPressEnter={this.handleSubmit} />)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | <Col span={24}> |
| | |
| | | _conf.uuid = item.uuid |
| | | _conf.MenuID = item.uuid |
| | | _conf.Template = 'CustomPage' |
| | | _conf.enabled = false |
| | | } else { |
| | | resolve({ |
| | | status: true |
| | |
| | | error = `组件《${item.name}》未设置数据源!` |
| | | } else if (!item.setting.primaryKey) { |
| | | error = `组件《${item.name}》未设置主键!` |
| | | } else if (!item.setting.supModule) { |
| | | error = `组件《${item.name}》未设置上级组件!` |
| | | } |
| | | } |
| | | if (item.type === 'bar' || item.type === 'line' || item.type === 'pie') { |
| | |
| | | } |
| | | } else { |
| | | config.components = MenuUtils.resetConfig(config.components) |
| | | config.enabled = false |
| | | message.success('复制成功,保存后生效。') |
| | | } |
| | | |
| | |
| | | error = `组件《${item.name}》未设置数据源!` |
| | | } else if (!item.setting.primaryKey) { |
| | | error = `组件《${item.name}》未设置主键!` |
| | | } else if (!item.setting.supModule) { |
| | | error = `组件《${item.name}》未设置上级组件!` |
| | | } |
| | | } |
| | | if (item.type === 'bar' || item.type === 'line' || item.type === 'pie') { |
| | |
| | | } |
| | | } else { |
| | | config.components = MenuUtils.resetConfig(config.components) |
| | | config.enabled = false |
| | | message.success('复制成功,保存后生效。') |
| | | } |
| | | |
| | |
| | | |
| | | Api.getSystemConfig({ |
| | | func: 'sPC_Get_LongParam', |
| | | MenuID: item.$originUuid |
| | | MenuID: item.$originUuid, |
| | | TypeCharOne: sessionStorage.getItem('kei_no'), |
| | | typename: 'pc', |
| | | }).then(result => { |
| | | if (result.status) { |
| | | let _conf = '' |
| | |
| | | _conf.uuid = item.uuid |
| | | _conf.MenuID = item.uuid |
| | | _conf.Template = 'webPage' |
| | | _conf.enabled = false |
| | | } else { |
| | | resolve({ |
| | | status: true |
| | |
| | | Template: 'webPage', |
| | | MenuName: item.label, |
| | | PageParam: JSON.stringify({Template: 'webPage'}), |
| | | LongParam: window.btoa(window.encodeURIComponent(JSON.stringify(_conf))) |
| | | LongParam: window.btoa(window.encodeURIComponent(JSON.stringify(_conf))), |
| | | TypeCharOne: sessionStorage.getItem('kei_no'), |
| | | Typename: 'pc', |
| | | } |
| | | |
| | | Api.getSystemConfig(_param).then(response => { |
| | |
| | | error = `组件《${item.name}》未设置数据源!` |
| | | } else if (!item.setting.primaryKey) { |
| | | error = `组件《${item.name}》未设置主键!` |
| | | } else if (!item.setting.supModule) { |
| | | error = `组件《${item.name}》未设置上级组件!` |
| | | } |
| | | } |
| | | if (item.type === 'bar' || item.type === 'line' || item.type === 'pie') { |
| | |
| | | import { DndProvider } from 'react-dnd' |
| | | import { is, fromJS } from 'immutable' |
| | | import HTML5Backend from 'react-dnd-html5-backend' |
| | | import { Card, notification, Row, Button, Modal, Input, Icon } from 'antd' |
| | | import { Card, notification, Row, Button, Modal, Input, Icon, Switch } from 'antd' |
| | | import DragElement from './dragelement' |
| | | import MutilForm from './mutilform' |
| | | import SourceElement from './dragelement/source' |
| | |
| | | upPlus: 1, |
| | | upMinus: 1, |
| | | leftPlus: 1, |
| | | leftMinus: 1 |
| | | leftMinus: 1, |
| | | debug: false |
| | | } |
| | | |
| | | getclickpoint = (e) => { |
| | |
| | | } |
| | | |
| | | resetbox = () => { |
| | | const { config } = this.state |
| | | const { config, debug } = this.state |
| | | |
| | | let ratio = (config.height || 1) / (config.width || 1) |
| | | |
| | | document.getElementById('darea').style.height = parseInt(document.getElementById('darea').style.width) * ratio + 'px' |
| | | |
| | | printCtrl.sketch(config, null) |
| | | printCtrl.sketch(config, null, debug) |
| | | } |
| | | |
| | | resetview () { |
| | | const { config, editItemId } = this.state |
| | | const { config, editItemId, debug } = this.state |
| | | |
| | | printCtrl.sketch(config, editItemId) |
| | | printCtrl.sketch(config, editItemId, debug) |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | new Promise(resolve => { |
| | | printCtrl.sketch(config, null).then(res => { |
| | | printCtrl.sketch(config, null, false).then(res => { |
| | | let param = { |
| | | Base64Img: res |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | changeDebug = (val) => { |
| | | this.setState({ |
| | | debug: val |
| | | }, () => { |
| | | this.resetview() |
| | | }) |
| | | } |
| | | |
| | | render () { |
| | | return ( |
| | | <div className="print-template"> |
| | |
| | | <Input addonBefore={<Icon title="距上" type="arrow-up" />} addonAfter={<Icon onClick={() => this.updatePosition('upMinus')} type="minus" />} onChange={(e) => this.change(e, 'upMinus')} value={this.state.upMinus} /> |
| | | <Input addonBefore={<Icon title="距左" type="arrow-left" />} addonAfter={<Icon onClick={() => this.updatePosition('leftPlus')} type="plus" />} onChange={(e) => this.change(e, 'leftPlus')} value={this.state.leftPlus} /> |
| | | <Input addonBefore={<Icon title="距左" type="arrow-left" />} addonAfter={<Icon onClick={() => this.updatePosition('leftMinus')} type="minus" />} onChange={(e) => this.change(e, 'leftMinus')} value={this.state.leftMinus} /> |
| | | <div style={{marginTop: '10px'}}> |
| | | <span>调试模式:</span><Switch onChange={this.changeDebug} /> |
| | | </div> |
| | | </Card> |
| | | </aside> |
| | | <div className="switchbox" onClick={this.switchbox}></div> |
| | |
| | | * @param {Object} configs 配置信息 |
| | | * @param {Boolean} selectId 编辑元素 |
| | | */ |
| | | static sketch (configs, selectId) { |
| | | static sketch (configs, selectId, debug = false) { |
| | | if (!configs.height || !configs.width) return |
| | | |
| | | if (configs.height / configs.width > 10 || configs.width / configs.height > 10) return |
| | |
| | | }) |
| | | |
| | | return new Promise(resolve => { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | }) |
| | | } else { |
| | | return new Promise(resolve => { |
| | |
| | | * @param {Object} context 画布对象 |
| | | * @param {Object} elements 图片文字信息 |
| | | */ |
| | | static sketchothers (context, elements, selectId, ratio, resolve) { |
| | | static sketchothers (context, elements, selectId, debug, ratio, resolve) { |
| | | let element = elements.splice(0, 1)[0] // 逐个绘制图片文字 |
| | | let textLineSpace = 5 // 绘制时行间距,防止文字重叠 |
| | | context.save() |
| | |
| | | context.translate(-_cx, -_cy) // 恢复原点 |
| | | } |
| | | |
| | | if (selectId === element.uuid) { // 选中元素,设置外部阴影 |
| | | if (debug || selectId === element.uuid) { // 选中元素,设置外部阴影 |
| | | context.shadowBlur = 5 |
| | | context.shadowColor = '#1890ff' |
| | | context.fillStyle = 'white' |
| | |
| | | context.fillRect(element.left, element.top, element.width, element.height) |
| | | } |
| | | |
| | | if (selectId === element.uuid && element.width > 3 * ratio && element.height > 3 * ratio) { // 选中元素,设置外部阴影 |
| | | if ((debug || selectId === element.uuid) && element.width > 3 * ratio && element.height > 3 * ratio) { // 选中元素,设置外部阴影 |
| | | context.strokeStyle = '#1890ff' |
| | | context.beginPath() |
| | | context.moveTo(element.left + element.width - 7, element.top + element.height - 2) |
| | |
| | | if (!element.width || !element.height) { |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |
| | |
| | | image.onerror = () => { |
| | | context.restore() // 重置画布 |
| | | if (elements.length > 0) { |
| | | this.sketchothers(context, elements, selectId, ratio, resolve) |
| | | this.sketchothers(context, elements, selectId, debug, ratio, resolve) |
| | | } else { |
| | | this.cachesketch(context, resolve) |
| | | } |