From cb1e3db73f179706e0132ff809081ce3e6cd5d71 Mon Sep 17 00:00:00 2001 From: alan Date: Thu, 7 Nov 2019 17:36:38 +0800 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=B8=83?= =?UTF-8?q?=E5=B1=80=EF=BC=8C=E5=AF=B9=E6=8E=A5=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/redis/locale/redis_zh_CN.properties | 25 +- src/web/assets/scripts/dec.js | 19 + src/web/index.html | 5 +- src/web/private/i18n.ts | 21 +- src/web/src/index.ts | 19 +- src/web/src/less/font.less | 7 +- src/web/src/less/lib/font.less | 7 +- src/web/src/modules/app.constant.ts | 33 + src/web/src/modules/app.dataset.model.ts | 46 + src/web/src/modules/app.dataset.ts | 161 +- src/web/src/modules/app.less | 7 + src/web/src/modules/app.program.ts | 175 +- .../database_index/database_index.model.ts | 18 + .../database_index/database_index.ts | 70 + .../modules/components/parameter/parameter.ts | 2 +- src/web/src/modules/constants/env.ts | 4 + src/web/src/modules/crud/crud.request.ts | 22 + src/web/src/modules/crud/crud.service.ts | 135 ++ src/web/src/modules/table_list/list_item.ts | 36 +- .../modules/table_list/table_list.model.ts | 38 + src/web/src/modules/table_list/table_list.ts | 95 +- src/web/src/ui/fineui.ts | 2 + src/web/types/globals.d.ts | 2 +- src/web/webpack/webpack.dev.js | 6 + src/web/yarn.lock | 1698 +++++++++-------- 25 files changed, 1666 insertions(+), 987 deletions(-) create mode 100644 src/web/assets/scripts/dec.js create mode 100644 src/web/src/modules/app.constant.ts create mode 100644 src/web/src/modules/app.dataset.model.ts create mode 100644 src/web/src/modules/app.less create mode 100644 src/web/src/modules/components/database_index/database_index.model.ts create mode 100644 src/web/src/modules/components/database_index/database_index.ts create mode 100644 src/web/src/modules/constants/env.ts create mode 100644 src/web/src/modules/crud/crud.request.ts create mode 100644 src/web/src/modules/crud/crud.service.ts create mode 100644 src/web/src/modules/table_list/table_list.model.ts diff --git a/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties b/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties index 8d4a260..59b03d9 100755 --- a/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties +++ b/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties @@ -41,21 +41,12 @@ Plugin-Redis_Script_Engine_Type_V8=V8\u9AD8\u901F\u5F15\u64CE Plugin-Redis_Proxy_Private_Key_Path_Mark=\u8bf7\u8f93\u5165\u670d\u52a1\u5668\u6587\u4ef6\u8def\u5f84 Plugin-Redis_Connection_Form_OriginalCharsetName= \u7f16\u7801 Plugin-Redis_Check_Integer=\u8bf7\u8f93\u5165\u4e0d\u5c0f\u4e8e\u0030\u7684\u6574\u6570 -Plugin-Redis_Parameter_Insert=\u63D2\u5165 -Plugin-Redis_Parameter_Delete=\u5220\u9664 -Plugin-Redis_Parameter_Move_Up=\u4E0A\u79FB -Plugin-Redis_Parameter_Move_Down=\u4E0B\u79FB -Plugin-Redis_Parameter_Refresh=\u5237\u65B0 -Plugin-Redis_Dataset_Parameter_Name=\u53C2\u6570 -Plugin-Redis_Dataset_Parameter_Value=\u503C -Plugin-Redis_Parameter_Please_Set_Parameter_Name=\u8BF7\u5148\u8BBE\u7F6E\u53C2\u6570\u540D -Plugin-Redis_Parameter_Type_String=\u5B57\u7B26\u4E32 -Plugin-Redis_Parameter_Type_Int=\u6574\u578B -Plugin-Redis_Parameter_Type_Number=\u53CC\u7CBE\u5EA6\u578B -Plugin-Redis_Parameter_Type_Date=\u65E5\u671F -Plugin-Redis_Parameter_Type_Boolean=\u5E03\u5C14\u578B -Plugin-Redis_Parameter_Type_Formula=\u516C\u5F0F -Plugin-Redis_Parameter_Delete_Confirm=\u4F60\u786E\u5B9A\u51B3\u5B9A\u5220\u9664\u9009\u4E2D\u7684\u9879\uFF1F -Plugin-Redis_Parameter_Delete_Alert=\u5F53\u524D\u5217\u8868\u4E3A\u7A7A\u6216\u8005\u4F60\u6CA1\u6709\u9009\u4E2D\u4EFB\u4F55\u9879 Plugin-Redis_View=\u89c6\u56fe -Plugin-Redis_Table=\u8868 \ No newline at end of file +Plugin-Redis_Table=\u8868 +Plugin-Redis_Preview=\u9884\u89c8 +Plugin-Redis_Refresh=\u5237\u65B0 +Plugin-Redis_Data_Connection=\u6570\u636e\u8fde\u63a5 +Plugin-Redis_Set_Parameter=\u53c2\u6570\u8bbe\u7f6e +Plugin-Redis_Set_Parameter_Name=\u53c2\u6570\u540d +Plugin-Redis_Set_Parameter_Type=\u53c2\u6570\u7c7b\u578b +Plugin-Redis_Set_Parameter_Value=\u9ed8\u8ba4\u503c \ No newline at end of file diff --git a/src/web/assets/scripts/dec.js b/src/web/assets/scripts/dec.js new file mode 100644 index 0000000..987960e --- /dev/null +++ b/src/web/assets/scripts/dec.js @@ -0,0 +1,19 @@ +window.DecCst = { + Schedule: { + Parameter: { + Type: { + BOOLEAN: "Boolean", + DATA_SET: "TableColumn", + DATE: "Date", + DOUBLE: "Double", + FORMULA: "Formula", + INTEGER: "Integer", + STRING: "String", + } + } + } +}; + +window.Dec = { + fineServletURL: '/webroot/decision', +} \ No newline at end of file diff --git a/src/web/index.html b/src/web/index.html index ae111f5..a873833 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -22,13 +22,10 @@ href="./node_modules/fineui-materials/docs/materials.min.css" /> -
+ diff --git a/src/web/private/i18n.ts b/src/web/private/i18n.ts index 995b7a3..f29deca 100644 --- a/src/web/private/i18n.ts +++ b/src/web/private/i18n.ts @@ -42,22 +42,11 @@ export const i18n = { 'Plugin-Redis_Proxy_Private_Key_Path_Mark': '请输入服务器文件路径', 'Plugin-Redis_Connection_Form_OriginalCharsetName': '编码', 'Plugin-Redis_Check_Integer': '请输入不小于0的整数', - 'Plugin-Redis_Parameter_Insert': '插入', - 'Plugin-Redis_Parameter_Delete': '删除', - 'Plugin-Redis_Parameter_Move_Up': '上移', - 'Plugin-Redis_Parameter_Move_Down': '下移', - 'Plugin-Redis_Parameter_Refresh': '刷新', - 'Plugin-Redis_Dataset_Parameter_Name': '参数', - 'Plugin-Redis_Dataset_Parameter_Value': '值', - 'Plugin-Redis_Parameter_Please_Set_Parameter_Name': '请先设置参数名', - 'Plugin-Redis_Parameter_Type_String': '字符串', - 'Plugin-Redis_Parameter_Type_Int': '整型', - 'Plugin-Redis_Parameter_Type_Number': '双精度型', - 'Plugin-Redis_Parameter_Type_Date': '日期', - 'Plugin-Redis_Parameter_Type_Boolean': '布尔型', - 'Plugin-Redis_Parameter_Type_Formula': '公式', - 'Plugin-Redis_Parameter_Delete_Confirm': '你确定决定删除选中的项?', - 'Plugin-Redis_Parameter_Delete_Alert': '当前列表为空或者你没有选中任何项', 'Plugin-Redis_View': '视图', 'Plugin-Redis_Table': '表', + 'Plugin-Redis_Data_Connection': '数据连接', + 'Plugin-Redis_Set_Parameter': '参数设置', + 'Plugin-Redis_Set_Parameter_Name': '参数名', + 'Plugin-Redis_Set_Parameter_Type': '参数类型', + 'Plugin-Redis_Set_Parameter_Value': '默认值', }; diff --git a/src/web/src/index.ts b/src/web/src/index.ts index d06cca8..6c93924 100644 --- a/src/web/src/index.ts +++ b/src/web/src/index.ts @@ -1,6 +1,7 @@ import { RedisShow } from './modules/app.show'; import { RedisEdit } from './modules/app.edit'; - +import { RedisDataset } from './modules/app.dataset'; +import { RedisProgram } from './modules/app.program'; const ConstantRedisType = 'dec.constant.database.conf.connect.types'; const ConstantRedisShow = 'dec.constant.database.conf.connect.form.Redis.show'; const ConstantRedisEdit = 'dec.constant.database.conf.connect.form.Redis.edit'; @@ -11,6 +12,22 @@ BI.DOM.ready(() => { databaseType: 'Redis', iconUrl: 'com/fr/plugin/db/redis/images/redis.png', }]); + + BI.config('dec.provider.data.set', provider => { + provider.registerDataSetType({ + value: 'Redis', + text: 'Redis数据集', + cardType: RedisDataset.xtype, + }); + }); + + BI.config('dec.provider.data.set', provider => { + provider.registerDataSetType({ + value: 'RedisScript', + text: 'Redis程序数据集', + cardType: RedisProgram.xtype, + }); + }); BI.constant(ConstantRedisShow, RedisShow.xtype); BI.constant(ConstantRedisEdit, RedisEdit.xtype); }); diff --git a/src/web/src/less/font.less b/src/web/src/less/font.less index 1fe0633..c133210 100644 --- a/src/web/src/less/font.less +++ b/src/web/src/less/font.less @@ -1,12 +1,13 @@ @import "../../node_modules/fineui/src/less/resource/font.less"; @import "./lib/font.less"; -.font(refresh-font, @font-refresh); +.font(redis-refresh-font, @font-redis-refresh); .font(input-string-font, @font-input-string); .font(input-formula-font, @font-input-formula); .font(input-date-font, @font-input-date); .font(input-boolean-font, @font-input-boolean); .font(input-int-font, @font-input-int); .font(input-number-font, @font-input-number); -.font(site-font, @font-site); -.font(column-font, @font-column); \ No newline at end of file +.font(redis-site-font, @font-redis-site); +.font(redis-column-font, @font-redis-column); +.font(redis-preview-font, @font-redis-preview); \ No newline at end of file diff --git a/src/web/src/less/lib/font.less b/src/web/src/less/lib/font.less index aa6ad79..4fd2313 100644 --- a/src/web/src/less/lib/font.less +++ b/src/web/src/less/lib/font.less @@ -2,12 +2,13 @@ @fontReportUrl: '$fontReportUrl/'; @fontName: "report"; -@font-refresh: "e6ef"; +@font-redis-refresh: "e6ef"; @font-input-string: "e6e9"; @font-input-formula: "e6c6"; @font-input-date: "e733"; @font-input-boolean: "e656"; @font-input-int: "e7c2"; @font-input-number: "e60b"; -@font-site: "e7c5"; -@font-column: "e76f"; \ No newline at end of file +@font-redis-site: "e7c5"; +@font-redis-column: "e76f"; +@font-redis-preview: "e6f2"; \ No newline at end of file diff --git a/src/web/src/modules/app.constant.ts b/src/web/src/modules/app.constant.ts new file mode 100644 index 0000000..518f333 --- /dev/null +++ b/src/web/src/modules/app.constant.ts @@ -0,0 +1,33 @@ +export const redisParamHeader = [{ + text: BI.i18nText('Plugin-Redis_Set_Parameter_Name'), +}, { + text: BI.i18nText('Plugin-Redis_Set_Parameter_Type'), +}, { + text: BI.i18nText('Plugin-Redis_Set_Parameter_Value'), +}]; + +export const redisField = [{ + text: BI.i18nText('Dec-Basic_String'), + value: DecCst.Schedule.Parameter.Type.STRING, + iconCls: 'string-field-font', +}, { + text: BI.i18nText('Dec-Basic_Integer'), + value: DecCst.Schedule.Parameter.Type.INTEGER, + iconCls: 'number-field-font', +}, { + text: BI.i18nText('Dec-Basic_Double'), + value: DecCst.Schedule.Parameter.Type.DOUBLE, + iconCls: 'number-field-font', +}, { + text: BI.i18nText('Dec-Basic_Date'), + value: DecCst.Schedule.Parameter.Type.DATE, + iconCls: 'date-field-font', +}, { + text: BI.i18nText('Dec-Basic_Boolean'), + value: DecCst.Schedule.Parameter.Type.BOOLEAN, + iconCls: 'string-field-font', +}, { + text: BI.i18nText('Dec-Basic_Formula'), + value: DecCst.Schedule.Parameter.Type.FORMULA, + iconCls: 'string-field-font', +}]; diff --git a/src/web/src/modules/app.dataset.model.ts b/src/web/src/modules/app.dataset.model.ts new file mode 100644 index 0000000..c29f684 --- /dev/null +++ b/src/web/src/modules/app.dataset.model.ts @@ -0,0 +1,46 @@ +import { model, Model } from './core/core'; +import { redisParamHeader } from './app.constant'; +@model() +export class RedisDatasetModel extends Model { + static xtype = 'dec.model.dcm.connection.plugin.redis.dataset' + + context = ['dataSetName', 'ableSave'] + + state() { + return { + parameters: [{ name: '123', type: 'String' }] as { + name: string; + type: string; + value: string; + }[], + }; + } + + actions = { + setAbleSave(ableSave: boolean) { + this.model.ableSave = ableSave; + }, + setParameters: (parameters: { + name: string; + type: string; + value: string; + }[]) => { + this.model.parameters = parameters; + }, + setParamType: (index: number, type: string) => { + if (this.model.parameters[index].type !== type) { + this.model.parameters[index].type = type; + this.model.parameters[index].value = BI.Services.getService('dec.service.data.set').getDefaultValueByType(type); + this.model.parameters.splice(0, 0); + } + }, + } + + computed = { + paramHeader: () => redisParamHeader.map(item => BI.extend({ + textAlign: 'left', + height: 30, + hgap: 10, + }, item)), + } +} diff --git a/src/web/src/modules/app.dataset.ts b/src/web/src/modules/app.dataset.ts index 5bad9fb..c20c354 100644 --- a/src/web/src/modules/app.dataset.ts +++ b/src/web/src/modules/app.dataset.ts @@ -1,29 +1,62 @@ -import { shortcut } from '@core/core'; -import { VerticalXtype, TextEditorXtype, HtapeXtype, LabelXtype, IconComboXtype, TabXtype, CodeEditorXtype } from 'ui'; -import { Parameter } from './components/parameter/parameter'; +import { shortcut, store } from '@core/core'; +import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, CodeEditorXtype, ComponentsStyleTable, ButtonXtype, IconTextValue_Combo } from 'ui'; import { TableList } from './table_list/table_list'; import '../less/index.less'; +import { DatabaseIndex } from './components/database_index/database_index'; +import { RedisDatasetModel } from './app.dataset.model'; +import './app.less'; +import { redisField } from './app.constant'; @shortcut() +@store(RedisDatasetModel) export class RedisDataset extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.dataset' private textWidth = 100; - databaseNoTab: any; + databaseIndex: DatabaseIndex; iconCombo: any; + queryCondition: any; + tableList: TableList; + parameterEditor: any; + + store: RedisDatasetModel['store'] + model: RedisDatasetModel['model'] + + props = { + value: { + database: '', + orderValue: '0', + query: '', + parameters: [], + }, + } + + watch = { + parameters: () => { + this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); + }, + } render() { + const { database, orderValue, query, parameters } = this.options.value; + this.store.setParameters(parameters); + return { type: HtapeXtype, + tgap: 15, items: [{ el: { type: TableList.xtype, cls: 'bi-border-right', + database, + ref: (_ref: any) => { + this.tableList = _ref; + }, }, width: 300, }, { type: VerticalXtype, - hgap: 5, - vgap: 10, + lgap: 5, + bgap: 10, items: [{ type: HtapeXtype, height: 22, @@ -58,39 +91,24 @@ export class RedisDataset extends BI.Widget { eventName: 'EVENT_CHANGE', action: () => { const typeValue = this.iconCombo.getValue()[0]; - this.databaseNoTab.setSelect(typeValue); + this.databaseIndex.setSelect(typeValue); }, }], }, width: 28, }, { - type: TabXtype, - single: true, - showIndex: 'int', + type: DatabaseIndex.xtype, + rgap: 11, + value: orderValue, ref: (_ref: any) => { - this.databaseNoTab = _ref; - }, - cardCreator: (index: 'int'|'formula') => { - if (index === 'int') { - return { - type: TextEditorXtype, - warningTitle: '', - value: 0, - validationChecker: (v: string) => this.checkInteger(v), - errorText: BI.i18nText('Plugin-Redis_Check_Integer'), - }; - } - - return { - type: TextEditorXtype, - allowBlank: true, - }; + this.databaseIndex = _ref; }, }], }], }, { type: HtapeXtype, height: 200, + rgap: 5, items: [{ el: { type: LabelXtype, @@ -102,15 +120,98 @@ export class RedisDataset extends BI.Widget { type: CodeEditorXtype, cls: 'bi-border', height: 200, + value: query, + ref: (_ref: any) => { + this.queryCondition = _ref; + }, + listeners: [{ + eventName: 'EVENT_CHANGE', + action: () => { + const value = this.queryCondition.getValue(); + this.store.setAbleSave(!!value); + }, + }], }], }, { - type: Parameter.xtype, + type: HtapeXtype, + height: 24, + rgap: 5, + items: [{ + type: LabelXtype, + height: 24, + text: BI.i18nText('Plugin-Redis_Set_Parameter'), + textAlign: 'left', + }, { + el: { + type: ButtonXtype, + text: BI.i18nText('Plugin-Redis_Refresh'), + level: 'ignore', + handler: () => { + Dec.Utils.getDataSetParameters(this.getValue(), res => { + const newParameters = BI.Services.getService('dec.service.data.set').getParameters(res.data, this.model.parameters); + this.store.setParameters(newParameters); + }); + }, + }, + width: 80, + }, { + el: { + type: ButtonXtype, + text: BI.i18nText('Plugin-Redis_Preview'), + }, + width: 80, + }], + }, { + type: ComponentsStyleTable, + cls: 'param-table', + height: 200, + columnSize: [250, 250, ''], + items: this.renderItems(), + header: [this.model.paramHeader], + ref: (_ref: any) => { + this.parameterEditor = _ref; + }, }], }], }; } - private checkInteger(value: string) { - return /^[\d]+$/.test(value); + private renderItems() { + const self = this; + + return this.model.parameters.map((item, index) => [{ + type: LabelXtype, + text: item.name, + textAlign: 'left', + height: 30, + lgap: 10, + }, { + type: IconTextValue_Combo, + cls: 'field-type-change', + height: 30, + items: redisField, + value: item.type, + listeners: [{ + eventName: BI.IconTextValueCombo.EVENT_CHANGE, + action () { + self.store.setParamType(index, this.getValue()[0]); + }, + }], + }, { + type: LabelXtype, + text: item.name, + textAlign: 'left', + height: 30, + lgap: 10, + }]); + } + + public getValue() { + return { + database: this.tableList.getSelectedDatabase(), + orderValue: this.databaseIndex.getValue(), + query: this.queryCondition.getValue(), + parameters: this.model.parameters, + }; } } diff --git a/src/web/src/modules/app.less b/src/web/src/modules/app.less new file mode 100644 index 0000000..59fe9cd --- /dev/null +++ b/src/web/src/modules/app.less @@ -0,0 +1,7 @@ +@import '../less/index.less'; + +.param-table { + .dec-dynamic-date-combo .even-row { + background-color: @background-color-default; + } +} \ No newline at end of file diff --git a/src/web/src/modules/app.program.ts b/src/web/src/modules/app.program.ts index 1346eeb..7d4d6a6 100644 --- a/src/web/src/modules/app.program.ts +++ b/src/web/src/modules/app.program.ts @@ -1,29 +1,64 @@ -import { shortcut } from '@core/core'; -import { VerticalXtype, TextEditorXtype, HtapeXtype, LabelXtype, IconComboXtype, TabXtype, CodeEditorXtype, TextValueComboXtype } from 'ui'; -import { Parameter } from './components/parameter/parameter'; +import { shortcut, store } from '@core/core'; +import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, TextValueComboXtype, CodeEditorXtype, ComponentsStyleTable, ButtonXtype, IconTextValue_Combo } from 'ui'; import { TableList } from './table_list/table_list'; import '../less/index.less'; +import { DatabaseIndex } from './components/database_index/database_index'; +import { RedisDatasetModel } from './app.dataset.model'; +import './app.less'; +import { redisField } from './app.constant'; @shortcut() +@store(RedisDatasetModel) export class RedisProgram extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.program' private textWidth = 100; - databaseNoTab: any; + databaseIndex: DatabaseIndex; iconCombo: any; + queryCondition: any; + tableList: TableList; + parameterEditor: any; + engineTypeSelect: any; + + store: RedisDatasetModel['store'] + model: RedisDatasetModel['model'] + + props = { + value: { + database: '', + orderValue: '0', + script: '', + engineType: 0, + parameters: [], + }, + } + + watch = { + parameters: () => { + this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); + }, + } render() { + const { database, orderValue, script, parameters, engineType } = this.options.value; + this.store.setParameters(parameters); + return { type: HtapeXtype, + tgap: 15, items: [{ el: { type: TableList.xtype, cls: 'bi-border-right', + database, + ref: (_ref: any) => { + this.tableList = _ref; + }, }, width: 300, }, { type: VerticalXtype, - hgap: 5, - vgap: 10, + lgap: 5, + bgap: 10, items: [{ type: HtapeXtype, height: 22, @@ -58,39 +93,24 @@ export class RedisProgram extends BI.Widget { eventName: 'EVENT_CHANGE', action: () => { const typeValue = this.iconCombo.getValue()[0]; - this.databaseNoTab.setSelect(typeValue); + this.databaseIndex.setSelect(typeValue); }, }], }, width: 28, }, { - type: TabXtype, - single: true, - showIndex: 'int', + type: DatabaseIndex.xtype, + rgap: 11, + value: orderValue, ref: (_ref: any) => { - this.databaseNoTab = _ref; - }, - cardCreator: (index: 'int'|'formula') => { - if (index === 'int') { - return { - type: TextEditorXtype, - warningTitle: '', - value: 0, - validationChecker: (v: string) => this.checkInteger(v), - errorText: BI.i18nText('Plugin-Redis_Check_Integer'), - }; - } - - return { - type: TextEditorXtype, - allowBlank: true, - }; + this.databaseIndex = _ref; }, }], }], }, { type: HtapeXtype, height: 22, + rgap: 5, items: [{ el: { type: LabelXtype, @@ -100,21 +120,26 @@ export class RedisProgram extends BI.Widget { width: this.textWidth, }, { type: TextValueComboXtype, + value: engineType, + ref: (_ref: any) => { + this.engineTypeSelect = _ref; + }, items: [{ text: BI.i18nText('Plugin-Redis_Script_Engine_Type_Default'), - value: '', + value: 0, }, { text: BI.i18nText('Plugin-Redis_Script_Engine_Type_V8'), - value: 'v8', + value: 1, }], }], }, { type: HtapeXtype, height: 200, + rgap: 5, items: [{ el: { type: LabelXtype, - text: BI.i18nText('Plugin-Redis_Query_Condition'), + text: BI.i18nText('Plugin-Redis_Script_Query_Text'), textAlign: 'left', }, width: this.textWidth, @@ -122,15 +147,99 @@ export class RedisProgram extends BI.Widget { type: CodeEditorXtype, cls: 'bi-border', height: 200, + value: script, + ref: (_ref: any) => { + this.queryCondition = _ref; + }, + listeners: [{ + eventName: 'EVENT_CHANGE', + action: () => { + const value = this.queryCondition.getValue(); + this.store.setAbleSave(!!value); + }, + }], + }], + }, { + type: HtapeXtype, + height: 24, + rgap: 5, + items: [{ + type: LabelXtype, + height: 24, + text: BI.i18nText('Plugin-Redis_Set_Parameter'), + textAlign: 'left', + }, { + el: { + type: ButtonXtype, + text: BI.i18nText('Plugin-Redis_Refresh'), + level: 'ignore', + handler: () => { + Dec.Utils.getDataSetParameters(this.getValue(), res => { + const newParameters = BI.Services.getService('dec.service.data.set').getParameters(res.data, this.model.parameters); + this.store.setParameters(newParameters); + }); + }, + }, + width: 80, + }, { + el: { + type: ButtonXtype, + text: BI.i18nText('Plugin-Redis_Preview'), + }, + width: 80, }], }, { - type: Parameter.xtype, + type: ComponentsStyleTable, + cls: 'param-table', + height: 200, + columnSize: [250, 250, ''], + items: this.renderItems(), + header: [this.model.paramHeader], + ref: (_ref: any) => { + this.parameterEditor = _ref; + }, }], }], }; } - private checkInteger(value: string) { - return /^[\d]+$/.test(value); + private renderItems() { + const self = this; + + return this.model.parameters.map((item, index) => [{ + type: LabelXtype, + text: item.name, + textAlign: 'left', + height: 30, + lgap: 10, + }, { + type: IconTextValue_Combo, + cls: 'field-type-change', + height: 30, + items: redisField, + value: item.type, + listeners: [{ + eventName: BI.IconTextValueCombo.EVENT_CHANGE, + action () { + self.store.setParamType(index, this.getValue()[0]); + }, + }], + }, { + type: LabelXtype, + text: item.name, + textAlign: 'left', + height: 30, + lgap: 10, + }]); + } + + public getValue() { + return { + database: this.tableList.getSelectedDatabase(), + orderValue: this.databaseIndex.getValue(), + script: this.queryCondition.getValue(), + engineType: this.engineTypeSelect.getValue()[0], + parameters: this.model.parameters, + }; } } diff --git a/src/web/src/modules/components/database_index/database_index.model.ts b/src/web/src/modules/components/database_index/database_index.model.ts new file mode 100644 index 0000000..bf43dad --- /dev/null +++ b/src/web/src/modules/components/database_index/database_index.model.ts @@ -0,0 +1,18 @@ +import { model, Model } from '../../core/core'; + +@model() +export class DatabaseIndexModel extends Model { + static xtype = 'plugin.model.report.redis.components.database_index' + + state() { + return { + inputValue: '', + }; + } + + actions = { + setInpueValue: (value: string) => { + this.model.inputValue = value; + }, + } +} diff --git a/src/web/src/modules/components/database_index/database_index.ts b/src/web/src/modules/components/database_index/database_index.ts new file mode 100644 index 0000000..4da437f --- /dev/null +++ b/src/web/src/modules/components/database_index/database_index.ts @@ -0,0 +1,70 @@ +import { shortcut, store } from '@core/core'; +import { TabXtype, TextEditorXtype } from 'ui'; +import { DatabaseIndexModel } from './database_index.model'; + +@shortcut() +@store(DatabaseIndexModel) +export class DatabaseIndex extends BI.Widget { + static xtype = 'plugin.report.redis.components.database_index' + + databaseIndexTab: any; + textEditor: any; + + model: DatabaseIndexModel['model'] + store: DatabaseIndexModel['store'] + + props = { + value: '', + } + + render() { + const { value } = this.options; + this.store.setInpueValue(value); + + return { + type: TabXtype, + single: true, + showIndex: 'int', + ref: (_ref: any) => { + this.databaseIndexTab = _ref; + }, + cardCreator: (index: 'int'|'formula') => { + if (index === 'int') { + return { + type: TextEditorXtype, + warningTitle: '', + value: this.model.inputValue, + validationChecker: (v: string) => this.checkInteger(v), + errorText: BI.i18nText('Plugin-Redis_Check_Integer'), + listeners: [{ + eventName: 'EVENT_CHANGE', + action: () => { + this.store.setInpueValue(this.textEditor.getValue()); + }, + }], + ref: (_ref: any) => { + this.textEditor = _ref; + }, + }; + } + + return { + type: TextEditorXtype, + allowBlank: true, + value: this.model.inputValue, + }; + }, + }; + } + private checkInteger(value: string) { + return /^[\d]+$/.test(value); + } + + public setSelect(value: string) { + this.databaseIndexTab.setSelect(value); + } + + public getValue() { + return this.model.inputValue; + } +} diff --git a/src/web/src/modules/components/parameter/parameter.ts b/src/web/src/modules/components/parameter/parameter.ts index b9b6277..60e48b7 100644 --- a/src/web/src/modules/components/parameter/parameter.ts +++ b/src/web/src/modules/components/parameter/parameter.ts @@ -92,7 +92,7 @@ export class Parameter extends BI.Widget { }, }, showRefresh ? { type: IconButtonXtype, - cls: 'refresh-font', + cls: 'redis-refresh-font', width: 25, title: BI.i18nText('Plugin-Redis_Parameter_Refresh'), handler: () => { diff --git a/src/web/src/modules/constants/env.ts b/src/web/src/modules/constants/env.ts new file mode 100644 index 0000000..3e490f1 --- /dev/null +++ b/src/web/src/modules/constants/env.ts @@ -0,0 +1,4 @@ +export const fineServletURL = Dec.fineServletURL; +export const ReqPrefix = `${fineServletURL}/v10/config/connection`; +export const ImgPrefix = `${fineServletURL}/resources?path=/com/fr/web/resources/dist/images/2x/icon/database/`; +export const PluginImgPrefix = `${fineServletURL}/resources?path=`; diff --git a/src/web/src/modules/crud/crud.request.ts b/src/web/src/modules/crud/crud.request.ts new file mode 100644 index 0000000..c559a0a --- /dev/null +++ b/src/web/src/modules/crud/crud.request.ts @@ -0,0 +1,22 @@ +import { requestGet } from './crud.service'; +export function getConnectionlist(): Promise<{data?: Connection[]}> { + return requestGet('/v10/config/connection/list'); +} + +export function getTableList(database: string, pattern = ''): Promise<{data?: string[]}> { + return requestGet('com.fr.solution.plugin.db.redis.v10/redis/keys', { + database, + pattern, + }); +} + +export interface Connection { + connectionId: string; + connectionType: string; + connectionName: string; + creator?: string; + privilegeDetailBeanList?: { + privilegeType: number; + privilegeValue: number; + }[] +} diff --git a/src/web/src/modules/crud/crud.service.ts b/src/web/src/modules/crud/crud.service.ts new file mode 100644 index 0000000..1958510 --- /dev/null +++ b/src/web/src/modules/crud/crud.service.ts @@ -0,0 +1,135 @@ +import 'es6-promise/auto'; +import axios, { AxiosResponse, AxiosError } from 'axios'; +import { fineServletURL } from '../constants/env'; +const defaultHeaders = { + 'Content-Type': 'application/json', + 'X-Requested-With': 'XMLHttpRequest', +}; + +export function paramsSerializer(params: { [key: string]: any }) { + return Object.keys(params || {}) + .map(paramKey => { + const paramValue = params[paramKey]; + + let value = ''; + + if (BI.isObject(paramValue)) { + value = encodeURIComponent(JSON.stringify(paramValue)); + } else { + value = paramValue; + } + + return BI.isNull(value) ? '' : `${paramKey}=${value}`; + }) + .filter(v => v !== '') + .join('&'); +} +function getCookieByName(name: string):string { + let value = null; + const regExpName = new RegExp(name); + document.cookie.split(';').forEach((item: string) => { + if (item.match(regExpName)) { + value = item.split(`${name}=`)[1]; + + return false; + } + }); + + return value; +} + +function checkStatus(response: AxiosResponse) { + const status = response.status; + + const resData = status === 200 + ? typeof response.data === 'string' + ? BI.jsonDecode(response.data) + : response.data + : {}; + + return resData; +} + +export async function request(reqOptions: CrudReqOpts = {}): Promise { + const { url, type, headers, data, params } = reqOptions; + + return axios + .request({ + url, + baseURL: fineServletURL, + method: type, + headers: { + ...defaultHeaders, + ...headers, + Authorization: `Bearer ${getCookieByName('fine_auth_token')}`, + 'Content-Type': 'application/json;charset=UTF-8', + }, + params, + paramsSerializer, + data, + }) + .then(checkStatus) + .catch((error: AxiosError) => { + console.log(error); + }); +} + +export function requestGet(url: string, params: CrudParams = {}) { + const timeStamp = new Date().getTime(); + + return request({ + url, + type: 'GET', + params: { + ...params, + _: timeStamp, + }, + }); +} + +export function requestPost(url: string, data = {}, params: CrudParams = {}) { + return request({ + url, + type: 'POST', + data, + params, + }); +} + +export function requestDelete(url: string, data = {}) { + return request({ + url, + type: 'DELETE', + data, + }); +} + +export function requestPut(url: string, data = {}, params: CrudParams = {}) { + return request({ + url, + type: 'PUT', + data, + params, + }); +} + +interface CrudReqOpts { + url?: string; + type?: 'GET' | 'POST' | 'DELETE' | 'PUT'; + data?: any; + headers?: { + [key: string]: string; + }; + noProgress?: boolean; + params?: CrudParams; +} + +interface CrudParams { + [key: string]: string | number | { [key: string]: any }; +} + +interface ResultType { + data?: any; + errorCode?: string; + errorMsg?: string; +} diff --git a/src/web/src/modules/table_list/list_item.ts b/src/web/src/modules/table_list/list_item.ts index c9a59f9..15aa35a 100644 --- a/src/web/src/modules/table_list/list_item.ts +++ b/src/web/src/modules/table_list/list_item.ts @@ -6,24 +6,34 @@ export class ListItem extends BI.BasicButton { props = { text: '', height: 20, + showIcon: false, baseCls: 'bi-list-item-active', } render() { - const { text } = this.options; - - return { - type: HtapeXtype, - items: [{ - el: { - type: IconLabelXtype, - cls: 'column-font', - }, - width: 25, - }, { + const { text, showIcon } = this.options; + if(showIcon){ + return { + type: HtapeXtype, + items: [{ + el: { + type: IconLabelXtype, + cls: 'redis-column-font', + }, + width: 25, + }, { + type: LabelXtype, + textAlign: 'left', + text, + }], + }; + }else{ + return { type: LabelXtype, textAlign: 'left', + lgap: 5, text, - }], - }; + } + } + } } diff --git a/src/web/src/modules/table_list/table_list.model.ts b/src/web/src/modules/table_list/table_list.model.ts new file mode 100644 index 0000000..87c6039 --- /dev/null +++ b/src/web/src/modules/table_list/table_list.model.ts @@ -0,0 +1,38 @@ +import { model, Model } from '@core/core'; +import { getConnectionlist, getTableList } from '../crud/crud.request'; +@model() +export class TableModelModel extends Model { + static xtype = 'dec.model.dcm.connection.plugin.redis.table_list'; + + state() { + return { + connections: [] as string[], + tables: [] as string[], + search: '', + selectedConnection: '', + }; + } + + actions = { + initData: () => { + getConnectionlist().then(re => { + this.model.connections = re.data.filter(item => item.connectionType === 'Redis').map(item => item.connectionName); + }); + }, + initTableList: () => { + if (this.model.selectedConnection) { + getTableList(this.model.selectedConnection, this.model.search).then(re => { + this.model.tables = re ? re.data : []; + }); + } else { + this.model.tables = []; + } + }, + setSearch(value: string) { + this.model.search = value; + }, + setSelectedConnection(name: string) { + this.model.selectedConnection = name; + }, + } +} diff --git a/src/web/src/modules/table_list/table_list.ts b/src/web/src/modules/table_list/table_list.ts index 55d5b45..c0253f5 100644 --- a/src/web/src/modules/table_list/table_list.ts +++ b/src/web/src/modules/table_list/table_list.ts @@ -1,29 +1,76 @@ -import { shortcut } from '@core/core'; -import { VtapeXtype, HtapeXtype, IconButtonXtype, TextValueComboXtype, ButtonXtype, TextEditorXtype, ButtonGroupXtype, VerticalXtype, MultiSelectItemXtype, LeftXtype } from 'ui'; +import { shortcut, store } from '@core/core'; +import { VtapeXtype, HtapeXtype, IconButtonXtype, TextValueComboXtype, ButtonXtype, TextEditorXtype, ButtonGroupXtype, VerticalXtype } from 'ui'; import { ListItem } from './list_item'; +import { TableModelModel } from './table_list.model'; +import { fineServletURL } from '@constants/env'; + @shortcut() +@store(TableModelModel) export class TableList extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.table_list' + store: TableModelModel['store'] + model: TableModelModel['model'] + + buttonGroup: any; + connectionTextValue: any; + searchText: any; + + props = { + database: '', + } + + watch = { + connections: () => { + this.connectionTextValue.populate(this.renderConnectionList()); + const name = this.model.connections.length > 0 ? this.model.connections[0] : ''; + this.connectionTextValue.setValue(name); + this.store.setSelectedConnection(name); + }, + 'selectedConnection || search': () => { + this.store.initTableList(); + }, + } + render() { return { type: VtapeXtype, + hgap: 10, + bgap: 5, items: [{ el: { type: HtapeXtype, items: [{ type: TextValueComboXtype, + ref: (_ref: any) => { + this.connectionTextValue = _ref; + }, items: [], + listeners: [{ + eventName: BI.TextValueCombo.EVENT_CHANGE, + action: () => { + const name = this.connectionTextValue.getValue()[0]; + this.store.setSelectedConnection(name); + }, + }], }, { el: { type: IconButtonXtype, - cls: 'site-font', + cls: 'redis-site-font', + title: BI.i18nText('Plugin-Redis_Data_Connection'), + handler: () => { + window.location.href = `${fineServletURL}#management/connection`; + }, }, width: 25, }, { el: { type: IconButtonXtype, - cls: 'refresh-font', + cls: 'redis-refresh-font', + title: BI.i18nText('Plugin-Redis_Refresh'), + handler: () => { + this.store.initData(); + }, }, width: 25, }], @@ -36,11 +83,17 @@ export class TableList extends BI.Widget { type: TextEditorXtype, height: 24, watermark: BI.i18nText('Plugin-Redis_Keys_Pattern'), + ref: (_ref: any) => { + this.searchText = _ref; + }, }, { el: { type: ButtonXtype, minWidth: 50, text: BI.i18nText('Plugin-Redis_Keys_Pattern_Search'), + handler: () => { + this.store.setSearch(this.searchText.getValue()); + }, }, width: 50, }], @@ -50,35 +103,21 @@ export class TableList extends BI.Widget { type: VtapeXtype, items: [{ type: ButtonGroupXtype, + chooseType: BI.Selection.None, layouts: [{ type: VerticalXtype, }], - items: this.renderList(), - }, { - el: { - type: LeftXtype, - height: 25, - hgap: 40, - items: [{ - type: MultiSelectItemXtype, - width: 80, - selected: true, - text: BI.i18nText('Plugin-Redis_Table'), - }, { - type: MultiSelectItemXtype, - width: 80, - selected: true, - text: BI.i18nText('Plugin-Redis_View'), - }], + items: [], + ref: (_ref: any) => { + this.buttonGroup = _ref; }, - height: 25, }], }], }; } - private renderList() { - return ['demo1', 'demo2'].map(item => { + private renderConnectionList() { + return this.model.connections.map(item => { return { type: ListItem.xtype, text: item, @@ -86,4 +125,12 @@ export class TableList extends BI.Widget { }; }); } + + mounted() { + this.store.initData(); + } + + public getSelectedDatabase() { + return this.model.selectedConnection; + } } diff --git a/src/web/src/ui/fineui.ts b/src/web/src/ui/fineui.ts index 9b662a5..760af2b 100644 --- a/src/web/src/ui/fineui.ts +++ b/src/web/src/ui/fineui.ts @@ -54,6 +54,8 @@ export const FileXtype = 'bi.file'; export const IconComboXtype = 'bi.icon_combo'; export const NumberEditorXtype = 'bi.number_editor'; export const CodeEditorXtype = 'bi.code_editor'; +export const ComponentsStyleTable = 'bi.components.style_table'; +export const IconTextValue_Combo = 'bi.icon_text_value_combo'; // 布局 export const VerticalAdaptXtype = 'bi.vertical_adapt'; export const VtapeXtype = 'bi.vtape'; diff --git a/src/web/types/globals.d.ts b/src/web/types/globals.d.ts index ea354bf..fe8ec3b 100644 --- a/src/web/types/globals.d.ts +++ b/src/web/types/globals.d.ts @@ -2,7 +2,7 @@ interface Obj { [key: string]: any; } -declare let BI: Obj & import('fineui')._BI; +declare let BI: Obj & import('fineui').BI & import('fineui-materials').BI; declare const Fix: Obj; declare const DecCst: Obj; declare const Dec: Obj; \ No newline at end of file diff --git a/src/web/webpack/webpack.dev.js b/src/web/webpack/webpack.dev.js index 02a0e79..8dd8311 100644 --- a/src/web/webpack/webpack.dev.js +++ b/src/web/webpack/webpack.dev.js @@ -54,6 +54,12 @@ module.exports = merge(common, { contentBase: path.join(__dirname, '..'), port: 10004, liveReload: true, + proxy: { + '/webroot/decision': { + target: 'http://localhost:8075', + secure: false, + }, + }, }, plugins: [ new MiniCssExtractPlugin({ diff --git a/src/web/yarn.lock b/src/web/yarn.lock index c31b713..e5fdcbf 100644 --- a/src/web/yarn.lock +++ b/src/web/yarn.lock @@ -30,17 +30,17 @@ source-map "^0.5.0" "@babel/core@^7.1.0": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== + version "7.6.4" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" + integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/generator" "^7.6.4" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.4" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.3" + "@babel/types" "^7.6.3" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -49,16 +49,15 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.4.4", "@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== +"@babel/generator@^7.4.0", "@babel/generator@^7.4.4", "@babel/generator@^7.6.3", "@babel/generator@^7.6.4": + version "7.6.4" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" + integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.6.3" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" @@ -84,10 +83,10 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.5": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz#401f302c8ddbc0edd36f7c6b2887d8fa1122e5a4" - integrity sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg== +"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.6.0": + version "7.6.0" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" + integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.5.5" @@ -227,14 +226,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.4", "@babel/helpers@^7.5.5": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" - integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== +"@babel/helpers@^7.4.4", "@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" "@babel/highlight@^7.0.0": version "7.5.0" @@ -245,10 +244,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5", "@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.5", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": + version "7.6.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" + integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -285,9 +284,9 @@ "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-proposal-object-rest-spread@^7.4.4": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" - integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== + version "7.6.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" + integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -301,13 +300,13 @@ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" - integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + version "7.6.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" + integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + regexpu-core "^4.6.0" "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -375,9 +374,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-block-scoping@^7.4.4": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== + version "7.6.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" + integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" @@ -404,20 +403,20 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-destructuring@^7.4.4": - version "7.5.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== + version "7.6.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + version "7.6.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" + integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + regexpu-core "^4.6.0" "@babel/plugin-transform-duplicate-keys@^7.2.0": version "7.5.0" @@ -473,9 +472,9 @@ babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-commonjs@^7.4.4": - version "7.5.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== + version "7.6.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" @@ -500,11 +499,11 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.4.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" - integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== + version "7.6.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" + integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== dependencies: - regexp-tree "^0.1.6" + regexpu-core "^4.6.0" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -559,9 +558,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + version "7.6.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" + integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -589,22 +588,22 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-typescript@^7.3.2": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" - integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== + version "7.6.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.3.tgz#dddb50cf3b8b2ef70b22e5326e9a91f05a1db13b" + integrity sha512-aiWINBrPMSC3xTXRNM/dfmyYuPNKY/aexYqBgh0HBI5Y+WO5oRAqW/oROYeYHrF4Zw12r9rK4fMk/ZlAmqx/FQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-create-class-features-plugin" "^7.6.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" "@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + version "7.6.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" + integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + regexpu-core "^4.6.0" "@babel/polyfill@7.4.4": version "7.4.4" @@ -677,40 +676,40 @@ "@babel/plugin-transform-typescript" "^7.3.2" "@babel/runtime@^7.0.0": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" - integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== + version "7.6.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" + integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== +"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.5": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": + version "7.6.3" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" + integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" + "@babel/generator" "^7.6.3" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/parser" "^7.6.3" + "@babel/types" "^7.6.3" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": + version "7.6.3" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" + integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -724,76 +723,77 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@jest/console@^24.7.1": - version "24.7.1" - resolved "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" - integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== dependencies: - "@jest/source-map" "^24.3.0" + "@jest/source-map" "^24.9.0" chalk "^2.0.1" slash "^2.0.0" -"@jest/core@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz#fbbdcd42a41d0d39cddbc9f520c8bab0c33eed5b" - integrity sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A== +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== dependencies: "@jest/console" "^24.7.1" - "@jest/reporters" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" ansi-escapes "^3.0.0" chalk "^2.0.1" exit "^0.1.2" graceful-fs "^4.1.15" - jest-changed-files "^24.8.0" - jest-config "^24.8.0" - jest-haste-map "^24.8.0" - jest-message-util "^24.8.0" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" jest-regex-util "^24.3.0" - jest-resolve-dependencies "^24.8.0" - jest-runner "^24.8.0" - jest-runtime "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" - jest-watcher "^24.8.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" micromatch "^3.1.10" p-each-series "^1.0.0" - pirates "^4.0.1" realpath-native "^1.1.0" rimraf "^2.5.4" + slash "^2.0.0" strip-ansi "^5.0.0" -"@jest/environment@^24.7.1", "@jest/environment@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz#0342261383c776bdd652168f68065ef144af0eac" - integrity sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw== - dependencies: - "@jest/fake-timers" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - -"@jest/fake-timers@^24.7.1", "@jest/fake-timers@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz#2e5b80a4f78f284bcb4bd5714b8e10dd36a8d3d1" - integrity sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw== - dependencies: - "@jest/types" "^24.8.0" - jest-message-util "^24.8.0" - jest-mock "^24.8.0" - -"@jest/reporters@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz#075169cd029bddec54b8f2c0fc489fd0b9e05729" - integrity sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw== - dependencies: - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" +"@jest/environment@^24.7.1", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.7.1", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" exit "^0.1.2" glob "^7.1.2" @@ -801,79 +801,80 @@ istanbul-lib-instrument "^3.0.1" istanbul-lib-report "^2.0.4" istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.1.1" - jest-haste-map "^24.8.0" - jest-resolve "^24.8.0" - jest-runtime "^24.8.0" - jest-util "^24.8.0" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" jest-worker "^24.6.0" - node-notifier "^5.2.1" + node-notifier "^5.4.2" slash "^2.0.0" source-map "^0.6.0" string-length "^2.0.0" -"@jest/source-map@^24.3.0": - version "24.3.0" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" - integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== dependencies: callsites "^3.0.0" graceful-fs "^4.1.15" source-map "^0.6.0" -"@jest/test-result@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz#7675d0aaf9d2484caa65e048d9b467d160f8e9d3" - integrity sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng== +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== dependencies: - "@jest/console" "^24.7.1" - "@jest/types" "^24.8.0" + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" "@types/istanbul-lib-coverage" "^2.0.0" -"@jest/test-sequencer@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz#2f993bcf6ef5eb4e65e8233a95a3320248cf994b" - integrity sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg== +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== dependencies: - "@jest/test-result" "^24.8.0" - jest-haste-map "^24.8.0" - jest-runner "^24.8.0" - jest-runtime "^24.8.0" + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" -"@jest/transform@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz#628fb99dce4f9d254c6fd9341e3eea262e06fef5" - integrity sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA== +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" babel-plugin-istanbul "^5.1.0" chalk "^2.0.1" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.15" - jest-haste-map "^24.8.0" - jest-regex-util "^24.3.0" - jest-util "^24.8.0" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" micromatch "^3.1.10" + pirates "^4.0.1" realpath-native "^1.1.0" slash "^2.0.0" source-map "^0.6.1" write-file-atomic "2.4.1" -"@jest/types@^24.7.0", "@jest/types@^24.8.0": - version "24.8.0" - resolved "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz#f31e25948c58f0abd8c845ae26fcea1491dea7ad" - integrity sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg== +"@jest/types@^24.7.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^12.0.9" + "@types/yargs" "^13.0.0" "@types/babel__core@^7.1.0": - version "7.1.2" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" - integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== + version "7.1.3" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -882,9 +883,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + version "7.6.0" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" + integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== dependencies: "@babel/types" "^7.0.0" @@ -903,6 +904,18 @@ dependencies: "@babel/types" "^7.3.0" +"@types/codemirror@0.0.77": + version "0.0.77" + resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.77.tgz#6785a0183b4aea147de650530259ebf2a511bde9" + integrity sha512-nfjRJpAXgkT075jztMp92Ol2b7w7JrDvpfBU70GfVhpfdpWiZi6NqVIO3STGNzWl77/iJkTu2ZSg6hQobrEadg== + dependencies: + "@types/tern" "*" + +"@types/estree@*": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/events@*": version "3.0.0" resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -963,9 +976,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "12.7.1" - resolved "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz#3b5c3a26393c19b400844ac422bd0f631a94d69d" - integrity sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw== + version "12.12.5" + resolved "https://registry.npmjs.org/@types/node/-/node-12.12.5.tgz#66103d2eddc543d44a04394abb7be52506d7f290" + integrity sha512-KEjODidV4XYUlJBF3XdjSH5FWoMCtO0utnhtdLf1AgeuZLOrRbvmU/gaRCVg7ZaQDjVf3l84egiY0mRNe5xE4A== "@types/q@^1.5.1": version "1.5.2" @@ -977,10 +990,24 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": - version "12.0.12" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" - integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== +"@types/tern@*": + version "0.23.3" + resolved "https://registry.npmjs.org/@types/tern/-/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460" + integrity sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w== + dependencies: + "@types/estree" "*" + +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.3" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" + integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== + dependencies: + "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@1.7.0": version "1.7.0" @@ -1168,9 +1195,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + version "2.0.2" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz#a2fba1b122c69a85caa02d10f9270c7219709a9d" + integrity sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg== abbrev@1: version "1.1.1" @@ -1191,17 +1218,17 @@ acorn-dynamic-import@^4.0.0: integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== acorn-globals@^4.1.0, acorn-globals@^4.3.0: - version "4.3.3" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz#a86f75b69680b8780d30edd21eee4e0ea170c05e" - integrity sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ== + version "4.3.4" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + version "5.1.0" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== acorn-walk@^6.0.1: version "6.2.0" @@ -1214,9 +1241,9 @@ acorn@^5.5.3: integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5, acorn@^6.0.7: - version "6.2.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" - integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== + version "6.3.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" + integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== ajv-errors@^1.0.0: version "1.0.1" @@ -1414,12 +1441,7 @@ async-limiter@~1.0.0: resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.5.0: +async@^2.5.0, async@^2.6.2: version "2.6.3" resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -1437,17 +1459,17 @@ atob@^2.1.1: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" - integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== + version "9.7.1" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz#9ffc44c55f5ca89253d9bb7186cefb01ef57747f" + integrity sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw== dependencies: - browserslist "^4.6.3" - caniuse-lite "^1.0.30000980" + browserslist "^4.7.2" + caniuse-lite "^1.0.30001006" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.17" - postcss-value-parser "^4.0.0" + postcss "^7.0.21" + postcss-value-parser "^4.0.2" aws-sign2@~0.7.0: version "0.7.0" @@ -1476,16 +1498,16 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-jest@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589" - integrity sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw== +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== dependencies: - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" "@types/babel__core" "^7.1.0" babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.6.0" + babel-preset-jest "^24.9.0" chalk "^2.4.2" slash "^2.0.0" @@ -1516,20 +1538,20 @@ babel-plugin-istanbul@^5.1.0: istanbul-lib-instrument "^3.3.0" test-exclude "^5.2.3" -babel-plugin-jest-hoist@^24.6.0: - version "24.6.0" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" - integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== dependencies: "@types/babel__traverse" "^7.0.6" -babel-preset-jest@^24.6.0: - version "24.6.0" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" - integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== dependencies: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.6.0" + babel-plugin-jest-hoist "^24.9.0" balanced-match@^1.0.0: version "1.0.0" @@ -1582,9 +1604,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== bluebird@^3.5.5: - version "3.5.5" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + version "3.7.1" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" + integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -1740,23 +1762,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0: - version "4.7.0" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" - integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== - dependencies: - caniuse-lite "^1.0.30000989" - electron-to-chromium "^1.3.247" - node-releases "^1.1.29" - -browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.6: - version "4.6.6" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" - integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.2: + version "4.7.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" + integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== dependencies: - caniuse-lite "^1.0.30000984" - electron-to-chromium "^1.3.191" - node-releases "^1.1.25" + caniuse-lite "^1.0.30001004" + electron-to-chromium "^1.3.295" + node-releases "^1.1.38" bs-logger@0.x: version "0.2.6" @@ -1766,9 +1779,9 @@ bs-logger@0.x: fast-json-stable-stringify "2.x" bser@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -1812,9 +1825,9 @@ bytes@3.1.0: integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== cacache@^12.0.2: - version "12.0.2" - resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c" - integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg== + version "12.0.3" + resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -1899,15 +1912,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000989: - version "1.0.30000999" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz#427253a69ad7bea4aa8d8345687b8eec51ca0e43" - integrity sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg== - -caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984: - version "1.0.30000989" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" - integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001004, caniuse-lite@^1.0.30001006: + version "1.0.30001008" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz#b8841b1df78a9f5ed9702537ef592f1f8772c0d9" + integrity sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw== capture-exit@^2.0.0: version "2.0.0" @@ -1965,26 +1973,7 @@ chokidar@2.1.5: optionalDependencies: fsevents "^1.2.7" -chokidar@^2.0.2, chokidar@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" - integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^2.0.4: +chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.6: version "2.1.8" resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2004,9 +1993,9 @@ chokidar@^2.0.4: fsevents "^1.2.7" chownr@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" - integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== + version "1.1.3" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== chrome-trace-event@^1.0.0: version "1.0.2" @@ -2099,6 +2088,11 @@ code-point-at@^1.0.0: resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codemirror@5.49.0: + version "5.49.0" + resolved "https://registry.npmjs.org/codemirror/-/codemirror-5.49.0.tgz#adedbffcc81091e4a0334bcb96b1ae3b7ada5e3f" + integrity sha512-Hyzr0HToBdZpLBN9dYFO/KlJAsKH37/cXVHPAqa+imml0R92tb9AkmsvjnXL+SluEvjjdfkDgRjc65NG5jnMYA== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2152,10 +2146,10 @@ commander@2.17.x: resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.20.0, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.20.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@~2.19.0: version "2.19.0" @@ -2213,11 +2207,9 @@ connect-history-api-fallback@^1.6.0: integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -2286,17 +2278,17 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.0.tgz#d7fcc4d695d66b069437bd9d9f411274ceb196d3" - integrity sha512-vQve8j3tGPPqIkrsK442hbVwDIGXcngLPnislJaCNJIG1aBWPD0IqRhpxEwjtUOYpzLap8xA7CoGlJBT1ZkcDA== + version "3.3.6" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.6.tgz#70c30dbeb582626efe9ecd6f49daa9ff4aeb136c" + integrity sha512-YnwZG/+0/f7Pf6Lr3jxtVAFjtGBW9lsLYcqrxhYJai1GfvrP8DEyEpnNzj/FRQfIkOOfk1j5tTBvPBLWVVJm4A== dependencies: - browserslist "^4.6.6" + browserslist "^4.7.2" semver "^6.3.0" core-js@^2.6.5: - version "2.6.9" - resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + version "2.6.10" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" + integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2436,21 +2428,13 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" -css-tree@1.0.0-alpha.29: - version "1.0.0-alpha.29" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" - integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-tree@1.0.0-alpha.33: - version "1.0.0-alpha.33" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e" - integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w== +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== dependencies: mdn-data "2.0.4" - source-map "^0.5.3" + source-map "^0.6.1" css-unit-converter@^1.1.1: version "1.1.1" @@ -2540,12 +2524,12 @@ cssnano@^4.1.10: is-resolvable "^1.0.0" postcss "^7.0.0" -csso@^3.5.1: - version "3.5.1" - resolved "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" - integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== dependencies: - css-tree "1.0.0-alpha.29" + css-tree "1.0.0-alpha.37" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" @@ -2560,14 +2544,14 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: cssom "0.3.x" csstype@^2.0.0: - version "2.6.6" - resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41" - integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg== + version "2.6.7" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" + integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ== -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= dashdash@^1.12.0: version "1.14.1" @@ -2585,11 +2569,6 @@ data-urls@^1.0.0, data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2597,7 +2576,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.2.5, debug@^3.2.6: +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2622,9 +2601,16 @@ decode-uri-component@^0.2.0: integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + version "1.1.0" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745" + integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" deep-extend@^0.6.0: version "0.6.0" @@ -2734,10 +2720,10 @@ detect-node@^2.0.4: resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diff-sequences@^24.3.0: - version "24.3.0" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" - integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== diffie-hellman@^5.0.0: version "5.0.3" @@ -2865,20 +2851,15 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.191: - version "1.3.221" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.221.tgz#421a58ac8d1931c8df400d55c7f6fd621710da10" - integrity sha512-YbNA7KgCvLq9ZaEa7wpYP7IP4LrJ4+b36oeF1lYBSJ0zVGVN7uo3Ct9qDUm/M3VDOWj03RVgsMFF8PdL8UjhzA== - -electron-to-chromium@^1.3.247: - version "1.3.283" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.283.tgz#296082f4eca0f53a4c1c4f97946317b39728a5d4" - integrity sha512-CqRYkrJlmcr7gD6Gp1jFy1hkdBZMId1OUlrkQGsaaFJMljQ59UqYlbaG8S7d3yQTbD80uzFWK5b5zHkL9dfVeQ== +electron-to-chromium@^1.3.295: + version "1.3.302" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.302.tgz#4c7ba3d56166507a56f7eb603fdde1ed701f5ac8" + integrity sha512-1qConyiVEbj4xZRBXqtGR003+9tV0rJF0PS6aeO0Ln/UL637js9hdwweCl07meh/kJoI2N4W8q3R3g3F5z46ww== elliptic@^6.0.0: - version "6.5.0" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" - integrity sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg== + version "6.5.1" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" + integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2904,13 +2885,13 @@ encodeurl@~1.0.2: integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: +enhanced-resolve@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -2919,6 +2900,15 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + entities@^1.1.1: version "1.1.2" resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -2943,10 +2933,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.12.0: - version "1.15.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57" - integrity sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ== +es-abstract@^1.12.0, es-abstract@^1.5.1: + version "1.16.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" + integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== dependencies: es-to-primitive "^1.2.0" function-bind "^1.1.1" @@ -2959,18 +2949,6 @@ es-abstract@^1.12.0: string.prototype.trimleft "^2.1.0" string.prototype.trimright "^2.1.0" -es-abstract@^1.5.1: - version "1.13.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -2996,9 +2974,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.11.0, escodegen@^1.9.1: - version "1.11.1" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + version "1.12.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -3021,16 +2999,16 @@ eslint-scope@^4.0.0, eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-utils@^1.3.1: - version "1.4.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz#e2c3c8dba768425f897cf0f9e51fe2e241485d4c" - integrity sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ== + version "1.4.3" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: - eslint-visitor-keys "^1.0.0" + eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@5.16.0: version "5.16.0" @@ -3108,9 +3086,9 @@ esrecurse@^4.1.0: estraverse "^4.1.0" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.2: version "2.0.3" @@ -3127,6 +3105,11 @@ eventemitter3@^3.0.0: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + events@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" @@ -3190,17 +3173,17 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz#471f8ec256b7b6129ca2524b2a62f030df38718d" - integrity sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA== +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" ansi-styles "^3.2.0" - jest-get-type "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-regex-util "^24.3.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" express@4.16.4: version "4.16.4" @@ -3343,9 +3326,9 @@ fast-levenshtein@~2.0.4: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-safe-stringify@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" - integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== + version "2.0.7" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== faye-websocket@^0.10.0: version "0.10.0" @@ -3451,11 +3434,14 @@ findup-sync@3.0.0: "fineui-materials@git+ssh://git@cloud.finedevelop.com:7999/fui/fineui-materials.git#release/10.0": version "1.0.0" - resolved "git+ssh://git@cloud.finedevelop.com:7999/fui/fineui-materials.git#1a5c8beb09f741ff24758b6f4fb64107f643015f" + resolved "git+ssh://git@cloud.finedevelop.com:7999/fui/fineui-materials.git#df3fd3821680cd28edbc5e03b6182d8d7021fc45" + dependencies: + "@types/codemirror" "0.0.77" + codemirror "5.49.0" "fineui@git+ssh://git@cloud.finedevelop.com:7999/visual/fineui.git": version "1.1.2" - resolved "git+ssh://git@cloud.finedevelop.com:7999/visual/fineui.git#3e28b67ed0fb06e5754c3cba46b1c14d55df6436" + resolved "git+ssh://git@cloud.finedevelop.com:7999/visual/fineui.git#9463c7fbf77e9636945a4b08eff8c30cf8664425" flat-cache@^2.0.1: version "2.0.1" @@ -3480,11 +3466,11 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0, follow-redirects@^1.3.0: - version "1.7.0" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" - integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== + version "1.9.0" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" + integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== dependencies: - debug "^3.2.6" + debug "^3.0.0" for-in@^1.0.2: version "1.0.2" @@ -3497,9 +3483,9 @@ forever-agent@~0.6.1: integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= fork-ts-checker-webpack-plugin@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.1.tgz#f82d078ba8911c7b2c70703ffb3cbe588b33fbaa" - integrity sha512-IbVh1Z46dmCXJMg6We8s9jYwCAzzSv2Tgj+G2Sg/8pFantHDBrAg/rQyPnmAWLS/djW7n4VEltoEglbtTvt0wQ== + version "1.6.0" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.6.0.tgz#a81fd1c6bf5258fa5318cf3e9a7e9bac006f7917" + integrity sha512-vqOY5gakcoon2s12V7MMe01OPwfgqulUWFzm+geQaPPOBKjW1I7aqqoBVlU0ECn97liMB0ECs16pRdIGe9qdRw== dependencies: babel-code-frame "^6.22.0" chalk "^2.4.1" @@ -3545,11 +3531,11 @@ from2@^2.1.0: readable-stream "^2.0.0" fs-minipass@^1.2.5: - version "1.2.6" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" - integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + version "1.2.7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^2.2.1" + minipass "^2.6.0" fs-write-stream-atomic@^1.0.8: version "1.0.10" @@ -3641,9 +3627,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.4" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + version "7.1.5" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" + integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3705,9 +3691,9 @@ globby@^6.1.0: pinkie-promise "^2.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.1" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz#1c1f0c364882c868f5bff6512146328336a11b1d" - integrity sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw== + version "4.2.3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== growly@^1.3.0: version "1.3.0" @@ -3720,9 +3706,9 @@ handle-thing@^2.0.0: integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== handlebars@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + version "4.5.1" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz#8a01c382c180272260d07f2d1aa3ae745715c7ba" + integrity sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -3846,11 +3832,9 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.8.2" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.2.tgz#a35c3f355ac1249f1093c0c2a542ace8818c171a" - integrity sha512-CyjlXII6LMsPMyUzxpTt8fzh5QwzGqPmQXgY/Jyf4Zfp27t/FvfhwoE/8laaMUcMy816CkWF20I7NeQhwwY88w== - dependencies: - lru-cache "^5.1.1" + version "2.8.5" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== hpack.js@^2.1.6: version "2.1.6" @@ -3979,7 +3963,7 @@ http-proxy-middleware@^0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@1.17.0, http-proxy@^1.17.0: +http-proxy@1.17.0: version "1.17.0" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== @@ -3988,6 +3972,15 @@ http-proxy@1.17.0, http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -4050,9 +4043,9 @@ iferr@^0.1.5: integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + version "3.0.3" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: minimatch "^3.0.4" @@ -4155,9 +4148,9 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inquirer@^6.2.2: - version "6.5.0" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== + version "6.5.2" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -4237,6 +4230,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4537,91 +4535,91 @@ istanbul-lib-source-maps@^3.0.1: rimraf "^2.6.3" source-map "^0.6.1" -istanbul-reports@^2.1.1: +istanbul-reports@^2.2.6: version "2.2.6" resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== dependencies: handlebars "^4.1.2" -jest-changed-files@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b" - integrity sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug== +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" execa "^1.0.0" throat "^4.0.0" jest-cli@^24.7.1: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz#b075ac914492ed114fa338ade7362a301693e989" - integrity sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA== + version "24.9.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== dependencies: - "@jest/core" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" exit "^0.1.2" import-local "^2.0.0" is-ci "^2.0.0" - jest-config "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" prompts "^2.0.1" realpath-native "^1.1.0" - yargs "^12.0.2" + yargs "^13.3.0" -jest-config@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz#77db3d265a6f726294687cbbccc36f8a76ee0f4f" - integrity sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw== +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.8.0" - "@jest/types" "^24.8.0" - babel-jest "^24.8.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^24.8.0" - jest-environment-node "^24.8.0" - jest-get-type "^24.8.0" - jest-jasmine2 "^24.8.0" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" jest-regex-util "^24.3.0" - jest-resolve "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" micromatch "^3.1.10" - pretty-format "^24.8.0" + pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz#146435e7d1e3ffdf293d53ff97e193f1d1546172" - integrity sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g== +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== dependencies: chalk "^2.0.1" - diff-sequences "^24.3.0" - jest-get-type "^24.8.0" - pretty-format "^24.8.0" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" jest-docblock@^24.3.0: - version "24.3.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" - integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + version "24.9.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== dependencies: detect-newline "^2.1.0" -jest-each@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz#a05fd2bf94ddc0b1da66c6d13ec2457f35e52775" - integrity sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA== +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" - jest-get-type "^24.8.0" - jest-util "^24.8.0" - pretty-format "^24.8.0" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" jest-environment-jsdom@24.7.1: version "24.7.1" @@ -4635,230 +4633,232 @@ jest-environment-jsdom@24.7.1: jest-util "^24.7.1" jsdom "^11.5.1" -jest-environment-jsdom@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz#300f6949a146cabe1c9357ad9e9ecf9f43f38857" - integrity sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ== +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== dependencies: - "@jest/environment" "^24.8.0" - "@jest/fake-timers" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - jest-util "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" jsdom "^11.5.1" -jest-environment-node@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz#d3f726ba8bc53087a60e7a84ca08883a4c892231" - integrity sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q== +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== dependencies: - "@jest/environment" "^24.8.0" - "@jest/fake-timers" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - jest-util "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" -jest-get-type@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz#a7440de30b651f5a70ea3ed7ff073a32dfe646fc" - integrity sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ== +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== -jest-haste-map@^24.8.0: - version "24.8.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz#f39cc1d2b1d907e014165b4bd5a957afcb992982" - integrity sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g== +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" anymatch "^2.0.0" fb-watchman "^2.0.0" graceful-fs "^4.1.15" invariant "^2.2.4" - jest-serializer "^24.4.0" - jest-util "^24.8.0" - jest-worker "^24.6.0" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" micromatch "^3.1.10" sane "^4.0.3" walker "^1.0.7" optionalDependencies: fsevents "^1.2.7" -jest-jasmine2@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz#a9c7e14c83dd77d8b15e820549ce8987cc8cd898" - integrity sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong== +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" co "^4.6.0" - expect "^24.8.0" + expect "^24.9.0" is-generator-fn "^2.0.0" - jest-each "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-runtime "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - pretty-format "^24.8.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" throat "^4.0.0" -jest-leak-detector@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz#c0086384e1f650c2d8348095df769f29b48e6980" - integrity sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g== +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== dependencies: - pretty-format "^24.8.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" -jest-matcher-utils@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz#2bce42204c9af12bde46f83dc839efe8be832495" - integrity sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw== +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== dependencies: chalk "^2.0.1" - jest-diff "^24.8.0" - jest-get-type "^24.8.0" - pretty-format "^24.8.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" -jest-message-util@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz#0d6891e72a4beacc0292b638685df42e28d6218b" - integrity sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g== +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" "@types/stack-utils" "^1.0.1" chalk "^2.0.1" micromatch "^3.1.10" slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^24.7.0, jest-mock@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz#2f9d14d37699e863f1febf4e4d5a33b7fdbbde56" - integrity sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A== +jest-mock@^24.7.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-regex-util@^24.3.0: - version "24.3.0" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" - integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== -jest-resolve-dependencies@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz#19eec3241f2045d3f990dba331d0d7526acff8e0" - integrity sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw== +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" jest-regex-util "^24.3.0" - jest-snapshot "^24.8.0" + jest-snapshot "^24.9.0" -jest-resolve@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz#84b8e5408c1f6a11539793e2b5feb1b6e722439f" - integrity sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw== +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" browser-resolve "^1.11.3" chalk "^2.0.1" jest-pnp-resolver "^1.2.1" realpath-native "^1.1.0" -jest-runner@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz#4f9ae07b767db27b740d7deffad0cf67ccb4c5bb" - integrity sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow== +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== dependencies: "@jest/console" "^24.7.1" - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.4.2" exit "^0.1.2" graceful-fs "^4.1.15" - jest-config "^24.8.0" + jest-config "^24.9.0" jest-docblock "^24.3.0" - jest-haste-map "^24.8.0" - jest-jasmine2 "^24.8.0" - jest-leak-detector "^24.8.0" - jest-message-util "^24.8.0" - jest-resolve "^24.8.0" - jest-runtime "^24.8.0" - jest-util "^24.8.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" jest-worker "^24.6.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz#05f94d5b05c21f6dc54e427cd2e4980923350620" - integrity sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA== +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== dependencies: "@jest/console" "^24.7.1" - "@jest/environment" "^24.8.0" + "@jest/environment" "^24.9.0" "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/yargs" "^12.0.2" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" chalk "^2.0.1" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.1.15" - jest-config "^24.8.0" - jest-haste-map "^24.8.0" - jest-message-util "^24.8.0" - jest-mock "^24.8.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" jest-regex-util "^24.3.0" - jest-resolve "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" realpath-native "^1.1.0" slash "^2.0.0" strip-bom "^3.0.0" - yargs "^12.0.2" + yargs "^13.3.0" -jest-serializer@^24.4.0: - version "24.4.0" - resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" - integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== -jest-snapshot@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz#3bec6a59da2ff7bc7d097a853fb67f9d415cb7c6" - integrity sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg== +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" - expect "^24.8.0" - jest-diff "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-resolve "^24.8.0" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^24.8.0" - semver "^5.5.0" - -jest-util@^24.7.1, jest-util@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz#41f0e945da11df44cc76d64ffb915d0716f46cd1" - integrity sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA== - dependencies: - "@jest/console" "^24.7.1" - "@jest/fake-timers" "^24.8.0" - "@jest/source-map" "^24.3.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.7.1, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" callsites "^3.0.0" chalk "^2.0.1" graceful-fs "^4.1.15" @@ -4867,37 +4867,37 @@ jest-util@^24.7.1, jest-util@^24.8.0: slash "^2.0.0" source-map "^0.6.0" -jest-validate@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz#624c41533e6dfe356ffadc6e2423a35c2d3b4849" - integrity sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA== +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== dependencies: - "@jest/types" "^24.8.0" - camelcase "^5.0.0" + "@jest/types" "^24.9.0" + camelcase "^5.3.1" chalk "^2.0.1" - jest-get-type "^24.8.0" - leven "^2.1.0" - pretty-format "^24.8.0" - -jest-watcher@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz#58d49915ceddd2de85e238f6213cef1c93715de4" - integrity sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw== - dependencies: - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/yargs" "^12.0.9" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" ansi-escapes "^3.0.0" chalk "^2.0.1" - jest-util "^24.8.0" + jest-util "^24.9.0" string-length "^2.0.0" -jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== dependencies: - merge-stream "^1.0.1" + merge-stream "^2.0.0" supports-color "^6.1.0" jest@24.7.1: @@ -5041,9 +5041,9 @@ json3@^3.3.2: integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== json5@2.x, json5@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -5184,10 +5184,10 @@ less@3.9.0: request "^2.83.0" source-map "~0.6.0" -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -5259,15 +5259,15 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.3, lodash@^4.17.5: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.5: version "4.17.15" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== loglevel@^1.6.3: - version "1.6.3" - resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" - integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA== + version "1.6.4" + resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" + integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== loose-envify@^1.0.0: version "1.4.0" @@ -5346,11 +5346,6 @@ mdn-data@2.0.4: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdn-data@~1.1.0: - version "1.1.4" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" - integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -5373,17 +5368,23 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== methods@~1.1.2: version "1.1.2" @@ -5422,11 +5423,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": +mime-db@1.40.0: version "1.40.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +"mime-db@>= 1.40.0 < 2": + version "1.42.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.24" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" @@ -5444,7 +5450,7 @@ mime@1.6.0, mime@^1.4.1: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.2: +mime@^2.4.4: version "2.4.4" resolved "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -5501,20 +5507,20 @@ minimist@~0.0.1: resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.5: - version "2.3.5" - resolved "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" minizlib@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + version "1.3.3" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: - minipass "^2.2.1" + minipass "^2.9.0" mississippi@^3.0.0: version "3.0.0" @@ -5540,7 +5546,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -5650,10 +5656,10 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== node-int64@^0.4.0: version "0.4.0" @@ -5694,10 +5700,10 @@ node-modules-regexp@^1.0.0: resolved "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^5.2.1: - version "5.4.1" - resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.1.tgz#7c0192cc63aedb25cd99619174daa27902b10903" - integrity sha512-p52B+onAEHKW1OF9MGO/S7k/ahGEHfhP5/tvwYzog/5XLYOd8ZuD6vdNZdUuWMONRnKPneXV43v3s6Snx1wsCQ== +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== dependencies: growly "^1.3.0" is-wsl "^1.1.0" @@ -5721,17 +5727,10 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.25: - version "1.1.26" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz#f30563edc5c7dc20cf524cc8652ffa7be0762937" - integrity sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ== - dependencies: - semver "^5.3.0" - -node-releases@^1.1.29: - version "1.1.36" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.36.tgz#44b7cb8254138e87bdbfa47761d0f825e20900b4" - integrity sha512-ggXhX6QGyJSjj3r+6ml2LqqC28XOWmKtpb+a15/Zpr9V3yoNazxJNlcQDS9bYaid5FReEWHEgToH1mwoUceWwg== +node-releases@^1.1.38: + version "1.1.39" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" + integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== dependencies: semver "^6.3.0" @@ -5791,9 +5790,9 @@ npm-bundled@^1.0.1: integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.4.4" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + version "1.4.6" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" + integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5838,9 +5837,9 @@ number-is-nan@^1.0.0: integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.0.7, nwsapi@^2.1.3: - version "2.1.4" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + version "2.2.0" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== oauth-sign@~0.9.0: version "0.9.0" @@ -5866,6 +5865,11 @@ object-inspect@^1.6.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-is@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= + object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -6041,9 +6045,9 @@ p-is-promise@^2.0.0: integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + version "2.2.1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" @@ -6082,11 +6086,11 @@ pako@~1.0.5: integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + version "1.2.0" + resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== dependencies: - cyclist "~0.2.2" + cyclist "^1.0.1" inherits "^2.0.3" readable-stream "^2.1.5" @@ -6105,9 +6109,9 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + version "5.1.5" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -6266,13 +6270,13 @@ pn@^1.1.0: integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.20: - version "1.0.21" - resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz#60e1397b95ac170749db70034ece306b9a27e324" - integrity sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA== + version "1.0.25" + resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" posix-character-classes@^0.1.0: version "0.1.1" @@ -6617,24 +6621,15 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.17" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" - integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.1: - version "7.0.18" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" - integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.21, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -6658,12 +6653,12 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^24.8.0: - version "24.8.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz#8dae7044f58db7cb8be245383b565a963e3c27f2" - integrity sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw== +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" ansi-regex "^4.0.0" ansi-styles "^3.2.0" react-is "^16.8.4" @@ -6729,9 +6724,9 @@ prr@~1.0.1: integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= psl@^1.1.24, psl@^1.1.28: - version "1.3.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" - integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== + version "1.4.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" + integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== public-encrypt@^4.0.0: version "4.0.3" @@ -6874,9 +6869,9 @@ rc@^1.2.7: strip-json-comments "~2.0.1" react-is@^16.8.4: - version "16.9.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" - integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== + version "16.11.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" + integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== read-pkg-up@^4.0.0: version "4.0.0" @@ -6942,7 +6937,7 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -regenerate-unicode-properties@^8.0.2: +regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== @@ -6974,32 +6969,34 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.6: - version "0.1.11" - resolved "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3" - integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg== +regexp.prototype.flags@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" + integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== + dependencies: + define-properties "^1.1.2" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^4.5.4: - version "4.5.4" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" - integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.0.2" + regenerate-unicode-properties "^8.1.0" regjsgen "^0.5.0" regjsparser "^0.6.0" unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + version "0.5.1" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.6.0: version "0.6.0" @@ -7039,19 +7036,19 @@ repeat-string@^1.6.1: resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== dependencies: - lodash "^4.17.11" + lodash "^4.17.15" request-promise-native@^1.0.5: - version "1.0.7" - resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + version "1.0.8" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== dependencies: - request-promise-core "1.1.2" + request-promise-core "1.1.3" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -7176,13 +7173,20 @@ rgba-regex@^1.0.0: resolved "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2.6.3: version "2.6.3" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -7216,9 +7220,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.4.0: - version "6.5.2" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" - integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + version "6.5.3" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== dependencies: tslib "^1.9.0" @@ -7286,11 +7290,11 @@ select-hose@^2.0.0: integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" - integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== + version "1.10.7" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== dependencies: - node-forge "0.7.5" + node-forge "0.9.0" semver-compare@^1.0.0: version "1.0.0" @@ -7298,16 +7302,16 @@ semver-compare@^1.0.0: integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.0" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@5.5.0: version "5.5.0" resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^6.0.0, semver@^6.1.1, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -7351,9 +7355,9 @@ send@0.17.1: statuses "~1.5.0" serialize-javascript@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" - integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== + version "1.9.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== serve-index@^1.9.1: version "1.9.1" @@ -7556,9 +7560,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + version "0.5.16" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -7568,7 +7572,7 @@ source-map-url@^0.4.0: resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -7868,16 +7872,16 @@ supports-color@^5.3.0: has-flag "^3.0.0" svgo@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313" - integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ== + version "1.3.2" + resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== dependencies: chalk "^2.4.1" coa "^2.0.2" css-select "^2.0.0" css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.33" - csso "^3.5.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" js-yaml "^3.13.1" mkdirp "~0.5.1" object.values "^1.1.0" @@ -7897,9 +7901,9 @@ symbol-tree@^3.2.2: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^5.2.3: - version "5.4.5" - resolved "https://registry.npmjs.org/table/-/table-5.4.5.tgz#c8f4ea2d8fee08c0027fac27b0ec0a4fe01dfa42" - integrity sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA== + version "5.4.6" + resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: ajv "^6.10.2" lodash "^4.17.14" @@ -7912,13 +7916,13 @@ tapable@^1.0.0, tapable@^1.1.0: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^4: - version "4.4.10" - resolved "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" - integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + version "4.4.13" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.5" + minipass "^2.8.6" minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" @@ -7940,9 +7944,9 @@ terser-webpack-plugin@^1.1.0: worker-farm "^1.7.0" terser@^4.1.2: - version "4.1.3" - resolved "https://registry.npmjs.org/terser/-/terser-4.1.3.tgz#6074fbcf3517561c3272ea885f422c7a8c32d689" - integrity sha512-on13d+cnpn5bMouZu+J8tPYQecsdRJCJuxFJ+FVoPBoLJgk5bCBkp+Uen2hWyi0KIUm6eDarnlAlH+KgIx/PuQ== + version "4.3.9" + resolved "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz#e4be37f80553d02645668727777687dad26bbca8" + integrity sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -7982,14 +7986,14 @@ through@^2.3.6: integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" - integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + version "2.0.11" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== dependencies: setimmediate "^1.0.4" @@ -8083,11 +8087,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - ts-jest@24.0.2: version "24.0.2" resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz#8dde6cece97c31c03e80e474c749753ffd27194d" @@ -8166,11 +8165,11 @@ uglify-js@3.4.x: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + version "3.6.7" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz#15f49211df6b8a01ee91322bbe46fa33223175dc" + integrity sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A== dependencies: - commander "~2.20.0" + commander "~2.20.3" source-map "~0.6.1" unicode-canonical-property-names-ecmascript@^1.0.4: @@ -8249,9 +8248,9 @@ unset-value@^1.0.0: isobject "^3.0.0" upath@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== upper-case@^1.1.1: version "1.1.3" @@ -8329,9 +8328,9 @@ utils-merge@1.0.1: integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.0.1, uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + version "3.3.3" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== v8-compile-cache@2.0.3: version "2.0.3" @@ -8366,9 +8365,9 @@ verror@1.10.0: extsprintf "^1.2.0" vm-browserify@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" - integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + version "1.1.2" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.1: version "1.0.1" @@ -8439,12 +8438,13 @@ webpack-cli@3.3.5: yargs "13.2.4" webpack-dev-middleware@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" - integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== + version "3.7.2" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== dependencies: memory-fs "^0.4.1" - mime "^2.4.2" + mime "^2.4.4" + mkdirp "^0.5.1" range-parser "^1.2.1" webpack-log "^2.0.0" @@ -8574,9 +8574,9 @@ whatwg-url@^6.4.1: webidl-conversions "^4.0.2" whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -8683,9 +8683,9 @@ xml-name-validator@^3.0.0: integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xmlchars@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" - integrity sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w== + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -8698,9 +8698,9 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@10.x: version "10.1.0" @@ -8717,7 +8717,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.0: +yargs-parser@^13.1.0, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -8725,7 +8725,7 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@12.0.5, yargs@^12.0.2: +yargs@12.0.5: version "12.0.5" resolved "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -8759,3 +8759,19 @@ yargs@13.2.4: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^13.1.0" + +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" From 485427080a616a2c43769fcf164c90657dbcaf09 Mon Sep 17 00:00:00 2001 From: alan Date: Fri, 8 Nov 2019 14:06:57 +0800 Subject: [PATCH 02/14] =?UTF-8?q?fix:=20=E4=B8=8E=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5=EF=BC=8C=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E5=85=AC=E5=BC=8F=E7=BC=96=E8=BE=91=E5=99=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/web/src/modules/app.dataset.ts | 71 ++- .../{app.dataset.model.ts => app.model.ts} | 29 +- src/web/src/modules/app.program.ts | 68 ++- .../database_index/database_index.service.ts | 44 ++ .../database_index/database_index.ts | 10 + .../components/preview/preview.model.ts | 20 + .../src/modules/components/preview/preview.ts | 31 + src/web/src/modules/crud/crud.request.ts | 38 +- src/web/src/modules/crud/formulaData.ts | 549 ++++++++++++++++++ src/web/src/ui/fineui.ts | 2 + 10 files changed, 817 insertions(+), 45 deletions(-) rename src/web/src/modules/{app.dataset.model.ts => app.model.ts} (65%) create mode 100644 src/web/src/modules/components/database_index/database_index.service.ts create mode 100644 src/web/src/modules/components/preview/preview.model.ts create mode 100644 src/web/src/modules/components/preview/preview.ts create mode 100644 src/web/src/modules/crud/formulaData.ts diff --git a/src/web/src/modules/app.dataset.ts b/src/web/src/modules/app.dataset.ts index c20c354..62b4256 100644 --- a/src/web/src/modules/app.dataset.ts +++ b/src/web/src/modules/app.dataset.ts @@ -3,12 +3,13 @@ import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, CodeEditorXtype, import { TableList } from './table_list/table_list'; import '../less/index.less'; import { DatabaseIndex } from './components/database_index/database_index'; -import { RedisDatasetModel } from './app.dataset.model'; +import { RedisModel, ParameterType } from './app.model'; +import { Preview } from './components/preview/preview'; import './app.less'; import { redisField } from './app.constant'; @shortcut() -@store(RedisDatasetModel) +@store(RedisModel) export class RedisDataset extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.dataset' private textWidth = 100; @@ -17,16 +18,19 @@ export class RedisDataset extends BI.Widget { queryCondition: any; tableList: TableList; parameterEditor: any; + previewButton: any; - store: RedisDatasetModel['store'] - model: RedisDatasetModel['model'] + store: RedisModel['store'] + model: RedisModel['model'] props = { value: { - database: '', - orderValue: '0', - query: '', - parameters: [], + datasetData: { + database: '', + orderValue: '0', + query: '', + parameters: [], + }, }, } @@ -34,10 +38,13 @@ export class RedisDataset extends BI.Widget { parameters: () => { this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); }, + ablePreview: (ablePreview: boolean) => { + this.previewButton.setEnable(ablePreview); + }, } render() { - const { database, orderValue, query, parameters } = this.options.value; + const { database = '', orderValue = '0', query = '', parameters = [] } = this.options.value.datasetData || {}; this.store.setParameters(parameters); return { @@ -147,7 +154,7 @@ export class RedisDataset extends BI.Widget { text: BI.i18nText('Plugin-Redis_Refresh'), level: 'ignore', handler: () => { - Dec.Utils.getDataSetParameters(this.getValue(), res => { + Dec.Utils.getDataSetParameters(this.getParamSearchValue(), res => { const newParameters = BI.Services.getService('dec.service.data.set').getParameters(res.data, this.model.parameters); this.store.setParameters(newParameters); }); @@ -158,6 +165,13 @@ export class RedisDataset extends BI.Widget { el: { type: ButtonXtype, text: BI.i18nText('Plugin-Redis_Preview'), + disabled: !this.model.ablePreview, + handler: () => { + this.openPreview(); + }, + ref: (_ref: any) => { + this.previewButton = _ref; + }, }, width: 80, }], @@ -165,7 +179,7 @@ export class RedisDataset extends BI.Widget { type: ComponentsStyleTable, cls: 'param-table', height: 200, - columnSize: [250, 250, ''], + columnSize: [300, 300, ''], items: this.renderItems(), header: [this.model.paramHeader], ref: (_ref: any) => { @@ -197,13 +211,13 @@ export class RedisDataset extends BI.Widget { self.store.setParamType(index, this.getValue()[0]); }, }], - }, { - type: LabelXtype, - text: item.name, - textAlign: 'left', - height: 30, - lgap: 10, - }]); + }, this.createParameterValueItem(item, (value: string) => { + self.store.setParamValue(index, value); + })]); + } + + private createParameterValueItem(param: ParameterType, cb: Function) { + return BI.Services.getService('dec.service.data.set').createParameterValueItem(param, cb); } public getValue() { @@ -214,4 +228,25 @@ export class RedisDataset extends BI.Widget { parameters: this.model.parameters, }; } + + private getParamSearchValue() { + return { + datasetType: 'Redis', + datasetName: BI.get(this.model, 'dataSetName'), + datasetData: this.getValue(), + }; + } + + private openPreview() { + const id = BI.UUID(); + BI.Popovers.create(id, { + type: 'bi.popover', + width: 800, + height: 500, + body: { + type: Preview.xtype, + previewedDataSet: this.getParamSearchValue(), + }, + }).open(id); + } } diff --git a/src/web/src/modules/app.dataset.model.ts b/src/web/src/modules/app.model.ts similarity index 65% rename from src/web/src/modules/app.dataset.model.ts rename to src/web/src/modules/app.model.ts index c29f684..36fd240 100644 --- a/src/web/src/modules/app.dataset.model.ts +++ b/src/web/src/modules/app.model.ts @@ -1,30 +1,23 @@ import { model, Model } from './core/core'; import { redisParamHeader } from './app.constant'; @model() -export class RedisDatasetModel extends Model { - static xtype = 'dec.model.dcm.connection.plugin.redis.dataset' - +export class RedisModel extends Model { + static xtype = 'dec.model.dcm.connection.plugin.redis' context = ['dataSetName', 'ableSave'] state() { return { - parameters: [{ name: '123', type: 'String' }] as { - name: string; - type: string; - value: string; - }[], + parameters: [] as ParameterType[], + ablePreview: false, }; } actions = { setAbleSave(ableSave: boolean) { this.model.ableSave = ableSave; + this.model.ablePreview = ableSave; }, - setParameters: (parameters: { - name: string; - type: string; - value: string; - }[]) => { + setParameters: (parameters: ParameterType[]) => { this.model.parameters = parameters; }, setParamType: (index: number, type: string) => { @@ -34,6 +27,9 @@ export class RedisDatasetModel extends Model { this.model.parameters.splice(0, 0); } }, + setParamValue: (index: number, val: string) => { + this.model.parameters[index].value = val; + }, } computed = { @@ -44,3 +40,10 @@ export class RedisDatasetModel extends Model { }, item)), } } + + +export interface ParameterType { + name: string; + type: string; + value: string; +} diff --git a/src/web/src/modules/app.program.ts b/src/web/src/modules/app.program.ts index 7d4d6a6..5437b4d 100644 --- a/src/web/src/modules/app.program.ts +++ b/src/web/src/modules/app.program.ts @@ -3,12 +3,13 @@ import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, TextValueComboXt import { TableList } from './table_list/table_list'; import '../less/index.less'; import { DatabaseIndex } from './components/database_index/database_index'; -import { RedisDatasetModel } from './app.dataset.model'; +import { RedisModel, ParameterType } from './app.model'; import './app.less'; import { redisField } from './app.constant'; +import { Preview } from './components/preview/preview'; @shortcut() -@store(RedisDatasetModel) +@store(RedisModel) export class RedisProgram extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.program' private textWidth = 100; @@ -18,17 +19,21 @@ export class RedisProgram extends BI.Widget { tableList: TableList; parameterEditor: any; engineTypeSelect: any; + previewButton: any; - store: RedisDatasetModel['store'] - model: RedisDatasetModel['model'] + + store: RedisModel['store'] + model: RedisModel['model'] props = { value: { - database: '', - orderValue: '0', - script: '', - engineType: 0, - parameters: [], + datasetData: { + database: '', + orderValue: '0', + script: '', + engineType: 0, + parameters: [], + }, }, } @@ -36,10 +41,13 @@ export class RedisProgram extends BI.Widget { parameters: () => { this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); }, + ablePreview: (ablePreview: boolean) => { + this.previewButton.setEnable(ablePreview); + }, } render() { - const { database, orderValue, script, parameters, engineType } = this.options.value; + const { database = '', orderValue = '0', script = '', parameters = [], engineType = 0 } = this.options.value.datasetData || {}; this.store.setParameters(parameters); return { @@ -174,7 +182,7 @@ export class RedisProgram extends BI.Widget { text: BI.i18nText('Plugin-Redis_Refresh'), level: 'ignore', handler: () => { - Dec.Utils.getDataSetParameters(this.getValue(), res => { + Dec.Utils.getDataSetParameters(this.getParamSearchValue(), res => { const newParameters = BI.Services.getService('dec.service.data.set').getParameters(res.data, this.model.parameters); this.store.setParameters(newParameters); }); @@ -185,6 +193,13 @@ export class RedisProgram extends BI.Widget { el: { type: ButtonXtype, text: BI.i18nText('Plugin-Redis_Preview'), + disabled: !this.model.ablePreview, + handler: () => { + this.openPreview(); + }, + ref: (_ref: any) => { + this.previewButton = _ref; + }, }, width: 80, }], @@ -192,7 +207,7 @@ export class RedisProgram extends BI.Widget { type: ComponentsStyleTable, cls: 'param-table', height: 200, - columnSize: [250, 250, ''], + columnSize: [300, 300, ''], items: this.renderItems(), header: [this.model.paramHeader], ref: (_ref: any) => { @@ -230,7 +245,13 @@ export class RedisProgram extends BI.Widget { textAlign: 'left', height: 30, lgap: 10, - }]); + }, this.createParameterValueItem(item, (value: string) => { + self.store.setParamValue(index, value); + })]); + } + + private createParameterValueItem(param: ParameterType, cb: Function) { + return BI.Services.getService('dec.service.data.set').createParameterValueItem(param, cb); } public getValue() { @@ -242,4 +263,25 @@ export class RedisProgram extends BI.Widget { parameters: this.model.parameters, }; } + + private getParamSearchValue() { + return { + datasetType: 'RedisScript', + datasetName: BI.get(this.model, 'dataSetName'), + datasetData: this.getValue(), + }; + } + + private openPreview() { + const id = BI.UUID(); + BI.Popovers.create(id, { + type: 'bi.popover', + width: 800, + height: 500, + body: { + type: Preview.xtype, + previewedDataSet: this.getParamSearchValue(), + }, + }).open(id); + } } diff --git a/src/web/src/modules/components/database_index/database_index.service.ts b/src/web/src/modules/components/database_index/database_index.service.ts new file mode 100644 index 0000000..577f0bb --- /dev/null +++ b/src/web/src/modules/components/database_index/database_index.service.ts @@ -0,0 +1,44 @@ +import { BarPopoverXtype } from 'ui'; +import { fetchFormulaConfig } from '../../crud/crud.request'; + +/** + * 打开公式编辑框 + */ +export function openFormulaPopover(value: T, inserterType: string = BI.RegularFormulaInserter.xtype): Promise { + return new Promise((resolve, reject) => { + const id = BI.UUID(); + + let formulaPane: typeof BI.FormulaOpeartingPanel; + + BI.Popovers.create(id, { + type: BarPopoverXtype, + width: 900, + height: 600, + header: BI.i18nText('Plugin-JSON_Function_Definition'), + body: { + type: BI.FormulaOpeartingPanel.xtype, + configLoader: fetchFormulaConfig, + ref: (_ref: typeof BI.FormulaOpeartingPanel) => { + formulaPane = _ref; + }, + inserterType, + value, + }, + listeners: [{ + eventName: BI.Popover.EVENT_CANCEL, + action: () => { + reject(); + + BI.Popovers.remove(id); + }, + }, { + eventName: BI.Popover.EVENT_CONFIRM, + action: () => { + resolve(formulaPane.getValue() as T); + + BI.Popovers.remove(id); + }, + }], + }).open(id); + }); +} diff --git a/src/web/src/modules/components/database_index/database_index.ts b/src/web/src/modules/components/database_index/database_index.ts index 4da437f..3538a97 100644 --- a/src/web/src/modules/components/database_index/database_index.ts +++ b/src/web/src/modules/components/database_index/database_index.ts @@ -1,6 +1,7 @@ import { shortcut, store } from '@core/core'; import { TabXtype, TextEditorXtype } from 'ui'; import { DatabaseIndexModel } from './database_index.model'; +import { openFormulaPopover } from './database_index.service'; @shortcut() @store(DatabaseIndexModel) @@ -9,6 +10,7 @@ export class DatabaseIndex extends BI.Widget { databaseIndexTab: any; textEditor: any; + formulaPane: typeof BI.FormulaOpeartingPanel; model: DatabaseIndexModel['model'] store: DatabaseIndexModel['store'] @@ -52,6 +54,9 @@ export class DatabaseIndex extends BI.Widget { type: TextEditorXtype, allowBlank: true, value: this.model.inputValue, + ref: (_ref: typeof BI.FormulaOpeartingPanel) => { + this.formulaPane = _ref; + }, }; }, }; @@ -62,6 +67,11 @@ export class DatabaseIndex extends BI.Widget { public setSelect(value: string) { this.databaseIndexTab.setSelect(value); + if (value === 'formula') { + openFormulaPopover({ + formula: '', + }, BI.ComplexFormulaInserter.xtype); + } } public getValue() { diff --git a/src/web/src/modules/components/preview/preview.model.ts b/src/web/src/modules/components/preview/preview.model.ts new file mode 100644 index 0000000..73e6ec9 --- /dev/null +++ b/src/web/src/modules/components/preview/preview.model.ts @@ -0,0 +1,20 @@ +import { model, Model } from '@core/core'; +@model() +export class PreviewModel extends Model { + static xtype = 'plugin.model.report.redis.components.preview'; + + childContext = ['previewAble', 'previewedDataSet']; + + state() { + return { + previewAble: true, + previewedDataSet: {}, + }; + } + + actions = { + setPreviewedDataSet: (value: any) => { + this.model.previewedDataSet = value; + }, + } +} diff --git a/src/web/src/modules/components/preview/preview.ts b/src/web/src/modules/components/preview/preview.ts new file mode 100644 index 0000000..9041396 --- /dev/null +++ b/src/web/src/modules/components/preview/preview.ts @@ -0,0 +1,31 @@ +import { shortcut, store } from '@core/core'; +import { PreviewModel } from './preview.model'; + +@shortcut() +@store(PreviewModel) +export class Preview extends BI.Widget { + static xtype = 'plugin.report.redis.components.preview' + + store: PreviewModel['store'] + model: PreviewModel['model'] + + previewPane: any + + props = { + previewedDataSet: {}, + } + + render() { + this.store.setPreviewedDataSet(this.options.previewedDataSet); + + return { + type: 'dec.data.set.preview', + ref: (_ref: any) => { + this.previewPane = _ref; + }, + }; + } + created() { + this.previewPane.previewData(); + } +} diff --git a/src/web/src/modules/crud/crud.request.ts b/src/web/src/modules/crud/crud.request.ts index c559a0a..a59498a 100644 --- a/src/web/src/modules/crud/crud.request.ts +++ b/src/web/src/modules/crud/crud.request.ts @@ -1,15 +1,51 @@ import { requestGet } from './crud.service'; +import { formulaData } from './formulaData'; export function getConnectionlist(): Promise<{data?: Connection[]}> { return requestGet('/v10/config/connection/list'); } export function getTableList(database: string, pattern = ''): Promise<{data?: string[]}> { - return requestGet('com.fr.solution.plugin.db.redis.v10/redis/keys', { + return requestGet('plugin/private/com.fr.solution.plugin.db.redis.v10/redis/keys', { database, pattern, }); } +/** + * 获取公式框基本配置信息 + */ +export function fetchFormulaConfig(): Promise<{ + vars: { + text: string; + value: string; + type: string; + def: string; + }[]; + JSONs: { + def: string; + name: string; + type: string; + }[]; +}> { + // TODO 后台接口待完成 + return new Promise(resolve => { + resolve(formulaData); + }); +} + +/** + * 校验公式 + * @param formulaStr 公式 + */ +export function validateForumula(formulaStr: string): Promise<{ + validation: boolean; +}> { + // TODO 后台接口待完成 + return new Promise(resolve => { + resolve({ validation: true }); + }); +} + export interface Connection { connectionId: string; connectionType: string; diff --git a/src/web/src/modules/crud/formulaData.ts b/src/web/src/modules/crud/formulaData.ts new file mode 100644 index 0000000..0edb86f --- /dev/null +++ b/src/web/src/modules/crud/formulaData.ts @@ -0,0 +1,549 @@ +// 后期统一放置公式数据 +export const formulaData = { + vars: [ + { + text: '$$page_number', + value: '$$page_number', + type: 'VARS', + def: '当前的页数。', + }, + { + text: '$$totalPage_number', + value: '$$totalPage_number', + type: 'VARS', + def: '总页数。', + }, + ], + JSONs: [ + { + def: 'ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。', + name: 'ABS', + type: 'MATH', + }, + { + def: 'ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。', + name: 'ABS', + type: 'COMMON', + }, + { + def: 'acc_sum(x_agg(array),range)根据横纵轴或行列维度添加的字段对指标进行跨行累计的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行累计,1为对组内所有行进行累计示例:acc_sum(sum_agg(array),0)用户横轴轴拖拽销售日期(年分组),则该指标计算结果为,根据销售日期(年)对销量进行分组汇总,然后根据对所有行从上到下进行累加,获得每年的累计销量', + name: 'ACC_SUM', + type: 'TABLE_CAL', + }, + { + def: 'ACOS(number): 返回指定数值的反余弦值。反余弦值为一个角度,返回角度以弧度形式表示。Number:需要返回角度的余弦值。备注: 函数的参数必须在-1和1之间,包括-1和1。 返回的角度值在0和Pi之间。 如果要把返回的角度用度数来表示,用180/PI()乘返回值即可。示例:ACOS(1)等于0(弧度)。ACOS(0.5)等于1.047197551(Pi/3弧度)。ACOS(0.5)*180/PI()等于60(度)。', + name: 'ACOS', + type: 'MATH', + }, + { + def: 'AND(logical1,logical2,…): 当所有参数的值为真时,返回TRUE;当任意参数的值为假时,返回FALSE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:AND(1+7=8,5+7=12)等于TRUE。AND(1+7=8,5+7=11)等于FALSE。如果单元格A1到A4的值分别为TRUE、TRUE、FALSE和TRUE,则:AND(A1:A4)等于FALSE。如果单元格A5的值在0~50之间,则: AND(0 0,b > 0 or a > 0, b < 0时,公式直接成立;a < 0,b > 0, ATAN2(a,b)=PI()-ABS(ATAN(b/a))a < 0,b < 0, ATAN2(a,b)=ABS(ATAN(b/a))-PI() 当x_num与y_num都为0时,ATAN2返回错误信息*DIV/0!。 用角度制显示返回数值时,把返回数值乘以180/PI()。 返回值以弧度表示(返回值大于-pi且小于等于pi)。示例:ATAN2(-2,2)等于2.356194490192345(弧度制的3*pi/4)。ATAN2(2,2)等于0.785398163(弧度制的pi/4)。ATAN2(-2,2)*180/PI()等于135(角度制)。', + name: 'ATAN2', + type: 'MATH', + }, + { + def: 'AVG_AGG(array): 根据当前分析维度,动态返回指标字段的汇总平均值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。 \n 示例:用户横轴为维度字段\'日\'时,纵轴的计算字段AVG_AGG(销量)返回的值为每日的平均销量;当用户横轴为维度字段\'月\'时,AVG_AGG(销量)返回的值为每月的平均销量。', + name: 'AVG_AGG', + type: 'AGG', + }, + { + def: 'CEILING(number): 将参数number沿绝对值增大的方向,舍入为最接近的整数Number:指待舍入的数值。CEILING(-2.5)等于-3。CEILING(0.5)等于1。', + name: 'CEILING', + type: 'MATH', + }, + { + def: 'CHAR(number): 根据指定数字返回对应的字符。CHAR函数可将计算机其他类型的数字代码转换为字符。Number:用于指定字符的数字,介于1~65535之间(包括1和65535)。示例:CHAR(88)等于“X”。CHAR(45)等于“-”。', + name: 'CHAR', + type: 'TEXT', + }, + { + def: 'CODE(text): 计算文本串中第一个字符的数字代码。返回的代码对应于计算机使用的字符集。Text:需要计算第一个字符代码的文本或单元格引用。示例:CODE("S")等于83。CODE("Spreadsheet")等于83。', + name: 'CODE', + type: 'TEXT', + }, + { + def: 'CONCATENATE(text1,text2,...): 将数个字符串合并成一个字符串。Text1,text2,...:需要合并成单个文本的文本项,可以是字符,数字或是单元格引用。示例:CONCATENATE("Average ","Price")等于“Average Price”。CONCATENATE("1","2")等于12。', + name: 'CONCATENATE', + type: 'TEXT', + }, + { + def: 'COS(number): 返回一个角度的余弦值。Number:以弧度表示的需要求余弦值的角度。备注: 要把一个角度转换成弧度值,将角度乘于PI()/180。 COS(n*2*PI()+number)=COS(number)(其中n为整数,number从-pi到pi)。示例:COS(0.5)等于0.877582562。COS(30*PI()/180)等于0.866025404。', + name: 'COS', + type: 'MATH', + }, + { + def: 'COUNTD_AGG(array): 根据当前分析维度,动态返回某字段的去重计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n "array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n "示例:用户横轴为维度字段\'日\'时,纵轴的计算字段COUNTD_AGG(销量)返回的值为每日的销量的去重个数;当用户横轴为维度字段\'月\'时,COUNTD_AGG(销量)返回的值为每月的销量的去重个数。"', + name: 'COUNTD_AGG', + type: 'AGG', + }, + { + def: 'COUNT_AGG(array): 根据当前分析维度,动态返回某字段的计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段\'日\'时,纵轴的计算字段COUNT_AGG(销量)返回的值为每日的销量的个数;当用户横轴为维度字段\'月\'时,COUNT_AGG(销量)返回的值为每月的销量的个数。', + name: 'COUNT_AGG', + type: 'AGG', + }, + { + def: 'DATE(year,month,day): 返回一个表示某一特定日期的系列数。Year:代表年,可为一到四位数。Month:代表月份。若1 month 12,则函数把参数值作为月。若month>12,则函数从年的一月份开始往上累加。例如: DATE(2000,25,2)等于2002年1月2日的系列数。Day:代表日。若日期小于等于某指定月的天数,则函数将此参数值作为日。若日期大于某指定月的天数,则函数从指定月份的第一天开始往上累加。若日期大于两个或多个月的总天数,则函数把减去两个月或多个月的余数加到第三或第四个月上,依此类推。例如:DATE(2000,3,35)等于2000年4月4日的系列数。备注: 若需要处理公式中日期的一部分,如年或月等,则可用此公式。 若年,月和日是函数而不是函数中的常量,则此公式最能体现其作用。示例:DATE(1978, 9, 19) 等于1978-09-19.DATE(1211, 12, 1) 等于1211-12-01. ', + name: 'DATE', + type: 'DATETIME', + }, + { + def: 'DATEDELTA(date, deltadays):返回一个日期date后deltadays的日期。deltaDays可以为正值,负值,零。示例:DATEDELTA("2008-08-08", -10)等于2008-07-29。DATEDELTA("2008-08-08", 10)等于2008-08-18。', + name: 'DATEDELTA', + type: 'DATETIME', + }, + { + def: 'DATEDIF(start_date,end_date,unit):返回两个指定日期间的天数、月数或年数。Start_date:代表所指定时间段的初始日期。End_date:代表所指定时间段的终止日期。Unit:函数返回信息的类型。若unit=“Y”,则DATEDIF返回指定时间段的年差数。若unit=“M”,则DATEDIF返回指定时间段的月差数。若unit=“D”,则DATEDIF返回指定时间段的日差数。若unit=“MD”,则DATEDIF忽略年和月,返回指定时间段的日差数。若unit=“YM”,则DATEDIF忽略年和日,返回指定时间段的月差数。若unit=“YD”,则DATEDIF忽略年,返回指定时间段的日差数。示例:DATEDIF("2001/2/28","2004/3/20","Y")等于3,即在2001年2月28日与2004年3月20日之间有3个整年。DATEDIF("2001/2/28","2004/3/20","M")等于37,即在2001年2月28日与2004年3月20日之间有36个整月。DATEDIF("2001/2/28","2004/3/20","D")等于1116,即在2001年2月28日与2004年3月20日之间有1116个整天。DATEDIF("2001/2/28","2004/3/20","MD")等于8,即忽略月和年后,2001年2月28日与2004年3月20日的差为8天。DATEDIF("2001/1/28","2004/3/20","YM")等于2,即忽略日和年后,2001年1月28日与2004年3月20日的差为2个月。DATEDIF("2001/2/28","2004/3/20","YD")等于21,即忽略年后,2001年2月28日与2004年3月20日的差为21天。', + name: 'DATEDIF', + type: 'DATETIME', + }, + { + def: 'DATESUBDATE(date1, date2, op):返回两个日期之间的时间差。op表示返回的时间单位:"s",以秒为单位。"m",以分钟为单位。"h",以小时为单位。"d",以天为单位。"w",以周为单位。示例:DATESUBDATE("2008-08-08", "2008-06-06","h")等于1512。', + name: 'DATESUBDATE', + type: 'DATETIME', + }, + { + def: 'DATETONUMBER(date):返回自 1970 年 1 月 1 日 00:00:00 GMT 经过的毫秒数。示例:DATETONUMBER("2008-08-08")等于1218124800000。', + name: 'DATETONUMBER', + type: 'DATETIME', + }, + { + def: 'DAY:(serial_number)返回日期中的日。DAY是介于1和31之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAY("2000/1/1")等于1。DAY("2006/05/05")等于5。DAY("1997/04/20")等于20。DAY("2000-1-1", "yyyy-MM-dd")等于1。DAY("2006-05-05", "yyyy-MM-dd")等于5。DAY("1997-04-20", "yyyy-MM-dd")等于20。DAY(35796)等于1。', + name: 'DAY', + type: 'DATETIME', + }, + { + def: 'DAYS360(start_date,end_date,method):按照一年 360 天的算法(每个月以 30 天计,一年共计 12 个月),返回两日期间相差的天数,这在会计计算中将会用到。如果财务系统是基于一年 12 个月,每月 30 天,可用此函数帮助计算支付款项。Start_date 和 end_date :是用于计算期间天数的起止日期。Method : 它指定了在计算中是采用欧洲方法还是美国方法。Method 定义 :FALSE或忽略 美国方法 (NASD)。如果起始日期是一个月的 31 号,则等于同月的 30 号。如果终止日期是一个月的31号,并且起始日期早于 30 号,则终止日期等于下一个月的 1 号,否则,终止日期等于本月的 30 号。TRUE 欧洲方法。无论是起始日期还是终止日期为一个月的 31 号,都将等于本月的 30 号。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAYS360("1998/1/30", "1998/2/1") 等于 1', + name: 'DAYS360', + type: 'DATETIME', + }, + { + def: 'DAYSOFMONTH(date):返回从1900年1月后某年某月包含的天数。示例:DAYSOFMONTH("1900-02-01")等于28。DAYSOFMONTH("2008/04/04")等于30。', + name: 'DAYSOFMONTH', + type: 'DATETIME', + }, + { + def: 'DAYSOFQUARTER(date): 返回从1900年1月后某年某季度的天数。示例:DAYSOFQUARTER("2009-02-01")等于90。DAYSOFQUARTER("2009/05/05")等于91。', + name: 'DAYSOFQUARTER', + type: 'DATETIME', + }, + { + def: 'DAYSOFYEAR(year):返回某年包含的天数。示例:DAYSOFYEAR(2008)等于365,等价于DAYSOFYEAR("2008-01-01")。', + name: 'DAYSOFYEAR', + type: 'DATETIME', + }, + { + def: 'DAYVALUE(date):返回1900年至 date日期所经历的天数。示例:DAYVALUE("2008/08/08")等于39669。', + name: 'DAYVALUE', + type: 'DATETIME', + }, + { + def: 'DEGREES(angle): 将弧度转化为度。angle:待转换的弧度角。示例:DEGREES(PI()/2)等于90。DEGREES(3.1415926)等于179.9999969。', + name: 'DEGREES', + type: 'MATH', + }, + { + def: 'ENDWITH(str1,str2):判断字符串str1是否以str2结束。备注: str1和str2都是大小写敏感的。示例:ENDWITH("FineReport","Report")等于true。ENDWITH("FineReport","Fine")等于false。ENDWITH("FineReport","report")等于false。', + name: 'ENDWITH', + type: 'TEXT', + }, + { + def: 'EXACT(text1,text2): 检测两组文本是否相同。如果完全相同,EXACT函数返回TRUE;否则,返回FALSE。EXACT函数可以区分大小写,但忽略格式的不同。同时也可以利用EXACT函数来检测输入文档的文字。Text1:需要比较的第一组文本。Text2:需要比较的第二组文本。示例:EXACT("Spreadsheet","Spreadsheet")等于TRUE。EXACT("Spreadsheet","S preadsheet")等于FALSE。EXACT("Spreadsheet","spreadsheet")等于FALSE。', + name: 'EXACT', + type: 'TEXT', + }, + { + def: 'EXP(number): 返回e的n次幂。常数e为自然对数的底数,等于2.71828182845904。Number:为任意实数,作为常数e的指数。备注: 如果要返回其他常数作为底数的幂,可以使用指数运算符(^)。例如: 在4^2中,4是底数,而2是指数。 EXP函数与LN函数互为反函数。示例:EXP(0)等于1。EXP(3)等于20.08553692。EXP(LN(2))等于2。', + name: 'EXP', + type: 'MATH', + }, + { + def: 'FACT(number):返回数的阶乘,一个数的阶乘等于 1*2*3*...*该数。number:要计算其阶乘的非负数。如果输入的 number 不是整数,则截尾取整。示例:FACT(1) 等于 1FACT(1.9) 等于 FACT(1) 等于 1FACT(0) 等于 1FACT(5) 等于 1*2*3*4*5 等于 120', + name: 'FACT', + type: 'MATH', + }, + { + def: 'FIND(find_text,within_text,start_num):从指定的索引(start_num)处开始,返回第一次出现的指定子字符串(find_text)在此字符串(within_text)中的索引。Find_text:需要查找的文本或包含文本的单元格引用。Within_text:包含需要查找文本的文本或单元格引用。Start_num:指定进行查找字符的索引位置。within_text里的索引从1开始。如果省略start_num,则假设值为1。备注: 如果find_text不在within_text中,FIND函数返回值为0。 如果start_num不大于0,FIND函数返回错误信息*VALUE!。 如果start_num大于within_text的长度,FIND函数返回值为0。 如果find_text是空白文本,FIND函数将在搜索串中匹配第一个字符(即编号为start_num或1的字符)。示例:FIND("I","Information")等于1。FIND("i","Information")等于9。FIND("o","Information",2)等于4。FIND("o","Information",12)等于0。FIND("o","Information",-1)等于*VALUE!。', + name: 'FIND', + type: 'TEXT', + }, + { + def: 'FLOOR(number): 将参数number沿绝对值减小的方向去尾舍入。Number:待舍入的数值。示例:FLOOR(-2.5)等于-2。FLOOR(2.5)等于2。', + name: 'FLOOR', + type: 'MATH', + }, + { + def: 'FORMAT(object,format) : 返回object的format格式。object 需要被格式化对象,可以是String,数字,Object(常用的有Date, Time)。format 格式化的样式。示例FORMAT(1234.5, "#,##0.00") => 1234.50FORMAT(1234.5, "#,##0") => 1234FORMAT(1234.5, "¥#,##0.00") => ¥1234.50FORMAT(1.5, "0%") => 150%FORMAT(1.5, "0.000%") => 150.000%FORMAT(6789, "##0.0E0") => 6.789E3FORMAT(6789, "0.00E00") => 6.79E03FORMAT(date(2007,1,1), "EEEEE, MMMMM dd, yyyy") => 星期一,一月 01,2007FORMAT(date(2007,1,13), "MM/dd/yyyy") => 01/13/2007FORMAT(date(2007,1,13), "M-d-yy") => 1-13-07FORMAT(time(16,23,56), "h:mm:ss a") => 4:23:56 下午', + name: 'FORMAT', + type: 'TEXT', + }, + { + def: 'HOUR(serial_number):返回某一指定时间的小时数。函数指定HOUR为0(0:00)到23(23:00)之间的一个整数。Serial_number:包含所求小时的时间。示例:HOUR("11:32:40")等于11。HOUR("11:32:40", "HH:mm:ss")等于11。', + name: 'HOUR', + type: 'DATETIME', + }, + { + def: 'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first', + name: 'IF', + type: 'LOGIC', + }, + { + def: 'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first', + name: 'IF', + type: 'COMMON', + }, + { + def: 'INDEXOF(str1,index):返回字符串str1在index位置上的字符。备注: index是从0开始计数的。示例:INDEXOF("FineReport",0)等于\'F\'。INDEXOF("FineReport",2)等于\'n\'。INDEXOF("FineReport",9)等于\'t\'。INDEXOF(array, index):返回数组在index位置上的元素。备注: index是从1开始计数的。示例:String[] array = {"a", "b", "c"}INDEXOF(array, 1)等于"a".', + name: 'INDEXOF', + type: 'TEXT', + }, + { + def: 'INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。', + name: 'INT', + type: 'MATH', + }, + { + def: 'INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。', + name: 'INT', + type: 'COMMON', + }, + { + def: 'ISNULL(object):判断对象中所有的值是否全部都是NULL或者为空字符串。', + name: 'ISNULL', + type: 'OTHER', + }, + { + def: 'LEFT(text,num_chars): 根据指定的字符数返回文本串中的第一个或前几个字符。Text:包含需要选取字符的文本串或单元格引用。Num_chars:指定返回的字符串长度。备注: Num_chars的值必须等于或大于0。 如果num_chars大于整个文本的长度,LEFT函数将返回所有的文本。 如果省略num_chars,则默认值为1。示例:LEFT("Fine software",8)等于“Fine sof”。LEFT("Fine software")等于“F”。如果单元格A3中含有“China”,则LEFT(A3,2)等于“Ch”。', + name: 'LEFT', + type: 'TEXT', + }, + { + def: 'LEN(args): 返回文本串中的字符数或者数组的长度。需要注意的是:参数args为文本串时,空格也计为字符。参数args为数组时,直接返回数组长度。示例:LEN("Evermore software")等于17。LEN(" ")等于1。LEN([\'a\',\'b\'])等于2。', + name: 'LEN', + type: 'TEXT', + }, + { + def: 'LN(number):返回一个数的自然对数。自然对数以常数项 e(2.71828182845904)为底。number:是用于计算其自然对数的正实数。示例:LN(86) 等于 4.45437LN(2.7182818) 等于 1LN(EXP(3)) 等于 3EXP(LN(4)) 等于 4', + name: 'LN', + type: 'MATH', + }, + { + def: 'LOG(number,base): 按指定的任意底数,返回数值的对数。Number:需要求对数的正实数。Base:对数的底数。如果省略底数,默认值为10。示例:LOG(16,2)等于4。LOG(10)等于1。LOG(24,3)等于2.892789261。', + name: 'LOG', + type: 'MATH', + }, + { + def: 'LOG10(number):返回以 10 为底的对数。number: 用于常用对数计算的正实数。示例:LOG10(86) 等于 1.934498451LOG10(10) 等于 1LOG10(1E5) 等于 5', + name: 'LOG10', + type: 'MATH', + }, + { + def: 'LOWER(text): 将所有的大写字母转化为小写字母。Text:需要转化为小写字母的文本串。LOWER函数不转化文本串中非字母的字符。示例:LOWER("A.M.10:30")等于“a.m.10:30”。LOWER("China")等于“china”。', + name: 'LOWER', + type: 'TEXT', + }, + { + def: 'LUNAR(year,day,month): 返回当前日期对应的农历时间。year,month,day:分别对应年月日。示例:如果需要查询2011年7月21日对应的农历时间,则只需输入LUNAR(2011,7,21)结果将显示为:辛卯年六月廿一同样,如输入LUNAR(2001,7,21),则显示:辛巳年六月初一 。本公式支持的时间段为1900-2100年。', + name: 'LUNAR', + type: 'DATETIME', + }, + { + def: 'MAX(number1,number2,…): 返回参数列表中的最大值。Number1,number2,…:1到30个需要找出最大值的参数。备注: 参数可以是数字、空白单元格、逻辑值或数字的文本表达式。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。 如果参数中没有任何数字,MAX将返回0。示例:MAX(0.1,0,1.2)等于1.2。', + name: 'MAX', + type: 'MATH', + }, + { + def: 'MAX_AGG(array): 根据当前分析维度,动态返回指标字段的最大值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n "array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n "示例:用户横轴为维度字段\'日\'时,纵轴的计算字段MAX_AGG(销量)返回的值为每日的最大值销量;当用户横轴为维度字段\'月\'时,MAX_AGG(销量)返回的值为每月的最大值销量。', + name: 'MAX_AGG', + type: 'AGG', + }, + { + def: 'MEDIAN_AGG(array): 根据当前分析维度,动态返回指标字段的中位数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n "array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n "示例:用户横轴为维度字段\'日\'时,纵轴的计算字段MEDIAN_AGG(销量)返回的值为每日的中位数销量;当用户横轴为维度字段\'月\'时,MEDIAN_AGG(销量)返回的值为每月的中位数销量。', + name: 'MEDIAN_AGG', + type: 'AGG', + }, + { + def: 'MID(text,start_num,num_chars): 返回文本串中从指定位置开始的一定数目的字符,该数目由用户指定。Text:包含要提取字符的文本串。Start_num:文本中需要提取字符的起始位置。文本中第一个字符的start_num为1,依此类推。Num_chars:返回字符的长度。备注: 如果start_num大于文本长度,MID函数返回“”(空文本)。 如果start_num小于文本长度,并且start_num加上num_chars大于文本长度,MID函数将从start_num指定的起始字符直至文本末的所有字符。 如果start_num小于1,MID函数返回错误信息*VALUE!。 如果num_chars是负数,MID函数返回错误信息*VALUE!。示例:MID("Finemore software",10,8)返回“software”。MID("Finemore software",30,5)返回“”(空文本)。MID("Finemore software",0,8)返回*VALUE!。MID("Finemore software",5,-1)返回*VALUE!。', + name: 'MID', + type: 'TEXT', + }, + { + def: 'MIN(number1,number2,…): 返回参数列表中的最小值。Number1,number2,…:1到30个需要找出最小值的参数。备注: 若参数中没有数字,函数MIN将返回0。 参数应为数字、空白单元格、逻辑值或是表示数值的文本串。如果参数是错误值时,MIN将返回错误信息。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。示例:如果B1:B4包含3,6,9,12,则:MIN(B1:B4)等于3。MIN(B1:B4,0)等于0。', + name: 'MIN', + type: 'MATH', + }, + { + def: 'MINUTE(serial_number):返回某一指定时间的分钟数,其值是介于0与59之间的一个整数。serial_number:包含所求分钟数的时间。示例:MINUTE("15:36:25")等于36。MINUTE("15:36:25", "HH:mm:ss")等于36。', + name: 'MINUTE', + type: 'DATETIME', + }, + { + def: 'MIN_AGG(array): 根据当前分析维度,动态返回指标字段的最小值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n "array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n "示例:用户横轴为维度字段\'日\'时,纵轴的计算字段MIN_AGG(销量)返回的值为每日的最小值销量;当用户横轴为维度字段\'月\'时,MIN_AGG(销量)返回的值为每月的最小值销量。', + name: 'MIN_AGG', + type: 'AGG', + }, + { + def: 'MOD(number,divisor):返回两数相除的余数。结果的正负号与除数相同。number:为被除数。divisor:为除数。示例:MOD(3, 2) 等于 1MOD(-3, 2) 等于 1MOD(3, -2) 等于 -1MOD(-3, -2) 等于 -1', + name: 'MOD', + type: 'MATH', + }, + { + def: 'MONTH:(serial_number)返回日期中的月。月是介于1和12之间的一个数。Serial_number:含有所求的月的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:MONTH("2000/1/1")等于1。MONTH("2006/05/05")等于5。MONTH("1997/04/20")等于4。MONTH("2000-1-1", "yyyy-MM-dd")等于1。MONTH("2006-05-05", "yyyy-MM-dd")等于5。MONTH("1997-04-20", "yyyy-MM-dd")等于4。MONTH(35796)等于1。', + name: 'MONTH', + type: 'DATETIME', + }, + { + def: 'MONTHDELTA(date,delta):返回指定日期date后delta个月的日期。示例:MONTHDELTA("2008-08-08", 4)等于2008-12-08。', + name: 'MONTHDELTA', + type: 'DATETIME', + }, + { + def: 'NOW():获取当前时间。示例:如果系统时间是2012年5月12日 15点18分38秒则NOW()等于2012-05-12 15:18:36。', + name: 'NOW', + type: 'DATETIME', + }, + { + def: 'NUMTO(number,bool)或NUMTO(number):返回number的中文表示。其中bool用于选择中文表示的方式,当没有bool时采用默认方式显示。示例:NUMTO(2345,true)等于二三四五。示例:NUMTO(2345,false)等于二千三百四十五。示例:NUMTO(2345)等于二千三百四十五。', + name: 'NUMTO', + type: 'TEXT', + }, + { + def: 'NVL(value1,value2,value3,...):在所有参数中返回第一个不是null的值value1:可以为任意数,也可以为null。value2:可以为任意数,也可以为null。当字符串长度为0时, 返回也为null示例:NVL(12,20)等于12。NVL(null,12)等于12。NVL(null,null)等于null。NVL(20,null)等于20。NVL(null,null,10)等于10。', + name: 'NVL', + type: 'OTHER', + }, + { + def: 'OR(logical1,logical2,…): 当所有参数的值为假时,返回FALSE;当任意参数的值为真时,返回TRUE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:OR(1+7=9,5+7=11)等于FALSE。OR(1+7=8,5+7=11)等于TRUE。', + name: 'OR', + type: 'LOGIC', + }, + { + def: 'period_anls(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行上期末的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算的上期末为上年期末或者上月期末。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:period_anls(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年年末的销量;如果参数2为“M”,则计算结果为该日销量上月月末的销量。', + name: 'PERIOD_ANLS', + type: 'TABLE_CAL', + }, + { + def: 'PI(number): 是一个数学常量函数,当number为空时,函数返回精确到15位的数值3.141592653589793;当参数不为空时,number表示PI的倍数。示例:SIN(PI()/2)等于1。计算圆的面积的公式: S=PI()*(r^2),其中S为圆的面积,R为圆的半径。PI(3)等于9.42477796076938。', + name: 'PI', + type: 'MATH', + }, + { + def: 'POWER(number,power): 返回指定数字的乘幂。Number:底数,可以为任意实数。Power:指数。参数number按照该指数次幂乘方。备注: 可以使用符号“^”代替POWER,如: POWER(5,2)等于5^2。示例:POWER(6,2)等于36。POWER(14,5)等于537824。POWER(4,2/3)等于2.519842100。POWER(3,-2.3)等于0.079913677。', + name: 'POWER', + type: 'MATH', + }, + { + def: 'previous_period(x_agg(array))根据横纵轴或行列维度添加的日期字段进行环期值的计算。参数为用于计算的指标,该指标必须为聚合函数或聚合指标。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:previous_period(sum_agg(amount)) 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上一日的销量。', + name: 'PREVIOUS_PERIOD', + type: 'TABLE_CAL', + }, + { + def: 'PROMOTION(value1,value2):返回value2在value1上提升的比例。示例:PROMOTION(12, 14)等于0.166666666,即提升了16.6666666%.PROMOTION(-12, 14)等于2.166666666,即提升了216.6666666%.', + name: 'PROMOTION', + type: 'MATH', + }, + { + def: 'PROPER(text): 将文本中的第一个字母和所有非字母字符后的第一个字母转化成大写,其他字母变为小写。Text:需要转化为文本的公式、由双引号引用的文本串或是单元格引用。示例:PROPER("Finemore Integrated Office")等于“Finemore Integrated Office”。PROPER("100 percent")等于“100 Percent”。PROPER("SpreaDSheEt")等于“Spreadsheet”。', + name: 'PROPER', + type: 'TEXT', + }, + { + def: 'RADIANS(angle): 将角度转换成弧度。Angle:需要转换为弧度的角度。示例:RADIANS(90)等于1.570796327。', + name: 'RADIANS', + type: 'MATH', + }, + { + def: 'RAND(): 返回均匀分布的随机数。每计算一次工作表,函数都会返回一个新的随机数值。备注: 要生成一个位于a和b之间的随机数,可以使用以下的公式: C=RAND()*(b-a)+a。 如果要使一个随机产生的数值不随单元格的重计算而改变,可以在编辑框中输入=RAND()并保持编辑状态,然后按F9,将公式永久性地改为随机数。示例:假如需要生成一个大于等于0,小于60的随机数,使用公式: =RAND()*60。假如需要生成一个大于等于0,小于19的随机数,使用公式: =RAND()*19。假如需要生成一个大于等于0,小于50的随机数,使用公式: =RAND()*50。', + name: 'RAND', + type: 'MATH', + }, + { + def: 'RANDBETWEEN(value1,value2):返回value1和value2之间的一个随机整数。示例:RANDBETWEEN(12.333, 13.233)只会返回13。RANDBETWEEN(11.2, 13.3)有可能返回12或者13。', + name: 'RANDBETWEEN', + type: 'MATH', + }, + { + def: 'rank_anls(x_agg(array),range,order)根据横纵轴或行列维度添加的字段对指标进行跨行排名的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行排名,1为对组内所有行进行排名;第三个参数order为排名的计算规则,"asc"为升序排名,"desc"为降序排名。示例:rank_anls(sum_agg(amount),0,"asc")用户横轴轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算每个省份的销量在所有省份中的升序排名情况。', + name: 'RANK_ANLS', + type: 'TABLE_CAL', + }, + { + def: 'REGEXP(str, pattern):字符串str是否与正则表达式pattern相匹配。示例:REGEXP("aaaaac","a*c")等于true。REGEXP("abc","a*c")等于false。REGEXP(str, pattern, intNumber):字符串str是否与具有给定模式 intNumber的正则表达式pattern相匹配。示例:CASE_INSENSITIVE = 0 启用不区分大小写的匹配。 默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指 定 UNICODE_CASE 标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。 MULTILINE = 1 启用多行模式。DOTALL = 2 启用 dotall 模式。在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行 结束符。UNICODE_CASE = 3 启用 Unicode 感知的大小写折叠。指定此标志后,由 CASE_INSENSITIVE 标志启用时,不区分大小写的匹配将以 符合 Unicode Standard 的方式完成。CANON_EQ = 4 启用规范等价。 指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。UNIX_LINES = 5 启用 Unix 行模式。 在此模式中,.、^ 和 $ 的行为中仅识别 \'\n\' 行结束符。LITERAL = 6 启用模式的字面值解析。 指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的 元字符或转义序列不具有任何特殊意义。 标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志一起使用时将 对匹配产生影响。其他标志都变得多余了。COMMENTS = 7 模式中允许空白和注释。 此模式将忽略空白和在结束行之前以 # 开头的嵌入式注释。 REGEXP("Aaaaabbbbc","a*b*c", 3)等于true。REGEXP("Aaaaabbbbc","a*b*c", 1)等于false。', + name: 'REGEXP', + type: 'TEXT', + }, + { + def: 'REPEAT(text,number_times): 根据指定的次数重复显示文本。REPEAT函数可用来显示同一字符串,并对单元格进行填充。Text:需要重复显示的文本或包含文本的单元格引用。Number_times:指定文本重复的次数,且为正数。如果number_times为0,REPEAT函数将返回“”(空文本)。如果number_times不是整数,将被取整。REPEAT函数的最终结果通常不大于32767个字符。备注: 该函数可被用于在工作表中创建简单的直方图。示例:REPEAT("$",4)等于“$$$$”。如果单元格B10的内容为“你好”,REPEAT(B10,3)等于“你好你好你好”。', + name: 'REPEAT', + type: 'TEXT', + }, + { + def: 'REPLACE(text, texttoreplace, replacetext):根据指定字符串,用其他文本来代替原始文本中的内容。text:需要被替换部分字符的文本或单元格引用。texttoreplace:指定的字符串。replacetext:需要替换部分旧文本的文本。示例:REPLACE("abcd", "a", "re")等于"rebcd"。REPLACE("a**d", "**d", "rose")等于"arose"。REPLACE(old_text,start_num,num_chars,new_text): 根据指定的字符数,用其他文本串来替换某个文本串中的部分内容。Old_text:需要被替换部分字符的文本或单元格引用。Start_num:需要用new_text来替换old_text中字符的起始位置。Num_chars:需要用new_text来替换old_text中字符的个数。New_text:需要替换部分旧文本的文本。示例:REPLACE("0123456789",5,4,"*")等于“0123*89”。REPLACE("1980",3,2,"99")等于“1999”。', + name: 'REPLACE', + type: 'TEXT', + }, + { + def: 'RIGHT(text,num_chars): 根据指定的字符数从右开始返回文本串中的最后一个或几个字符。Text:包含需要提取字符的文本串或单元格引用。Num_chars:指定RIGHT函数从文本串中提取的字符数。Num_chars不能小于0。如果num_chars大于文本串长度,RIGHT函数将返回整个文本。如果不指定num_chars,则默认值为1。示例:RIGHT("It is interesting",6)等于“esting”。RIGHT("Share Holder")等于“r”。RIGHT("Huge sale",4)等于“sale”。', + name: 'RIGHT', + type: 'TEXT', + }, + { + def: 'ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.', + name: 'ROUND', + type: 'MATH', + }, + { + def: 'ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.', + name: 'ROUND', + type: 'COMMON', + }, + { + def: 'same_period(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行同期值的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算同期时计算某日的年同期或者某日的月同期。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:same_period(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年同日的销量;如果参数2为“M”,则计算结果为该日销量上月同日的销量。', + name: 'SAME_PERIOD', + type: 'TABLE_CAL', + }, + { + def: 'SECOND(serial_number):返回某一指定时间的秒数,其值是介于0与59之间的一个整数。Serial_number:包含所求秒数的时间。示例:SECOND("15:36:25")等于25。SECOND("15:36:25", "HH:mm:ss")等于25。', + name: 'SECOND', + type: 'DATETIME', + }, + { + def: 'SIGN(number):返回数字的符号。当数字为正数时返回 1,为零时返回 0,为负数时返回 -1。Number:为任意实数。示例:SIGN(10) 等于 1SIGN(4-4) 等于 0SIGN(-0.00001) 等于 -1', + name: 'SIGN', + type: 'MATH', + }, + { + def: 'SIN(number): 计算给定角度的正弦值。Number:待求正弦值的以弧度表示的角度。备注: 如果参数的单位是度,将其乘以PI()/180即可转换成弧度。示例:SIN(10)等于-0.5440211108893698。SIN(45*PI()/180)等于0.707106781。', + name: 'SIN', + type: 'MATH', + }, + { + def: 'SPLIT(String1,String2):返回由String2分割String1组成的字符串数组。String1:以双引号表示的字符串。String2:以双引号表示的分隔符。例如逗号","示例:SPLIT("hello,world,yes",",") = ["hello","world","yes"]。SPLIT("this is very good"," ") = ["this","is","very","good"]。备注:如果只有一个参数,则返回一个错误。如果有多个参数,则只有前两个起作用。', + name: 'SPLIT', + type: 'TEXT', + }, + { + def: 'SQRT(number): 返回一个正数的平方根。Number:要求其平方根的任一正数。备注:Number必须是一个正数,否则函数返回错误信息*NUM!。示例:SQRT(64)等于8。SQRT(-64)返回*NUM!。', + name: 'SQRT', + type: 'MATH', + }, + { + def: 'STARTWITH(str1,str2):判断字符串str1是否以str2开始。备注: str1和str2都是大小写敏感的。示例:STARTWITH("FineReport","Fine")等于true。STARTWITH("FineReport","Report")等于false。STARTWITH("FineReport","fine")等于false。', + name: 'STARTWITH', + type: 'TEXT', + }, + { + def: 'STDEV_AGG(array): 根据当前分析维度,动态返回指标字段的标准差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n "array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n "示例:用户横轴为维度字段\'日\'时,纵轴的计算字段STDEV_AGG(销量)返回的值为每日的销量标准差;当用户横轴为维度字段\'月\'时,STDEV_AGG(销量)返回的值为每月的销量标准差。', + name: 'STDEV_AGG', + type: 'AGG', + }, + { + def: 'SUBSTITUTE(text,old_text,new_text,instance_num): 用new_text替换文本串中的old_text。Text:需要被替换字符的文本,或含有文本的单元格引用。Old_text:需要被替换的部分文本。New_text:用于替换old_text的文本。Instance_num:指定用new_text来替换第几次出现的old_text。如果指定了instance_num,则只有指定位置上的old_text被替换,否则文字串中出现的所有old_text都被new_text替换。备注: 如果需要替换文本串中的指定文本,则使用SUBSTITUTE函数;如果需要替换文本串中指定位置上的任意文本,则使用REPLACE函数。示例:SUBSTITUTE("data base","base","model")等于“data model”。SUBSTITUTE("July 28, 2000","2","1",1)等于“July 18, 2000”。SUBSTITUTE("July 28, 2000","2","1")等于“July 18, 1000”。SUBSTITUTE("July 28, 2000","2","1",2)等于“July 28, 1000”。 ', + name: 'SUBSTITUTE', + type: 'TEXT', + }, + { + def: 'SUM_AGG(array):根据当前分析维度,动态返回指标字段的汇总求和值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段\'日\'时,纵轴的计算字段SUM_AGG(销量)返回的值为每日的汇总销量;当用户横轴为维度字段\'月\'时,SUM_AGG(销量)返回的值为每月的汇总销量。', + name: 'SUM_AGG', + type: 'AGG', + }, + { + def: 'switch(表达式, 值1, 结果1, 值2, 结果2, ...)如果表达式的结果是值1,整个函数返回结果1如果表达式的结果是值2,整个函数返回结果2如果表达式的结果是值3,整个函数返回结果3等等', + name: 'SWITCH', + type: 'LOGIC', + }, + { + def: 'TAN(number): 返回指定角度的正切值。Number:待求正切值的角度,以弧度表示。如果参数是以度为单位的,乘以Pi()/180后转换为弧度。示例:TAN(0.8)等于1.029638557。TAN(45*Pi()/180)等于1。', + name: 'TAN', + type: 'MATH', + }, + { + def: 'TIME(hour,minute,second): 返回代表指定时间的小数。介于0:00:00(12:00:00 A.M.)与23:59:59(11:59:59 P.M.)之间的时间可返回0到0.99999999之间的对应数值。Hour:介于0到23之间的数。Minute:介于0到59之间的数。Second:介于0到59之间的数。示例:TIME(14,40,0)等于2:40 PM。TIME(19,43,24)等于7:43 PM。', + name: 'TIME', + type: 'DATETIME', + }, + { + def: 'TODATE()函数可以将各种日期形式的参数转换为日期类型。它有三种参数的形式:1 参数是一个日期型的参数,那么直接将这个参数返回。示例:TODATE(DATE(2007,12,12))返回2007年12月12日组成的日期。2 参数是以从1970年1月1日0时0分0秒开始的毫秒数,返回对应的时间。示例:TODATE(1023542354746)返回2002年6月8日。3 参数是日期格式的文本,那么返回这个文本对应的日期。示例:TODATE("2007/10/15")返回2007年10月5日组成的日期。TODATE("2007-6-8")返回2007年6月8日组成的日期。4 有两个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式。示例:TODATE("1/15/07","mm/dd/yy")返回07年1月15日组成的日期。特别的,"yyyyMMdd"是用来解析形如“20081230”之类的日期格式的。比如TODATE("20110830","yyyyMMdd")返回11年08月30日组成的日期5 有三个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式,第三个参数为解析日期的语言,如:zh(中文),en(英文)。示例:TODATE("星期三 1/15/07","EEE mm/dd/yy", "zh")返回07年1月15日组成的日期,使用“zh(中文)”才能够正常解析“星期三”这个字符串。', + name: 'TODATE', + type: 'DATETIME', + }, + { + def: 'TODAY():获取当前日期。示例:如果系统日期是2005年9月10日则TODAY()等于2005-9-10。', + name: 'TODAY', + type: 'DATETIME', + }, + { + def: 'TODOUBLE(text): 将文本转换成Double对象。Text:需要转换的文本。示例:TODOUBLE("123.21")等于 new Double(123.21)。', + name: 'TODOUBLE', + type: 'TEXT', + }, + { + def: 'TOINTEGER(text): 将文本转换成Integer对象。Text:需要转换的文本。示例:TOINTEGER("123")等于 new Integer(123)。', + name: 'TOINTEGER', + type: 'TEXT', + }, + { + def: 'total(x_agg(array),range,agg)根据横纵轴或行列维度添加的字段对指标进行跨行汇总的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行汇总,1为对组内所有行进行汇总;第三个参数agg为汇总的计算规则,"sum"为求和;"avg"为求平均,"max"为求最大值,"min"为求最小值示例:total(sum_agg(array),0,"avg")用户横纵轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算平均每个省份的销量', + name: 'TOTAL', + type: 'TABLE_CAL', + }, + { + def: 'TRIM(text): 清除文本中所有空格,单词间的单个空格除外,也可用于带有不规则空格的文本。Text:需要清除空格的文本。示例:TRIM(" Monthly Report")等于Monthly Report。', + name: 'TRIM', + type: 'TEXT', + }, + { + def: 'TRUNC(number,num_digits):将数字的小数部分截去,返回整数。number:需要截尾取整的数字。num_digits:用于指定取整精度的数字。示例:TRUNC(8.9) 等于 8TRUNC(-8.9) 等于 -8TRUNC(PI()) 等于 3', + name: 'TRUNC', + type: 'MATH', + }, + { + def: 'UPPER(text): 将文本中所有的字符转化为大写。Text:需要转化为大写字符的文本,或是包含文本的单元格引用。示例:UPPER("notes")等于“NOTES”。如果单元格E5的值为“Examples”,则UPPER(E5)等于“EXAMPLES”。', + name: 'UPPER', + type: 'TEXT', + }, + { + def: 'VAR_AGG(array): 根据当前分析维度,动态返回指标字段的方差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n "array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n "示例:用户横轴为维度字段\'日\'时,纵轴的计算字段VAR_AGG(销量)返回的值为每日的销量方差;当用户横轴为维度字段\'月\'时,VAR_AGG(销量)返回的值为每月的销量方差。', + name: 'VAR_AGG', + type: 'AGG', + }, + { + def: 'WEEK(serial_num):返回一个代表一年中的第几周的数字。Serial_num:表示输入的日期。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:WEEK("2010/1/1")等于52。WEEK("2010/1/6")等于1。WEEK(35796)等于1。', + name: 'WEEK', + type: 'DATETIME', + }, + { + def: 'weekdate(year,month,weekOfMonth,dayOfWeek): 返回指定年月的指定周的周几的具体日期。示例:weekdate(2009,10,2,1)返回的是2009年的10月的第二个周的第一天即星期天的日期,返回的是2009-10-04最后一个参数dayOfWeek为-1时,表示这个周的最后一天示例:weekdate(2009,12,1,-1)返回的是2009年的12月的第一个周的最后一天即星期六的日期,返回的是2009-12-05', + name: 'WEEKDATE', + type: 'DATETIME', + }, + { + def: 'WEEKDAY(Serial_number):获取日期并返回星期数。返回值为介于0到6之间的某一整数,分别代表星期中的某一天(从星期日到星期六)。Serial_number:输入的日期备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。举例:WEEKDAY("2005/9/10")等于6(星期六)。WEEKDAY("2005/9/11")等于0(星期日)。WEEKDAY(35796)等于4(星期四)。', + name: 'WEEKDAY', + type: 'DATETIME', + }, + { + def: 'YEAR:(serial_number)返回日期中的年。Year是介于1900和9999之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:YEAR("2000/1/1")等于2000。YEAR("2006/05/05")等于2006。YEAR("1997/04/20")等于1997。YEAR("2000-1-1", "yyyy-MM-dd")等于2000。YEAR("2006-05-05", "yyyy-MM-dd")等于2006。YEAR("1997-04-20", "yyyy-MM-dd")等于1997。YEAR(35796)等于1998。', + name: 'YEAR', + type: 'DATETIME', + }, + { + def: 'YEARDELTA(date, delta):返回指定日期后delta年的日期。示例:YEARDELTA("2008-10-10",10)等于2018-10-10。', + name: 'YEARDELTA', + type: 'DATETIME', + }, + ], +}; diff --git a/src/web/src/ui/fineui.ts b/src/web/src/ui/fineui.ts index 760af2b..5c1fa2e 100644 --- a/src/web/src/ui/fineui.ts +++ b/src/web/src/ui/fineui.ts @@ -56,6 +56,8 @@ export const NumberEditorXtype = 'bi.number_editor'; export const CodeEditorXtype = 'bi.code_editor'; export const ComponentsStyleTable = 'bi.components.style_table'; export const IconTextValue_Combo = 'bi.icon_text_value_combo'; +export const BarPopoverXtype = 'bi.bar_popover'; + // 布局 export const VerticalAdaptXtype = 'bi.vertical_adapt'; export const VtapeXtype = 'bi.vtape'; From bb8d5caf54fb136ee7eeff8fff4ba4b1404aaac6 Mon Sep 17 00:00:00 2001 From: alan Date: Fri, 8 Nov 2019 14:07:35 +0800 Subject: [PATCH 03/14] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/parameter/parameter.model.ts | 40 ---- .../modules/components/parameter/parameter.ts | 172 ------------------ .../parameter/parameter.typings.d.ts | 9 - .../parameter_input/input/input.service.ts | 20 -- .../parameter/parameter_input/input/input.ts | 6 - .../parameter_input/input/input_boolean.ts | 41 ----- .../parameter_input/input/input_date.ts | 42 ----- .../parameter_input/input/input_formula.ts | 45 ----- .../parameter_input/input/input_int.ts | 42 ----- .../parameter_input/input/input_number.ts | 42 ----- .../parameter_input/input/input_string.ts | 41 ----- .../parameter_input/parameter_input.less | 5 - .../parameter_input/parameter_input.model.ts | 40 ---- .../parameter_input/parameter_input.ts | 165 ----------------- 14 files changed, 710 deletions(-) delete mode 100644 src/web/src/modules/components/parameter/parameter.model.ts delete mode 100644 src/web/src/modules/components/parameter/parameter.ts delete mode 100644 src/web/src/modules/components/parameter/parameter.typings.d.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input.service.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input_boolean.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input_date.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input_formula.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input_int.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input_number.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/input/input_string.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/parameter_input.less delete mode 100644 src/web/src/modules/components/parameter/parameter_input/parameter_input.model.ts delete mode 100644 src/web/src/modules/components/parameter/parameter_input/parameter_input.ts diff --git a/src/web/src/modules/components/parameter/parameter.model.ts b/src/web/src/modules/components/parameter/parameter.model.ts deleted file mode 100644 index 1118467..0000000 --- a/src/web/src/modules/components/parameter/parameter.model.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { model, Model } from '../../core/core'; -import { ParametersType } from './parameter.typings'; - -@model() -export class ParameterModel extends Model { - static xtype = 'plugin.model.report.json.components.parameter'; - - childContext = ['selectedId', 'parameters']; - - state() { - return { - parameters: [] as ParametersType[], - selectedId: '', - }; - } - - actions = { - setParameters: (parameters: ParametersType[]) => { - this.model.parameters = parameters; - }, - removeSelectedParameter: () => { - this.setParameters(this.model.parameters.filter(item => item.id !== this.model.selectedId)); - }, - move: (type: 'up'|'down') => { - if (this.model.selectedId) { - const index = this.model.parameters.findIndex(item => item.id === this.model.selectedId); - if (type === 'up' && index > 0) { - const oldItem = this.model.parameters.splice(index, 1)[0]; - this.model.parameters.splice(index - 1, 0, oldItem); - } - if (type === 'down' && index < this.model.parameters.length - 1) { - const oldItem = this.model.parameters.splice(index, 1)[0]; - this.model.parameters.splice(index + 1, 0, oldItem); - } - } - }, - } -} - - diff --git a/src/web/src/modules/components/parameter/parameter.ts b/src/web/src/modules/components/parameter/parameter.ts deleted file mode 100644 index 60e48b7..0000000 --- a/src/web/src/modules/components/parameter/parameter.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { shortcut, store } from '../../core/core'; -import { VtapeXtype, LabelXtype, HtapeXtype, LeftRightVerticalAdaptLayoutXtype, IconButtonXtype, ButtonGroupXtype, VerticalXtype } from 'ui'; -import { ParameterInput } from './parameter_input/parameter_input'; -import { ParameterModel } from './parameter.model'; -import { ParametersType } from './parameter.typings'; - -@shortcut() -@store(ParameterModel) -export class Parameter extends BI.Widget { - static xtype = 'plugin.report.redis.components.parameter'; - props = { - title: '', - showRefresh: true, - height: 200, - value: [] as ParametersType[], - } - - parameterInputs: any; - - model: ParameterModel['model'] - store: ParameterModel['store'] - - watch = { - parameters: () => { - this.parameterInputs.populate(this.renderParameterInputs()); - }, - selectedId: (id: string) => { - this.parameterInputs.setValue(id); - }, - } - - render() { - const { title, showRefresh } = this.options; - this.setDefalue(); - - return { - type: VtapeXtype, - items: [{ - el: { - type: LeftRightVerticalAdaptLayoutXtype, - items: { - left: [{ - type: LabelXtype, - lgap: 2, - text: title, - textAlign: 'left', - }], - right: [{ - type: IconButtonXtype, - cls: 'text-add-tip-font', - width: 25, - title: BI.i18nText('Plugin-Redis_Parameter_Insert'), - handler: () => { - this.store.setParameters([{ - name: '', - value: '', - id: BI.UUID(), - type: 'string', - }, ...this.model.parameters]); - }, - }, { - type: IconButtonXtype, - cls: 'close-font bi-error', - width: 25, - title: BI.i18nText('Plugin-Redis_Parameter_Delete'), - handler: () => { - if (this.model.selectedId) { - BI.Msg.confirm(BI.i18nText('BI-Basic_Prompt'), BI.i18nText('Plugin-Redis_Parameter_Delete_Confirm'), (re: boolean) => { - if (re) { - this.store.removeSelectedParameter(); - } - }); - } else { - BI.Msg.alert(BI.i18nText('BI-Basic_Prompt'), BI.i18nText('Plugin-Redis_Parameter_Delete_Alert')); - } - }, - }, { - type: IconButtonXtype, - cls: 'add-up-font', - width: 25, - title: BI.i18nText('Plugin-Redis_Parameter_Move_Up'), - handler: () => { - this.store.move('up'); - }, - }, { - type: IconButtonXtype, - cls: 'minus-down-font', - width: 25, - title: BI.i18nText('Plugin-Redis_Parameter_Move_Down'), - handler: () => { - this.store.move('down'); - }, - }, showRefresh ? { - type: IconButtonXtype, - cls: 'redis-refresh-font', - width: 25, - title: BI.i18nText('Plugin-Redis_Parameter_Refresh'), - handler: () => { - this.setDefalue(); - }, - } : null], - }, - - }, - height: 25, - }, { - el: { - type: HtapeXtype, - cls: 'bi-border', - items: [{ - el: { - type: LabelXtype, - text: BI.i18nText('Plugin-Redis_Dataset_Parameter_Name'), - }, - width: 0.5, - }, { - el: { - type: LabelXtype, - cls: 'bi-border-left', - text: BI.i18nText('Plugin-Redis_Dataset_Parameter_Value'), - }, - width: 0.5, - }], - }, - height: 25, - }, { - type: ButtonGroupXtype, - cls: 'bi-border', - layouts: [{ - type: VerticalXtype, - }], - items: this.renderParameterInputs(), - ref: (_ref: any) => { - this.parameterInputs = _ref; - }, - }], - }; - } - - public getValue() { - return this.model.parameters.map(item => { - return { - name: item.name, - value: item.value, - type: item.type, - }; - }); - } - - private setDefalue() { - const { value = [] } = this.options; - this.store.setParameters(value.map(item => { - return { - ...item, - id: BI.UUID(), - }; - })); - } - - private renderParameterInputs() { - return this.model.parameters.map(item => { - return { - type: ParameterInput.xtype, - inputName: item.name, - inputValue: item.value, - id: item.id, - value: item.id, - selected: item.id === this.model.selectedId, - }; - }); - } -} diff --git a/src/web/src/modules/components/parameter/parameter.typings.d.ts b/src/web/src/modules/components/parameter/parameter.typings.d.ts deleted file mode 100644 index 0d8f25c..0000000 --- a/src/web/src/modules/components/parameter/parameter.typings.d.ts +++ /dev/null @@ -1,9 +0,0 @@ - -export interface ParametersType { - name: string; - value: string; - id?: string; - type: inputTypes; -} - -export type inputTypes = 'string' | 'int' | 'number' | 'date' | 'boolean' | 'formula' diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input.service.ts b/src/web/src/modules/components/parameter/parameter_input/input/input.service.ts deleted file mode 100644 index 48386bd..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { inputTypes } from '../../parameter.typings'; - -const inputs: { - [key: string]: any; -} = {}; - -export function input(key: inputTypes): ClassDecorator { - return (target: object) => { - inputs[key] = target; - }; -} - -export function getInput(type: inputTypes): string { - const inputWidget = inputs[type]; - if (BI.isNull(inputWidget)) { - throw new TypeError(); - } - - return inputWidget.xtype; -} diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input.ts b/src/web/src/modules/components/parameter/parameter_input/input/input.ts deleted file mode 100644 index 7e963fb..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input.ts +++ /dev/null @@ -1,6 +0,0 @@ -import './input_boolean'; -import './input_date'; -import './input_int'; -import './input_number'; -import './input_string'; -import './input_formula'; diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input_boolean.ts b/src/web/src/modules/components/parameter/parameter_input/input/input_boolean.ts deleted file mode 100644 index f68edd3..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input_boolean.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { shortcut } from '../../../../core/core'; -import { MultiSelectItemXtype } from 'ui'; -import { input } from './input.service'; - -@shortcut() -@input('boolean') -export class InputBoolean extends BI.Widget { - static xtype = 'plugin.report.json.components.parameter_input.boolean' - - props = { - value: '', - } - - input: any; - - render() { - const { value } = this.options; - - return { - type: MultiSelectItemXtype, - width: 80, - selected: !!value, - text: 'true', - ref: (_ref: any) => { - this.input = _ref; - }, - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - const value = this.input.getValue(); - this.fireEvent('EVENT_CHANGE', value); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.fireEvent('EVENT_FOCUS'); - }, - }], - }; - } -} diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input_date.ts b/src/web/src/modules/components/parameter/parameter_input/input/input_date.ts deleted file mode 100644 index 92df8d2..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input_date.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { shortcut } from '../../../../core/core'; -import { DynamicDateComboXtype } from 'ui'; -import { input } from './input.service'; - -@shortcut() -@input('date') -export class InputDate extends BI.Widget { - static xtype = 'plugin.report.json.components.parameter_input.date' - - props = { - value: '', - } - - input: any; - - render() { - const { value } = this.options; - - return { - type: DynamicDateComboXtype, - height: 22, - allowBlank: true, - value, - ref: (_ref: any) => { - this.input = _ref; - }, - validationChecker: (v: string) => BI.isNumeric(v), - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - const value = this.input.getValue(); - this.fireEvent('EVENT_CHANGE', value); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.fireEvent('EVENT_FOCUS'); - }, - }], - }; - } -} diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input_formula.ts b/src/web/src/modules/components/parameter/parameter_input/input/input_formula.ts deleted file mode 100644 index ecf238a..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input_formula.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { shortcut } from '../../../../core/core'; -import { EditorXtype } from 'ui'; -import { input } from './input.service'; - -@shortcut() -@input('formula') -export class InputFormula extends BI.Widget { - static xtype = 'plugin.report.json.components.parameter_input.formula' - - props = { - value: '', - } - - input: any; - - mounted() { - - } - - render() { - const { value } = this.options; - - return { - type: EditorXtype, - height: 22, - allowBlank: true, - value, - ref: (_ref: any) => { - this.input = _ref; - }, - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - const value = this.input.getValue(); - this.fireEvent('EVENT_CHANGE', value); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.fireEvent('EVENT_FOCUS'); - }, - }], - }; - } -} diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input_int.ts b/src/web/src/modules/components/parameter/parameter_input/input/input_int.ts deleted file mode 100644 index b8eff45..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input_int.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { shortcut } from '../../../../core/core'; -import { NumberEditorXtype } from 'ui'; -import { input } from './input.service'; - -@shortcut() -@input('int') -export class InputInt extends BI.Widget { - static xtype = 'plugin.report.json.components.parameter_input.int' - - props = { - value: '', - } - - input: any; - - render() { - const { value } = this.options; - - return { - type: NumberEditorXtype, - height: 22, - allowBlank: true, - value, - ref: (_ref: any) => { - this.input = _ref; - }, - validationChecker: (v: string) => BI.isInteger(v), - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - const value = this.input.getValue(); - this.fireEvent('EVENT_CHANGE', value); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.fireEvent('EVENT_FOCUS'); - }, - }], - }; - } -} diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input_number.ts b/src/web/src/modules/components/parameter/parameter_input/input/input_number.ts deleted file mode 100644 index d2559fc..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input_number.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { shortcut } from '../../../../core/core'; -import { EditorXtype } from 'ui'; -import { input } from './input.service'; - -@shortcut() -@input('number') -export class InputNumber extends BI.Widget { - static xtype = 'plugin.report.json.components.parameter_input.number' - - props = { - value: '', - } - - input: any; - - render() { - const { value } = this.options; - - return { - type: EditorXtype, - height: 22, - allowBlank: true, - value, - ref: (_ref: any) => { - this.input = _ref; - }, - validationChecker: (v: string) => BI.isNumeric(v), - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - const value = this.input.getValue(); - this.fireEvent('EVENT_CHANGE', value); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.fireEvent('EVENT_FOCUS'); - }, - }], - }; - } -} diff --git a/src/web/src/modules/components/parameter/parameter_input/input/input_string.ts b/src/web/src/modules/components/parameter/parameter_input/input/input_string.ts deleted file mode 100644 index 67b98b5..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/input/input_string.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { shortcut } from '../../../../core/core'; -import { EditorXtype } from 'ui'; -import { input } from './input.service'; - -@shortcut() -@input('string') -export class InputString extends BI.Widget { - static xtype = 'plugin.report.json.components.parameter_input.string' - - props = { - value: '', - } - - input: any; - - render() { - const { value } = this.options; - - return { - type: EditorXtype, - height: 22, - allowBlank: true, - value, - ref: (_ref: any) => { - this.input = _ref; - }, - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - const value = this.input.getValue(); - this.fireEvent('EVENT_CHANGE', value); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.fireEvent('EVENT_FOCUS'); - }, - }], - }; - } -} diff --git a/src/web/src/modules/components/parameter/parameter_input/parameter_input.less b/src/web/src/modules/components/parameter/parameter_input/parameter_input.less deleted file mode 100644 index f387ddb..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/parameter_input.less +++ /dev/null @@ -1,5 +0,0 @@ -@import '../../../../less/index.less'; - -.plugin-report-json-parameter-input.active{ - background-color: @color-bi-light-blue-60; -} \ No newline at end of file diff --git a/src/web/src/modules/components/parameter/parameter_input/parameter_input.model.ts b/src/web/src/modules/components/parameter/parameter_input/parameter_input.model.ts deleted file mode 100644 index e7fc0f1..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/parameter_input.model.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { model, Model } from '../../../core/core'; -import { ParameterModel } from '../parameter.model'; -import { inputTypes } from '../parameter.typings'; - -@model() -export class ParameterInputModel extends Model<{ - types: { - selectedId: ParameterModel['TYPE']['selectedId']; - parameters: ParameterModel['TYPE']['parameters']; - }, - context: ParameterInputModel['context']; -}> { - static xtype = 'plugin.model.report.json.components.parameter_input'; - - context = ['selectedId', 'parameters']; - - actions = { - setSelectedId: (id: string) => { - this.model.selectedId = id; - }, - setParameterName: (id: string, name: string) => { - const thisParameter = this.getParameter(id); - if (thisParameter) { - thisParameter.name = name; - } - }, - setParameterValue: (id: string, value: string, type: inputTypes) => { - const thisParameter = this.getParameter(id); - if (thisParameter) { - thisParameter.value = value; - thisParameter.type = type; - } - }, - } - private getParameter(id: string) { - return this.model.parameters.find(item => item.id === id); - } -} - - diff --git a/src/web/src/modules/components/parameter/parameter_input/parameter_input.ts b/src/web/src/modules/components/parameter/parameter_input/parameter_input.ts deleted file mode 100644 index 0ad4ed0..0000000 --- a/src/web/src/modules/components/parameter/parameter_input/parameter_input.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { shortcut, store } from '../../../core/core'; -import { HtapeXtype, EditorXtype, TextButtonXtype, TabXtype, IconComboXtype } from 'ui'; -import { ParameterInputModel } from './parameter_input.model'; -import { inputTypes } from '../parameter.typings'; -import { getInput } from './input/input.service'; -import './input/input'; -import './parameter_input.less'; - -@shortcut() -@store(ParameterInputModel) -export class ParameterInput extends BI.BasicButton { - static xtype = 'plugin.report.json.components.parameter_input' - - props = { - inputName: '', - inputValue: '', - height: 22, - id: '', - baseCls: 'plugin-report-json-parameter-input', - } - - store: ParameterInputModel['store'] - model: ParameterInputModel['model'] - - tab: any; - parameterName: any; - parameterValue: any; - iconCombo: any; - - render() { - let { inputName, inputValue } = this.options; - const { id } = this.options; - - return { - type: HtapeXtype, - cls: 'bi-border', - items: [{ - el: { - type: EditorXtype, - height: 22, - allowBlank: true, - value: inputName, - ref: (_ref: any) => { - this.parameterName = _ref; - }, - listeners: [{ - eventName: BI.TextEditor.EVENT_CHANGE, - action: () => { - inputName = this.parameterName.getValue(); - this.tab.setSelect(inputName ? 'string' : 'tip'); - inputValue = inputName ? inputValue : ''; - this.store.setParameterName(id, inputName); - }, - }, { - eventName: BI.TextEditor.EVENT_FOCUS, - action: () => { - this.store.setSelectedId(id); - }, - }], - }, - width: 0.5, - }, { - el: { - type: HtapeXtype, - items: [{ - type: TabXtype, - single: true, - showIndex: inputName ? 'string' : 'tip', - ref: (_ref: any) => { - this.tab = _ref; - }, - cardCreator: (index: inputTypes | 'tip') => this.renderInputs(index), - }], - }, - width: 0.5, - }], - }; - } - - private renderInputs(type: inputTypes | 'tip') { - const { inputValue, id } = this.options; - if (type === 'tip') { - return { - type: TextButtonXtype, - cls: 'bi-error bi-border-left', - text: BI.i18nText('Plugin-Redis_Parameter_Please_Set_Parameter_Name'), - handler: () => { - this.parameterName.focus(); - }, - }; - } - const xtype = getInput(type); - - return { - type: HtapeXtype, - items: [{ - el: { - type: IconComboXtype, - cls: 'bi-border-left bi-border-right', - height: 22, - width: 25, - value: type, - items: this.renderDownList(), - ref: (_ref: any) => { - this.iconCombo = _ref; - }, - listeners: [{ - eventName: 'EVENT_CHANGE', - action: () => { - this.tab.setSelect('tip'); - const typeValue = this.iconCombo.getValue()[0]; - if (typeValue) { - this.tab.setSelect(typeValue); - } - }, - }], - }, - width: 25, - }, { - type: xtype, - value: inputValue, - listeners: [{ - eventName: 'EVENT_CHANGE', - action: (value: string) => { - const type = this.iconCombo.getValue()[0]; - this.store.setParameterValue(id, value, type); - }, - }, { - eventName: 'EVENT_FOCUS', - action: () => { - this.store.setSelectedId(id); - }, - }], - }], - }; - } - - private renderDownList() { - return [{ - text: BI.i18nText('Plugin-Redis_Parameter_Type_String'), - value: 'string', - iconCls: 'input-string-font', - }, { - text: BI.i18nText('Plugin-Redis_Parameter_Type_Int'), - value: 'int', - iconCls: 'input-int-font', - }, { - text: BI.i18nText('Plugin-Redis_Parameter_Type_Number'), - value: 'number', - iconCls: 'input-number-font', - }, { - text: BI.i18nText('Plugin-Redis_Parameter_Type_Date'), - value: 'date', - iconCls: 'input-date-font', - }, { - text: BI.i18nText('Plugin-Redis_Parameter_Type_Boolean'), - value: 'boolean', - iconCls: 'input-boolean-font', - }, { - text: BI.i18nText('Plugin-Redis_Parameter_Type_Formula'), - value: 'formula', - iconCls: 'input-formula-font', - }]; - } -} From 57e70eb0a5a22802299ba82127b79f8925a21742 Mon Sep 17 00:00:00 2001 From: alan Date: Fri, 8 Nov 2019 16:49:33 +0800 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/web/src/modules/app.dataset.ts | 20 +++++++++++-------- src/web/src/modules/app.model.ts | 2 -- src/web/src/modules/app.program.ts | 19 ++++++++++-------- .../database_index/database_index.model.ts | 4 ++-- .../database_index/database_index.ts | 20 +++++++++++-------- src/web/src/modules/crud/crud.request.ts | 2 +- src/web/src/modules/crud/crud.service.ts | 7 +------ .../modules/table_list/table_list.model.ts | 2 +- src/web/src/modules/table_list/table_list.ts | 12 +++++++++++ 9 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/web/src/modules/app.dataset.ts b/src/web/src/modules/app.dataset.ts index 62b4256..370507c 100644 --- a/src/web/src/modules/app.dataset.ts +++ b/src/web/src/modules/app.dataset.ts @@ -1,5 +1,5 @@ import { shortcut, store } from '@core/core'; -import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, CodeEditorXtype, ComponentsStyleTable, ButtonXtype, IconTextValue_Combo } from 'ui'; +import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, ComponentsStyleTable, ButtonXtype, IconTextValue_Combo, TextAreaEditorXtype } from 'ui'; import { TableList } from './table_list/table_list'; import '../less/index.less'; import { DatabaseIndex } from './components/database_index/database_index'; @@ -27,7 +27,7 @@ export class RedisDataset extends BI.Widget { value: { datasetData: { database: '', - orderValue: '0', + orderValue: 0, query: '', parameters: [], }, @@ -38,14 +38,16 @@ export class RedisDataset extends BI.Widget { parameters: () => { this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); }, - ablePreview: (ablePreview: boolean) => { - this.previewButton.setEnable(ablePreview); + ableSave: (ableSave: boolean) => { + this.previewButton.setEnable(ableSave); }, } render() { - const { database = '', orderValue = '0', query = '', parameters = [] } = this.options.value.datasetData || {}; + const { database = '', orderValue = 0, query = '', parameters = [] } = this.options.value.datasetData || {}; this.store.setParameters(parameters); + this.store.setAbleSave(!!query); + const inputType = typeof orderValue === 'string' ? 'formula' : 'int'; return { type: HtapeXtype, @@ -81,7 +83,7 @@ export class RedisDataset extends BI.Widget { type: IconComboXtype, height: 22, width: 28, - value: 'int', + value: inputType, items: [{ text: BI.i18nText('Plugin-Redis_Parameter_Type_Int'), value: 'int', @@ -107,6 +109,7 @@ export class RedisDataset extends BI.Widget { type: DatabaseIndex.xtype, rgap: 11, value: orderValue, + inputType, ref: (_ref: any) => { this.databaseIndex = _ref; }, @@ -124,9 +127,10 @@ export class RedisDataset extends BI.Widget { }, width: this.textWidth, }, { - type: CodeEditorXtype, + type: TextAreaEditorXtype, cls: 'bi-border', height: 200, + allowBlank: true, value: query, ref: (_ref: any) => { this.queryCondition = _ref; @@ -165,7 +169,7 @@ export class RedisDataset extends BI.Widget { el: { type: ButtonXtype, text: BI.i18nText('Plugin-Redis_Preview'), - disabled: !this.model.ablePreview, + disabled: !BI.get(this.model, 'ableSave'), handler: () => { this.openPreview(); }, diff --git a/src/web/src/modules/app.model.ts b/src/web/src/modules/app.model.ts index 36fd240..f1dd4c8 100644 --- a/src/web/src/modules/app.model.ts +++ b/src/web/src/modules/app.model.ts @@ -8,14 +8,12 @@ export class RedisModel extends Model { state() { return { parameters: [] as ParameterType[], - ablePreview: false, }; } actions = { setAbleSave(ableSave: boolean) { this.model.ableSave = ableSave; - this.model.ablePreview = ableSave; }, setParameters: (parameters: ParameterType[]) => { this.model.parameters = parameters; diff --git a/src/web/src/modules/app.program.ts b/src/web/src/modules/app.program.ts index 5437b4d..ab5428e 100644 --- a/src/web/src/modules/app.program.ts +++ b/src/web/src/modules/app.program.ts @@ -1,5 +1,5 @@ import { shortcut, store } from '@core/core'; -import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, TextValueComboXtype, CodeEditorXtype, ComponentsStyleTable, ButtonXtype, IconTextValue_Combo } from 'ui'; +import { VerticalXtype, HtapeXtype, LabelXtype, IconComboXtype, TextValueComboXtype, TextAreaEditorXtype, ComponentsStyleTable, ButtonXtype, IconTextValue_Combo } from 'ui'; import { TableList } from './table_list/table_list'; import '../less/index.less'; import { DatabaseIndex } from './components/database_index/database_index'; @@ -29,7 +29,7 @@ export class RedisProgram extends BI.Widget { value: { datasetData: { database: '', - orderValue: '0', + orderValue: 0, script: '', engineType: 0, parameters: [], @@ -41,14 +41,15 @@ export class RedisProgram extends BI.Widget { parameters: () => { this.parameterEditor.populate(this.renderItems(), [this.model.paramHeader]); }, - ablePreview: (ablePreview: boolean) => { - this.previewButton.setEnable(ablePreview); + ableSave: (ableSave: boolean) => { + this.previewButton.setEnable(ableSave); }, } render() { - const { database = '', orderValue = '0', script = '', parameters = [], engineType = 0 } = this.options.value.datasetData || {}; + const { database = '', orderValue = 0, script = '', parameters = [], engineType = 0 } = this.options.value.datasetData || {}; this.store.setParameters(parameters); + const inputType = typeof orderValue === 'string' ? 'formula' : 'int'; return { type: HtapeXtype, @@ -84,7 +85,7 @@ export class RedisProgram extends BI.Widget { type: IconComboXtype, height: 22, width: 28, - value: 'int', + value: inputType, items: [{ text: BI.i18nText('Plugin-Redis_Parameter_Type_Int'), value: 'int', @@ -110,6 +111,7 @@ export class RedisProgram extends BI.Widget { type: DatabaseIndex.xtype, rgap: 11, value: orderValue, + inputType, ref: (_ref: any) => { this.databaseIndex = _ref; }, @@ -152,9 +154,10 @@ export class RedisProgram extends BI.Widget { }, width: this.textWidth, }, { - type: CodeEditorXtype, + type: TextAreaEditorXtype, cls: 'bi-border', height: 200, + allowBlank: true, value: script, ref: (_ref: any) => { this.queryCondition = _ref; @@ -193,7 +196,7 @@ export class RedisProgram extends BI.Widget { el: { type: ButtonXtype, text: BI.i18nText('Plugin-Redis_Preview'), - disabled: !this.model.ablePreview, + disabled: !BI.get(this.model, 'ableSave'), handler: () => { this.openPreview(); }, diff --git a/src/web/src/modules/components/database_index/database_index.model.ts b/src/web/src/modules/components/database_index/database_index.model.ts index bf43dad..b315a7e 100644 --- a/src/web/src/modules/components/database_index/database_index.model.ts +++ b/src/web/src/modules/components/database_index/database_index.model.ts @@ -6,12 +6,12 @@ export class DatabaseIndexModel extends Model { state() { return { - inputValue: '', + inputValue: '' as string | number, }; } actions = { - setInpueValue: (value: string) => { + setInpueValue: (value: string | number) => { this.model.inputValue = value; }, } diff --git a/src/web/src/modules/components/database_index/database_index.ts b/src/web/src/modules/components/database_index/database_index.ts index 3538a97..face893 100644 --- a/src/web/src/modules/components/database_index/database_index.ts +++ b/src/web/src/modules/components/database_index/database_index.ts @@ -10,23 +10,24 @@ export class DatabaseIndex extends BI.Widget { databaseIndexTab: any; textEditor: any; - formulaPane: typeof BI.FormulaOpeartingPanel; + formulaPane: any; model: DatabaseIndexModel['model'] store: DatabaseIndexModel['store'] props = { value: '', + inputType: 'int', } render() { - const { value } = this.options; + const { value, inputType } = this.options; this.store.setInpueValue(value); return { type: TabXtype, single: true, - showIndex: 'int', + showIndex: inputType, ref: (_ref: any) => { this.databaseIndexTab = _ref; }, @@ -35,13 +36,13 @@ export class DatabaseIndex extends BI.Widget { return { type: TextEditorXtype, warningTitle: '', - value: this.model.inputValue, + value: parseInt(this.model.inputValue as string, 10) || 0, validationChecker: (v: string) => this.checkInteger(v), errorText: BI.i18nText('Plugin-Redis_Check_Integer'), listeners: [{ eventName: 'EVENT_CHANGE', action: () => { - this.store.setInpueValue(this.textEditor.getValue()); + this.store.setInpueValue(parseInt(this.textEditor.getValue(), 10)); }, }], ref: (_ref: any) => { @@ -54,7 +55,7 @@ export class DatabaseIndex extends BI.Widget { type: TextEditorXtype, allowBlank: true, value: this.model.inputValue, - ref: (_ref: typeof BI.FormulaOpeartingPanel) => { + ref: (_ref: any) => { this.formulaPane = _ref; }, }; @@ -69,8 +70,11 @@ export class DatabaseIndex extends BI.Widget { this.databaseIndexTab.setSelect(value); if (value === 'formula') { openFormulaPopover({ - formula: '', - }, BI.ComplexFormulaInserter.xtype); + formula: this.model.inputValue === 0 ? '' : this.model.inputValue as string, + }, BI.ComplexFormulaInserter.xtype).then(value => { + this.store.setInpueValue(value.formula); + this.formulaPane.setValue(value.formula); + }); } } diff --git a/src/web/src/modules/crud/crud.request.ts b/src/web/src/modules/crud/crud.request.ts index a59498a..cfa4471 100644 --- a/src/web/src/modules/crud/crud.request.ts +++ b/src/web/src/modules/crud/crud.request.ts @@ -4,7 +4,7 @@ export function getConnectionlist(): Promise<{data?: Connection[]}> { return requestGet('/v10/config/connection/list'); } -export function getTableList(database: string, pattern = ''): Promise<{data?: string[]}> { +export function getTableList(database: string, pattern = ''): Promise { return requestGet('plugin/private/com.fr.solution.plugin.db.redis.v10/redis/keys', { database, pattern, diff --git a/src/web/src/modules/crud/crud.service.ts b/src/web/src/modules/crud/crud.service.ts index 1958510..424bf35 100644 --- a/src/web/src/modules/crud/crud.service.ts +++ b/src/web/src/modules/crud/crud.service.ts @@ -50,7 +50,7 @@ function checkStatus(response: AxiosResponse) { return resData; } -export async function request(reqOptions: CrudReqOpts = {}): Promise { +export async function request(reqOptions: CrudReqOpts = {}): Promise { const { url, type, headers, data, params } = reqOptions; return axios @@ -128,8 +128,3 @@ interface CrudParams { [key: string]: string | number | { [key: string]: any }; } -interface ResultType { - data?: any; - errorCode?: string; - errorMsg?: string; -} diff --git a/src/web/src/modules/table_list/table_list.model.ts b/src/web/src/modules/table_list/table_list.model.ts index 87c6039..d69a462 100644 --- a/src/web/src/modules/table_list/table_list.model.ts +++ b/src/web/src/modules/table_list/table_list.model.ts @@ -22,7 +22,7 @@ export class TableModelModel extends Model { initTableList: () => { if (this.model.selectedConnection) { getTableList(this.model.selectedConnection, this.model.search).then(re => { - this.model.tables = re ? re.data : []; + this.model.tables = re ? re : []; }); } else { this.model.tables = []; diff --git a/src/web/src/modules/table_list/table_list.ts b/src/web/src/modules/table_list/table_list.ts index c0253f5..af4b383 100644 --- a/src/web/src/modules/table_list/table_list.ts +++ b/src/web/src/modules/table_list/table_list.ts @@ -30,6 +30,9 @@ export class TableList extends BI.Widget { 'selectedConnection || search': () => { this.store.initTableList(); }, + tables: (tables: string[]) => { + this.buttonGroup.populate(this.renderTableList()); + }, } render() { @@ -118,6 +121,15 @@ export class TableList extends BI.Widget { private renderConnectionList() { return this.model.connections.map(item => { + return { + text: item, + value: item, + }; + }); + } + + private renderTableList() { + return this.model.tables.map(item => { return { type: ListItem.xtype, text: item, From 4863086bb1444d866faae56ab0201d58046ddb30 Mon Sep 17 00:00:00 2001 From: alan Date: Fri, 8 Nov 2019 17:25:46 +0800 Subject: [PATCH 05/14] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=85=AC=E5=BC=8F=E6=97=B6=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/database_index/database_index.model.ts | 4 ++++ .../src/modules/components/database_index/database_index.ts | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/web/src/modules/components/database_index/database_index.model.ts b/src/web/src/modules/components/database_index/database_index.model.ts index b315a7e..8f49f47 100644 --- a/src/web/src/modules/components/database_index/database_index.model.ts +++ b/src/web/src/modules/components/database_index/database_index.model.ts @@ -7,6 +7,7 @@ export class DatabaseIndexModel extends Model { state() { return { inputValue: '' as string | number, + inputType: 'int', }; } @@ -14,5 +15,8 @@ export class DatabaseIndexModel extends Model { setInpueValue: (value: string | number) => { this.model.inputValue = value; }, + setInputType: (value: string) => { + this.model.inputType = value; + }, } } diff --git a/src/web/src/modules/components/database_index/database_index.ts b/src/web/src/modules/components/database_index/database_index.ts index face893..1bef951 100644 --- a/src/web/src/modules/components/database_index/database_index.ts +++ b/src/web/src/modules/components/database_index/database_index.ts @@ -23,11 +23,12 @@ export class DatabaseIndex extends BI.Widget { render() { const { value, inputType } = this.options; this.store.setInpueValue(value); + this.store.setInputType(inputType); return { type: TabXtype, single: true, - showIndex: inputType, + showIndex: this.model.inputType, ref: (_ref: any) => { this.databaseIndexTab = _ref; }, @@ -68,6 +69,7 @@ export class DatabaseIndex extends BI.Widget { public setSelect(value: string) { this.databaseIndexTab.setSelect(value); + this.store.setInputType(value); if (value === 'formula') { openFormulaPopover({ formula: this.model.inputValue === 0 ? '' : this.model.inputValue as string, @@ -79,6 +81,6 @@ export class DatabaseIndex extends BI.Widget { } public getValue() { - return this.model.inputValue; + return this.model.inputType === 'int' ? parseInt(`${this.model.inputValue}`, 10) : this.model.inputValue; } } From 7d828c2fd7826e97939c2a85b9c329637409262d Mon Sep 17 00:00:00 2001 From: alan Date: Tue, 12 Nov 2019 11:25:10 +0800 Subject: [PATCH 06/14] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=BF=9E=E6=8E=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/web/src/index.ts | 19 +++++++++---------- src/web/src/modules/app.edit.ts | 12 ++++++------ src/web/src/modules/app.show.ts | 10 +++++----- src/web/webpack/webpack.prod.js | 6 +++--- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/web/src/index.ts b/src/web/src/index.ts index 6c93924..b48315e 100644 --- a/src/web/src/index.ts +++ b/src/web/src/index.ts @@ -2,16 +2,17 @@ import { RedisShow } from './modules/app.show'; import { RedisEdit } from './modules/app.edit'; import { RedisDataset } from './modules/app.dataset'; import { RedisProgram } from './modules/app.program'; -const ConstantRedisType = 'dec.constant.database.conf.connect.types'; -const ConstantRedisShow = 'dec.constant.database.conf.connect.form.Redis.show'; -const ConstantRedisEdit = 'dec.constant.database.conf.connect.form.Redis.edit'; BI.DOM.ready(() => { - BI.config(ConstantRedisType, datas => [...datas, { - text: 'Redis', - databaseType: 'Redis', - iconUrl: 'com/fr/plugin/db/redis/images/redis.png', - }]); + BI.config('dec.connection.provider.datebase', provider => { + provider.registerDatabaseType({ + text: 'Redis', + databaseType: 'Redis', + iconUrl: 'com/fr/plugin/db/redis/images/redis.png', + edit: RedisEdit.xtype, + show: RedisShow.xtype, + }); + }); BI.config('dec.provider.data.set', provider => { provider.registerDataSetType({ @@ -28,6 +29,4 @@ BI.DOM.ready(() => { cardType: RedisProgram.xtype, }); }); - BI.constant(ConstantRedisShow, RedisShow.xtype); - BI.constant(ConstantRedisEdit, RedisEdit.xtype); }); diff --git a/src/web/src/modules/app.edit.ts b/src/web/src/modules/app.edit.ts index e5bf2a5..b8e93e5 100644 --- a/src/web/src/modules/app.edit.ts +++ b/src/web/src/modules/app.edit.ts @@ -8,7 +8,7 @@ import { ProxyEdit } from './components/proxy/proxy_edit'; export class RedisEdit extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.edit'; props = { - formData: { + value: { basicConfig : { ...BASIC_CONFIG, }, @@ -33,10 +33,10 @@ export class RedisEdit extends BI.Widget { oldPassword = ''; render() { - const formData = BI.get(this.options, 'formData'); - const basicConfig = BI.get(formData, 'basicConfig', BASIC_CONFIG); - const poolConfig = BI.get(formData, 'poolConfig', POOL_CONFIG); - const proxyConfig = BI.get(formData, 'proxyConfig', PROXY_CONFIG); + const value = BI.get(this.options, 'value'); + const basicConfig = BI.get(value, 'basicConfig', BASIC_CONFIG); + const poolConfig = BI.get(value, 'poolConfig', POOL_CONFIG); + const proxyConfig = BI.get(value, 'proxyConfig', PROXY_CONFIG); const { host, port, password, originalCharsetName } = basicConfig; this.poolConfigData = poolConfig; this.proxyConfigData = proxyConfig; @@ -166,7 +166,7 @@ export class RedisEdit extends BI.Widget { }; } - public getSubmitValue() { + public getValue() { const originalCharsetName = this.originalCharsetName.getValue()[0] || ''; return { diff --git a/src/web/src/modules/app.show.ts b/src/web/src/modules/app.show.ts index d7f0e4f..c3460fa 100644 --- a/src/web/src/modules/app.show.ts +++ b/src/web/src/modules/app.show.ts @@ -9,7 +9,7 @@ import { POOL_CONFIG, PROXY_CONFIG, BASIC_CONFIG } from '@constants/constant'; export class RedisShow extends BI.Widget { static xtype = 'dec.dcm.connection.plugin.redis.show' props = { - formData: { + value: { basicConfig : { ...BASIC_CONFIG, }, @@ -22,10 +22,10 @@ export class RedisShow extends BI.Widget { }, } render() { - const formData = BI.get(this.options, 'formData'); - const basicConfig = BI.get(formData, 'basicConfig', BASIC_CONFIG); - const poolConfig = BI.get(formData, 'poolConfig', POOL_CONFIG); - const proxyConfig = BI.get(formData, 'proxyConfig', PROXY_CONFIG); + const value = BI.get(this.options, 'value'); + const basicConfig = BI.get(value, 'basicConfig', BASIC_CONFIG); + const poolConfig = BI.get(value, 'poolConfig', POOL_CONFIG); + const proxyConfig = BI.get(value, 'proxyConfig', PROXY_CONFIG); const { host, port, newCharsetName } = basicConfig; return { diff --git a/src/web/webpack/webpack.prod.js b/src/web/webpack/webpack.prod.js index 974d813..2a80783 100644 --- a/src/web/webpack/webpack.prod.js +++ b/src/web/webpack/webpack.prod.js @@ -38,9 +38,9 @@ module.exports = merge.smart(common, { options: { plugins: [vars({ variables: { - fontUrl: '/webroot/decision/resources?path=/com/fr/web/ui/font', - imageUrl: '/webroot/decision/resources?path=/com/fr/web/resources/dist/images/1x', - image2xUrl: '/webroot/decision/resources?path=/com/fr/web/resources/dist/images/2x', + fontUrl: '${fineServletURL}/resources?path=/com/fr/web/ui/font', + imageUrl: '${fineServletURL}/resources?path=/com/fr/web/resources/dist/images/1x', + image2xUrl: '${fineServletURL}/resources?path=/com/fr/web/resources/dist/images/2x', } })] }, From 47ee543dcfe546cc147633e35679a98631532aad Mon Sep 17 00:00:00 2001 From: Elijah Date: Tue, 12 Nov 2019 11:32:31 +0800 Subject: [PATCH 07/14] =?UTF-8?q?KERNEL-1749=20redis=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/redis/RedisConnectionComponent.java | 6 + .../RedisScriptUniversalTableDataImpl.java | 13 +- .../db/redis/RedisUniversalTableDataImpl.java | 13 +- .../plugin/db/redis/bean/ParameterBean.java | 7 +- .../fr/plugin/db/redis/util/RedisUtils.java | 8 +- .../com/fr/plugin/db/redis/web/redis.css | 2030 +++++++++++++++++ .../com/fr/plugin/db/redis/web/redis.js | 16 +- 7 files changed, 2079 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/com/fr/plugin/db/redis/web/redis.css diff --git a/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java b/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java index fff856b..4452ec9 100644 --- a/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java +++ b/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java @@ -3,6 +3,7 @@ package com.fr.plugin.db.redis; import com.fr.web.struct.Component; import com.fr.web.struct.browser.RequestClient; import com.fr.web.struct.category.ScriptPath; +import com.fr.web.struct.category.StylePath; public class RedisConnectionComponent extends Component { public static final RedisConnectionComponent KEY = new RedisConnectionComponent(); @@ -10,4 +11,9 @@ public class RedisConnectionComponent extends Component { public ScriptPath script(RequestClient req) { return ScriptPath.build("com/fr/plugin/db/redis/web/redis.js"); } + + @Override + public StylePath style(RequestClient req) { + return StylePath.build("com/fr/plugin/db/redis/web/redis.css"); + } } \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/db/redis/RedisScriptUniversalTableDataImpl.java b/src/main/java/com/fr/plugin/db/redis/RedisScriptUniversalTableDataImpl.java index 9677a07..f9cd333 100644 --- a/src/main/java/com/fr/plugin/db/redis/RedisScriptUniversalTableDataImpl.java +++ b/src/main/java/com/fr/plugin/db/redis/RedisScriptUniversalTableDataImpl.java @@ -2,7 +2,6 @@ package com.fr.plugin.db.redis; import com.fanruan.api.cal.FormulaKit; import com.fanruan.api.data.ConnectionKit; -import com.fanruan.api.data.TableDataKit; import com.fanruan.api.util.StringKit; import com.fr.data.impl.Connection; import com.fr.decision.fun.impl.AbstractUniversalServerTableDataProvider; @@ -40,7 +39,11 @@ public class RedisScriptUniversalTableDataImpl extends AbstractUniversalServerTa JSONObject data = new JSONObject(); Connection database = redisScriptTableData.getDatabase(); data.put(RedisConstants.DATABASE, database instanceof NameReference ? ((NameReference) database).getName() : StringKit.EMPTY); - data.put(RedisConstants.ORDER, redisScriptTableData.getOrderValue().toString()); + if (redisScriptTableData.getOrderValue() instanceof FormulaOrderValue) { + data.put(RedisConstants.ORDER, redisScriptTableData.getOrderValue().toString()); + } else { + data.put(RedisConstants.ORDER, redisScriptTableData.getOrderValue().getValue()); + } data.put(RedisConstants.SCRIPT, redisScriptTableData.getScript()); data.put(RedisConstants.ENGINE, redisScriptTableData.getEngineType().getType()); data.put(RedisConstants.PARAMETERS, ParameterBean.createParameterBeans(redisScriptTableData.getParameters(Calculator.createCalculator()))); @@ -52,7 +55,7 @@ public class RedisScriptUniversalTableDataImpl extends AbstractUniversalServerTa RedisScriptTableData newTableData = new RedisScriptTableData(); String databaseName = data.getString(RedisConstants.DATABASE); String script = data.getString(RedisConstants.SCRIPT); - if (!StringKit.isEmpty(databaseName) && TableDataKit.findTableData(databaseName) != null) { + if (StringKit.isNotEmpty(databaseName) && ConnectionKit.getConnection(databaseName) != null) { newTableData.setDatabase(ConnectionKit.createNameConnection(databaseName)); } newTableData.setEngineType(EngineType.parse(data.getInt(RedisConstants.ENGINE))); @@ -63,9 +66,7 @@ public class RedisScriptUniversalTableDataImpl extends AbstractUniversalServerTa } else { newTableData.setOrderValue(new FormulaOrderValue(FormulaKit.newFormula(order))); } - - newTableData.setParameters(RedisUtils.analyzeParameter(oldTableData.getParameters(Calculator.createCalculator()), newTableData.getOrderValue(), script)); - + newTableData.setParameters(RedisUtils.analyzeParameter(data.getJSONArray(RedisConstants.PARAMETERS), newTableData.getOrderValue(), script)); return newTableData; } diff --git a/src/main/java/com/fr/plugin/db/redis/RedisUniversalTableDataImpl.java b/src/main/java/com/fr/plugin/db/redis/RedisUniversalTableDataImpl.java index b29e4e2..5a9bc50 100644 --- a/src/main/java/com/fr/plugin/db/redis/RedisUniversalTableDataImpl.java +++ b/src/main/java/com/fr/plugin/db/redis/RedisUniversalTableDataImpl.java @@ -2,7 +2,6 @@ package com.fr.plugin.db.redis; import com.fanruan.api.cal.FormulaKit; import com.fanruan.api.data.ConnectionKit; -import com.fanruan.api.data.TableDataKit; import com.fanruan.api.util.StringKit; import com.fr.data.impl.Connection; import com.fr.decision.fun.impl.AbstractUniversalServerTableDataProvider; @@ -39,7 +38,11 @@ public class RedisUniversalTableDataImpl extends AbstractUniversalServerTableDat JSONObject data = new JSONObject(); Connection database = redisTableData.getDatabase(); data.put(RedisConstants.DATABASE, database instanceof NameReference ? ((NameReference) database).getName() : StringKit.EMPTY); - data.put(RedisConstants.ORDER, redisTableData.getOrderValue().toString()); + if (redisTableData.getOrderValue() instanceof FormulaOrderValue) { + data.put(RedisConstants.ORDER, redisTableData.getOrderValue().toString()); + } else { + data.put(RedisConstants.ORDER, redisTableData.getOrderValue().getValue()); + } data.put(RedisConstants.SCRIPT, redisTableData.getScript()); data.put(RedisConstants.QUERY, redisTableData.getQuery()); data.put(RedisConstants.PARAMETERS, ParameterBean.createParameterBeans(redisTableData.getParameters(Calculator.createCalculator()))); @@ -48,11 +51,11 @@ public class RedisUniversalTableDataImpl extends AbstractUniversalServerTableDat @Override public RedisTableData deserialize(RedisTableData oldTableData, JSONObject data) { - RedisTableData newTableData = oldTableData; + RedisTableData newTableData = new RedisTableData(); String databaseName = data.getString(RedisConstants.DATABASE); String script = data.getString(RedisConstants.SCRIPT); String query = data.getString(RedisConstants.QUERY); - if (!StringKit.isEmpty(databaseName) && TableDataKit.findTableData(databaseName) != null) { + if (StringKit.isNotEmpty(databaseName) && ConnectionKit.getConnection(databaseName) != null) { newTableData.setDatabase(ConnectionKit.createNameConnection(databaseName)); } newTableData.setScript(script); @@ -64,7 +67,7 @@ public class RedisUniversalTableDataImpl extends AbstractUniversalServerTableDat } else { newTableData.setOrderValue(new FormulaOrderValue(FormulaKit.newFormula(order))); } - newTableData.setParameters(RedisUtils.analyzeParameter(oldTableData.getParameters(Calculator.createCalculator()), newTableData.getOrderValue(), script, query)); + newTableData.setParameters(RedisUtils.analyzeParameter(data.getJSONArray(RedisConstants.PARAMETERS), newTableData.getOrderValue(), script, query)); return newTableData; } diff --git a/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java b/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java index 0417609..adabb39 100644 --- a/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java +++ b/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java @@ -1,5 +1,6 @@ package com.fr.plugin.db.redis.bean; +import com.fanruan.api.util.StringKit; import com.fr.base.ParameterTypeHandler; import com.fr.stable.ParameterProvider; @@ -59,7 +60,11 @@ public class ParameterBean{ } public static ParameterBean createBean(ParameterProvider parameterProvider) { - return new ParameterBean(parameterProvider.getClass().getSimpleName(),parameterProvider.getName(), parameterProvider.valueToString()); + if (parameterProvider.getValue() != null) { + return new ParameterBean(parameterProvider.getValue().getClass().getSimpleName(), parameterProvider.getName(), parameterProvider.valueToString()); + } else { + return new ParameterBean(String.class.getSimpleName(), parameterProvider.getName(), StringKit.EMPTY); + } } public static List createParameterBeans(ParameterProvider[] parameterProviders) { diff --git a/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java b/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java index 2735e48..8a52b93 100644 --- a/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java +++ b/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java @@ -6,6 +6,8 @@ import com.fanruan.api.util.ArrayKit; import com.fanruan.api.util.GeneralKit; import com.fanruan.api.util.RenderKit; import com.fanruan.api.util.StringKit; +import com.fr.base.Parameter; +import com.fr.json.JSONArray; import com.fr.plugin.db.redis.core.order.OrderValue; import com.fr.plugin.db.redis.help.ScriptBridge; import com.fr.stable.ParameterProvider; @@ -72,7 +74,11 @@ public class RedisUtils { } } - public static ParameterProvider[] analyzeParameter(ParameterProvider[] oldParameters, OrderValue orderValue, String ...parameterTexts) { + public static ParameterProvider[] analyzeParameter(JSONArray existParameters, OrderValue orderValue, String ...parameterTexts) { + Parameter[] oldParameters = new Parameter[existParameters.size()]; + for (int i = 0; i < existParameters.size(); i++) { + oldParameters[i] = Parameter.getParameterFromJson(existParameters.getJSONObject(i)); + } ParameterProvider[] newParameters = ParameterKit.analyzeAndUnionSameParameters(parameterTexts, oldParameters); ParameterProvider[] newOrderParameters = orderValue.analyze4Parameters(); Map parameterProviderMap = new HashMap(); diff --git a/src/main/resources/com/fr/plugin/db/redis/web/redis.css b/src/main/resources/com/fr/plugin/db/redis/web/redis.css new file mode 100644 index 0000000..afe79bc --- /dev/null +++ b/src/main/resources/com/fr/plugin/db/redis/web/redis.css @@ -0,0 +1,2030 @@ +/*! time: 2019-11-12 11:24:08 */ +@font-face { + font-family: "fineui"; + src: url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.eot'); + src: url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.eot?#iefix') format('embedded-opentype'), url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.woff') format('woff'), url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.ttf') format('truetype'), url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.svg#svgFontName') format('svg'); + /* iOS 4.1- */ +} +.b-font { + font-family: 'fineui'; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.close-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.close-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.close-h-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-h-font:hover .b-font:before, +.close-h-font.hover .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-h-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.close-ha-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-ha-font:hover .b-font:before, +.close-ha-font.hover .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-ha-font:active .b-font:before, +.close-ha-font.active .b-font:before { + content: "\e6d0"; + color: #3f8ce8; +} +.close-ha-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.circle-close-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.circle-close-font .b-font:before { + content: "\e6d5"; + color: inherit; +} +.circle-close-font.disabled .b-font:before { + content: "\e6d5"; + color: inherit; +} +.search-close-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.search-close-h-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.search-close-h-font:hover .b-font:before, +.search-close-h-font.hover .b-font:before { + content: "\e6d0"; + color: #e65251; +} +.search-close-h-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.pre-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pre-page-h-font .b-font:before { + content: "\e70d"; + color: inherit; +} +.pre-page-h-font:hover .b-font:before, +.pre-page-h-font.hover .b-font:before { + content: "\e70d"; + color: inherit; +} +.pre-page-h-font.disabled .b-font:before { + content: "\e70d"; + color: inherit; +} +.next-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.next-page-h-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.next-page-h-font:hover .b-font:before, +.next-page-h-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.next-page-h-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.search-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.search-font .b-font:before { + content: "\e6dc"; + color: inherit; +} +.search-font.disabled .b-font:before { + content: "\e6dc"; + color: inherit; +} +.date-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.date-font .b-font:before { + content: "\e733"; + color: inherit; +} +.date-font.disabled .b-font:before { + content: "\e733"; + color: inherit; +} +.time-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.time-font .b-font:before { + content: "\e6b1"; + color: inherit; +} +.time-font.disabled .b-font:before { + content: "\e6b1"; + color: inherit; +} +.date-change-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.date-change-h-font .b-font:before { + content: "\e72f"; + color: inherit; +} +.date-change-h-font:hover .b-font:before, +.date-change-h-font.hover .b-font:before { + content: "\e72f"; + color: inherit; +} +.date-change-h-font.disabled .b-font:before { + content: "\e72f"; + color: inherit; +} +.dot-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-font .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-font.disabled .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-h-font .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-h-font:hover .b-font:before, +.dot-h-font.hover .b-font:before { + content: "\e762"; + color: inherit; +} +.dot-h-font.disabled .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-ha-font .b-font:before { + content: "\e762"; + color: #ffffff; +} +.dot-ha-font:hover .b-font:before, +.dot-ha-font.hover .b-font:before { + content: "\e762"; + color: #999999; +} +.dot-ha-font:active .b-font:before, +.dot-ha-font.active .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-ha-font.disabled .b-font:before { + content: "\e762"; + color: #ffffff; +} +.dot-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-e-font .b-font:before { + content: "\e762"; + color: transparent; +} +.dot-e-font:hover .b-font:before, +.dot-e-font.hover .b-font:before { + content: "\e762"; + color: transparent; +} +.dot-e-font:active .b-font:before { + content: "\e762"; + color: transparent; +} +.dot-e-font.active .b-font:before { + content: "\e762"; + color: #3685f2; +} +.dot-e-font.disabled .b-font:before { + content: "\e762"; + color: transparent; +} +.pull-right-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-h-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-h-font:hover .b-font:before, +.pull-right-h-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-h-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-ha-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-ha-font:hover .b-font:before, +.pull-right-ha-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-ha-font:active .b-font:before, +.pull-right-ha-font.active .b-font:before { + content: "\e70c"; + color: #3f8ce8; +} +.pull-right-ha-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-e-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-e-font:hover .b-font:before, +.pull-right-e-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-e-font:active .b-font:before { + content: "\e70c"; + color: #3f8ce8; +} +.pull-right-e-font.active .b-font:before { + content: "\e70c"; + color: #3f8ce8; +} +.pull-right-e-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.copy-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-font .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-font.disabled .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-h-font .b-font:before { + content: "\e6bd"; + color: #232e40; +} +.copy-h-font:hover .b-font:before, +.copy-h-font.hover .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-h-font.disabled .b-font:before { + content: "\e6bd"; + color: #232e40; +} +.copy-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-ha-font .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-ha-font:hover .b-font:before, +.copy-ha-font.hover .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-ha-font:active .b-font:before, +.copy-ha-font.active .b-font:before { + content: "\e6bd"; + color: #3f8ce8; +} +.copy-ha-font.disabled .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-e-font .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-e-font:hover .b-font:before, +.copy-e-font.hover .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-e-font:active .b-font:before { + content: "\e6bd"; + color: #3f8ce8; +} +.copy-e-font.active .b-font:before { + content: "\e6bd"; + color: #3f8ce8; +} +.copy-e-font.disabled .b-font:before { + content: "\e6bd"; + color: inherit; +} +.check-mark-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-h-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-h-font:hover .b-font:before, +.check-mark-h-font.hover .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-h-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-ha-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-ha-font:hover .b-font:before, +.check-mark-ha-font.hover .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-ha-font:active .b-font:before, +.check-mark-ha-font.active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.check-mark-ha-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-e-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-e-font:hover .b-font:before, +.check-mark-e-font.hover .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-e-font:active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.check-mark-e-font.active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.check-mark-e-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +/** dashboard组件/控件 下拉列表图标字体 ~end~**/ +.row-pre-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.row-pre-page-h-font .b-font:before { + content: "\e70d"; + color: inherit; +} +.row-pre-page-h-font:hover .b-font:before, +.row-pre-page-h-font.hover .b-font:before { + content: "\e70d"; + color: inherit; +} +.row-pre-page-h-font.disabled .b-font:before { + content: "\e70d"; + color: inherit; +} +.row-next-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.row-next-page-h-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.row-next-page-h-font:hover .b-font:before, +.row-next-page-h-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.row-next-page-h-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.column-pre-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.column-pre-page-h-font .b-font:before { + content: "\e70a"; + color: inherit; +} +.column-pre-page-h-font:hover .b-font:before, +.column-pre-page-h-font.hover .b-font:before { + content: "\e70a"; + color: inherit; +} +.column-pre-page-h-font.disabled .b-font:before { + content: "\e70a"; + color: inherit; +} +.column-next-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.column-next-page-h-font .b-font:before { + content: "\e70b"; + color: inherit; +} +.column-next-page-h-font:hover .b-font:before, +.column-next-page-h-font.hover .b-font:before { + content: "\e70b"; + color: inherit; +} +.column-next-page-h-font.disabled .b-font:before { + content: "\e70b"; + color: inherit; +} +.expander-right-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.expander-right-font .b-font:before { + content: "\e6d8"; + color: inherit; +} +.expander-right-font.disabled .b-font:before { + content: "\e6d8"; + color: inherit; +} +.expander-down-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.expander-down-font .b-font:before { + content: "\e6d7"; + color: inherit; +} +.expander-down-font.disabled .b-font:before { + content: "\e6d7"; + color: inherit; +} +.solid-triangle-top-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.solid-triangle-top-font .b-font:before { + content: "\e6d6"; + color: inherit; +} +.solid-triangle-top-font:hover .b-font:before, +.solid-triangle-top-font.hover .b-font:before { + content: "\e6d6"; + color: inherit; +} +.solid-triangle-top-font.disabled .b-font:before { + content: "\e6d6"; + color: inherit; +} +.solid-triangle-bottom-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.solid-triangle-bottom-font .b-font:before { + content: "\e6d7"; + color: inherit; +} +.solid-triangle-bottom-font:hover .b-font:before, +.solid-triangle-bottom-font.hover .b-font:before { + content: "\e6d7"; + color: inherit; +} +.solid-triangle-bottom-font.disabled .b-font:before { + content: "\e6d7"; + color: inherit; +} +.trigger-triangle-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.trigger-triangle-font .b-font:before { + content: "\e64e"; + color: inherit; +} +.trigger-triangle-font.disabled .b-font:before { + content: "\e64e"; + color: inherit; +} +.pull-up-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-up-font .b-font:before { + content: "\e70a"; + color: inherit; +} +.pull-up-font.disabled .b-font:before { + content: "\e70a"; + color: inherit; +} +.pull-down-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-down-font .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-font.disabled .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-down-h-font .b-font:before { + content: "\e70b"; + color: #647185; +} +.pull-down-h-font:hover .b-font:before, +.pull-down-h-font.hover .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-h-font.disabled .b-font:before { + content: "\e70b"; + color: #647185; +} +.pull-down-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-down-ha-font .b-font:before { + content: "\e70b"; + color: #647185; +} +.pull-down-ha-font:hover .b-font:before, +.pull-down-ha-font.hover .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-ha-font:active .b-font:before, +.pull-down-ha-font.active .b-font:before { + content: "\e70b"; + color: #3f8ce8; +} +.pull-down-ha-font.disabled .b-font:before { + content: "\e70b"; + color: #647185; +} +.check-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-font .b-font:before { + content: "\e6cf"; + color: #3685f2; +} +.check-font.disabled .b-font:before { + content: "\e6cf"; + color: #3685f2; +} +.item-check-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.item-check-font .b-font:before { + content: "\e6cf"; + color: #ffffff; +} +.item-check-font:hover .b-font:before, +.item-check-font.hover .b-font:before { + content: "\e6cf"; + color: #999999; +} +.item-check-font:active .b-font:before, +.item-check-font.active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.item-check-font.disabled .b-font:before { + content: "\e6cf"; + color: #ffffff; +} +.primary-key-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.primary-key-font .b-font:before { + content: "\e740"; + color: inherit; +} +.primary-key-font:hover .b-font:before, +.primary-key-font.hover .b-font:before { + content: "\e740"; + color: inherit; +} +.primary-key-font.disabled .b-font:before { + content: "\e740"; + color: inherit; +} +.drag-tag-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.drag-tag-font .b-font:before { + content: "\e6d0"; + color: #faaa39; +} +.drag-tag-font.disabled .b-font:before { + content: "\e6d0"; + color: #faaa39; +} +.less-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.less-font .b-font:before { + content: "\e75e"; + color: inherit; +} +.less-font.disabled .b-font:before { + content: "\e75e"; + color: inherit; +} +.less-equal-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.less-equal-font .b-font:before { + content: "\e761"; + color: inherit; +} +.less-equal-font.disabled .b-font:before { + content: "\e761"; + color: inherit; +} +.text-bold-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-bold-font .b-font:before { + content: "\e697"; + color: inherit; +} +.text-bold-font.disabled .b-font:before { + content: "\e697"; + color: inherit; +} +.text-italic-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-italic-font .b-font:before { + content: "\e69d"; + color: inherit; +} +.text-italic-font.disabled .b-font:before { + content: "\e69d"; + color: inherit; +} +.text-underline-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-underline-font .b-font:before { + content: "\e69c"; + color: inherit; +} +.text-underline-font.disabled .b-font:before { + content: "\e69c"; + color: inherit; +} +.text-color-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-color-font .b-font:before { + content: "\e698"; + color: inherit; +} +.text-color-font.disabled .b-font:before { + content: "\e698"; + color: inherit; +} +.text-background-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-background-font .b-font:before { + content: "\e699"; + color: inherit; +} +.text-background-font.disabled .b-font:before { + content: "\e699"; + color: inherit; +} +.text-color-underline-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-color-underline-font .b-font:before { + content: "\e69a"; + color: inherit; +} +.text-color-underline-font.disabled .b-font:before { + content: "\e69a"; + color: inherit; +} +.text-align-left-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-align-left-font .b-font:before { + content: "\e6ca"; + color: inherit; +} +.text-align-left-font.disabled .b-font:before { + content: "\e6ca"; + color: inherit; +} +.text-align-center-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-align-center-font .b-font:before { + content: "\e6bf"; + color: inherit; +} +.text-align-center-font.disabled .b-font:before { + content: "\e6bf"; + color: inherit; +} +.text-align-right-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-align-right-font .b-font:before { + content: "\e6c8"; + color: inherit; +} +.text-align-right-font.disabled .b-font:before { + content: "\e6c8"; + color: inherit; +} +.toast-error-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-error-font .b-font:before { + content: "\e757"; + color: inherit; +} +.toast-error-font.disabled .b-font:before { + content: "\e757"; + color: inherit; +} +.toast-success-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-success-font .b-font:before { + content: "\e756"; + color: inherit; +} +.toast-success-font.disabled .b-font:before { + content: "\e756"; + color: inherit; +} +.toast-warning-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-warning-font .b-font:before { + content: "\e755"; + color: inherit; +} +.toast-warning-font.disabled .b-font:before { + content: "\e755"; + color: inherit; +} +.toast-message-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-message-font .b-font:before { + content: "\e74b"; + color: inherit; +} +.toast-message-font.disabled .b-font:before { + content: "\e74b"; + color: inherit; +} +.text-add-tip-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-add-tip-font .b-font:before { + content: "\e6dd"; + color: #13cd66; +} +.text-add-tip-font.disabled .b-font:before { + content: "\e6dd"; + color: #13cd66; +} +.add-up-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.add-up-font .b-font:before { + content: "\e70a"; + color: inherit; +} +.add-up-font.disabled .b-font:before { + content: "\e70a"; + color: inherit; +} +.minus-down-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.minus-down-font .b-font:before { + content: "\e70b"; + color: inherit; +} +.minus-down-font.disabled .b-font:before { + content: "\e70b"; + color: inherit; +} +.redis-refresh-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-refresh-font .b-font:before { + content: "\e6ef"; + color: inherit; +} +.redis-refresh-font.disabled .b-font:before { + content: "\e6ef"; + color: inherit; +} +.input-string-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-string-font .b-font:before { + content: "\e6e9"; + color: inherit; +} +.input-string-font.disabled .b-font:before { + content: "\e6e9"; + color: inherit; +} +.input-formula-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-formula-font .b-font:before { + content: "\e6c6"; + color: inherit; +} +.input-formula-font.disabled .b-font:before { + content: "\e6c6"; + color: inherit; +} +.input-date-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-date-font .b-font:before { + content: "\e733"; + color: inherit; +} +.input-date-font.disabled .b-font:before { + content: "\e733"; + color: inherit; +} +.input-boolean-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-boolean-font .b-font:before { + content: "\e656"; + color: inherit; +} +.input-boolean-font.disabled .b-font:before { + content: "\e656"; + color: inherit; +} +.input-int-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-int-font .b-font:before { + content: "\e7c2"; + color: inherit; +} +.input-int-font.disabled .b-font:before { + content: "\e7c2"; + color: inherit; +} +.input-number-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-number-font .b-font:before { + content: "\e60b"; + color: inherit; +} +.input-number-font.disabled .b-font:before { + content: "\e60b"; + color: inherit; +} +.redis-site-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-site-font .b-font:before { + content: "\e7c5"; + color: inherit; +} +.redis-site-font.disabled .b-font:before { + content: "\e7c5"; + color: inherit; +} +.redis-column-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-column-font .b-font:before { + content: "\e76f"; + color: inherit; +} +.redis-column-font.disabled .b-font:before { + content: "\e76f"; + color: inherit; +} +.redis-preview-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-preview-font .b-font:before { + content: "\e6f2"; + color: inherit; +} +.redis-preview-font.disabled .b-font:before { + content: "\e6f2"; + color: inherit; +} + +@font-face { + font-family: "fineui"; + src: url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.eot'); + src: url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.eot?#iefix') format('embedded-opentype'), url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.woff') format('woff'), url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.ttf') format('truetype'), url('${fineServletURL}/resources?path=/com/fr/web/ui/font/iconfont.svg#svgFontName') format('svg'); + /* iOS 4.1- */ +} +.b-font { + font-family: 'fineui'; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.close-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.close-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.close-h-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-h-font:hover .b-font:before, +.close-h-font.hover .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-h-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.close-ha-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-ha-font:hover .b-font:before, +.close-ha-font.hover .b-font:before { + content: "\e6d0"; + color: inherit; +} +.close-ha-font:active .b-font:before, +.close-ha-font.active .b-font:before { + content: "\e6d0"; + color: #3f8ce8; +} +.close-ha-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.circle-close-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.circle-close-font .b-font:before { + content: "\e6d5"; + color: inherit; +} +.circle-close-font.disabled .b-font:before { + content: "\e6d5"; + color: inherit; +} +.search-close-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.search-close-h-font .b-font:before { + content: "\e6d0"; + color: inherit; +} +.search-close-h-font:hover .b-font:before, +.search-close-h-font.hover .b-font:before { + content: "\e6d0"; + color: #e65251; +} +.search-close-h-font.disabled .b-font:before { + content: "\e6d0"; + color: inherit; +} +.pre-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pre-page-h-font .b-font:before { + content: "\e70d"; + color: inherit; +} +.pre-page-h-font:hover .b-font:before, +.pre-page-h-font.hover .b-font:before { + content: "\e70d"; + color: inherit; +} +.pre-page-h-font.disabled .b-font:before { + content: "\e70d"; + color: inherit; +} +.next-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.next-page-h-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.next-page-h-font:hover .b-font:before, +.next-page-h-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.next-page-h-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.search-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.search-font .b-font:before { + content: "\e6dc"; + color: inherit; +} +.search-font.disabled .b-font:before { + content: "\e6dc"; + color: inherit; +} +.date-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.date-font .b-font:before { + content: "\e733"; + color: inherit; +} +.date-font.disabled .b-font:before { + content: "\e733"; + color: inherit; +} +.time-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.time-font .b-font:before { + content: "\e6b1"; + color: inherit; +} +.time-font.disabled .b-font:before { + content: "\e6b1"; + color: inherit; +} +.date-change-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.date-change-h-font .b-font:before { + content: "\e72f"; + color: inherit; +} +.date-change-h-font:hover .b-font:before, +.date-change-h-font.hover .b-font:before { + content: "\e72f"; + color: inherit; +} +.date-change-h-font.disabled .b-font:before { + content: "\e72f"; + color: inherit; +} +.dot-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-font .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-font.disabled .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-h-font .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-h-font:hover .b-font:before, +.dot-h-font.hover .b-font:before { + content: "\e762"; + color: inherit; +} +.dot-h-font.disabled .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-ha-font .b-font:before { + content: "\e762"; + color: #ffffff; +} +.dot-ha-font:hover .b-font:before, +.dot-ha-font.hover .b-font:before { + content: "\e762"; + color: #999999; +} +.dot-ha-font:active .b-font:before, +.dot-ha-font.active .b-font:before { + content: "\e762"; + color: #232e40; +} +.dot-ha-font.disabled .b-font:before { + content: "\e762"; + color: #ffffff; +} +.dot-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.dot-e-font .b-font:before { + content: "\e762"; + color: transparent; +} +.dot-e-font:hover .b-font:before, +.dot-e-font.hover .b-font:before { + content: "\e762"; + color: transparent; +} +.dot-e-font:active .b-font:before { + content: "\e762"; + color: transparent; +} +.dot-e-font.active .b-font:before { + content: "\e762"; + color: #3685f2; +} +.dot-e-font.disabled .b-font:before { + content: "\e762"; + color: transparent; +} +.pull-right-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-h-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-h-font:hover .b-font:before, +.pull-right-h-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-h-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-ha-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-ha-font:hover .b-font:before, +.pull-right-ha-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-ha-font:active .b-font:before, +.pull-right-ha-font.active .b-font:before { + content: "\e70c"; + color: #3f8ce8; +} +.pull-right-ha-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-right-e-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-e-font:hover .b-font:before, +.pull-right-e-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.pull-right-e-font:active .b-font:before { + content: "\e70c"; + color: #3f8ce8; +} +.pull-right-e-font.active .b-font:before { + content: "\e70c"; + color: #3f8ce8; +} +.pull-right-e-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.copy-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-font .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-font.disabled .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-h-font .b-font:before { + content: "\e6bd"; + color: #232e40; +} +.copy-h-font:hover .b-font:before, +.copy-h-font.hover .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-h-font.disabled .b-font:before { + content: "\e6bd"; + color: #232e40; +} +.copy-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-ha-font .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-ha-font:hover .b-font:before, +.copy-ha-font.hover .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-ha-font:active .b-font:before, +.copy-ha-font.active .b-font:before { + content: "\e6bd"; + color: #3f8ce8; +} +.copy-ha-font.disabled .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.copy-e-font .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-e-font:hover .b-font:before, +.copy-e-font.hover .b-font:before { + content: "\e6bd"; + color: inherit; +} +.copy-e-font:active .b-font:before { + content: "\e6bd"; + color: #3f8ce8; +} +.copy-e-font.active .b-font:before { + content: "\e6bd"; + color: #3f8ce8; +} +.copy-e-font.disabled .b-font:before { + content: "\e6bd"; + color: inherit; +} +.check-mark-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-h-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-h-font:hover .b-font:before, +.check-mark-h-font.hover .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-h-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-ha-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-ha-font:hover .b-font:before, +.check-mark-ha-font.hover .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-ha-font:active .b-font:before, +.check-mark-ha-font.active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.check-mark-ha-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-e-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-mark-e-font .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-e-font:hover .b-font:before, +.check-mark-e-font.hover .b-font:before { + content: "\e6cf"; + color: inherit; +} +.check-mark-e-font:active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.check-mark-e-font.active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.check-mark-e-font.disabled .b-font:before { + content: "\e6cf"; + color: inherit; +} +/** dashboard组件/控件 下拉列表图标字体 ~end~**/ +.row-pre-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.row-pre-page-h-font .b-font:before { + content: "\e70d"; + color: inherit; +} +.row-pre-page-h-font:hover .b-font:before, +.row-pre-page-h-font.hover .b-font:before { + content: "\e70d"; + color: inherit; +} +.row-pre-page-h-font.disabled .b-font:before { + content: "\e70d"; + color: inherit; +} +.row-next-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.row-next-page-h-font .b-font:before { + content: "\e70c"; + color: inherit; +} +.row-next-page-h-font:hover .b-font:before, +.row-next-page-h-font.hover .b-font:before { + content: "\e70c"; + color: inherit; +} +.row-next-page-h-font.disabled .b-font:before { + content: "\e70c"; + color: inherit; +} +.column-pre-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.column-pre-page-h-font .b-font:before { + content: "\e70a"; + color: inherit; +} +.column-pre-page-h-font:hover .b-font:before, +.column-pre-page-h-font.hover .b-font:before { + content: "\e70a"; + color: inherit; +} +.column-pre-page-h-font.disabled .b-font:before { + content: "\e70a"; + color: inherit; +} +.column-next-page-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.column-next-page-h-font .b-font:before { + content: "\e70b"; + color: inherit; +} +.column-next-page-h-font:hover .b-font:before, +.column-next-page-h-font.hover .b-font:before { + content: "\e70b"; + color: inherit; +} +.column-next-page-h-font.disabled .b-font:before { + content: "\e70b"; + color: inherit; +} +.expander-right-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.expander-right-font .b-font:before { + content: "\e6d8"; + color: inherit; +} +.expander-right-font.disabled .b-font:before { + content: "\e6d8"; + color: inherit; +} +.expander-down-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.expander-down-font .b-font:before { + content: "\e6d7"; + color: inherit; +} +.expander-down-font.disabled .b-font:before { + content: "\e6d7"; + color: inherit; +} +.solid-triangle-top-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.solid-triangle-top-font .b-font:before { + content: "\e6d6"; + color: inherit; +} +.solid-triangle-top-font:hover .b-font:before, +.solid-triangle-top-font.hover .b-font:before { + content: "\e6d6"; + color: inherit; +} +.solid-triangle-top-font.disabled .b-font:before { + content: "\e6d6"; + color: inherit; +} +.solid-triangle-bottom-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.solid-triangle-bottom-font .b-font:before { + content: "\e6d7"; + color: inherit; +} +.solid-triangle-bottom-font:hover .b-font:before, +.solid-triangle-bottom-font.hover .b-font:before { + content: "\e6d7"; + color: inherit; +} +.solid-triangle-bottom-font.disabled .b-font:before { + content: "\e6d7"; + color: inherit; +} +.trigger-triangle-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.trigger-triangle-font .b-font:before { + content: "\e64e"; + color: inherit; +} +.trigger-triangle-font.disabled .b-font:before { + content: "\e64e"; + color: inherit; +} +.pull-up-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-up-font .b-font:before { + content: "\e70a"; + color: inherit; +} +.pull-up-font.disabled .b-font:before { + content: "\e70a"; + color: inherit; +} +.pull-down-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-down-font .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-font.disabled .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-h-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-down-h-font .b-font:before { + content: "\e70b"; + color: #647185; +} +.pull-down-h-font:hover .b-font:before, +.pull-down-h-font.hover .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-h-font.disabled .b-font:before { + content: "\e70b"; + color: #647185; +} +.pull-down-ha-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.pull-down-ha-font .b-font:before { + content: "\e70b"; + color: #647185; +} +.pull-down-ha-font:hover .b-font:before, +.pull-down-ha-font.hover .b-font:before { + content: "\e70b"; + color: inherit; +} +.pull-down-ha-font:active .b-font:before, +.pull-down-ha-font.active .b-font:before { + content: "\e70b"; + color: #3f8ce8; +} +.pull-down-ha-font.disabled .b-font:before { + content: "\e70b"; + color: #647185; +} +.check-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.check-font .b-font:before { + content: "\e6cf"; + color: #3685f2; +} +.check-font.disabled .b-font:before { + content: "\e6cf"; + color: #3685f2; +} +.item-check-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.item-check-font .b-font:before { + content: "\e6cf"; + color: #ffffff; +} +.item-check-font:hover .b-font:before, +.item-check-font.hover .b-font:before { + content: "\e6cf"; + color: #999999; +} +.item-check-font:active .b-font:before, +.item-check-font.active .b-font:before { + content: "\e6cf"; + color: #3f8ce8; +} +.item-check-font.disabled .b-font:before { + content: "\e6cf"; + color: #ffffff; +} +.primary-key-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.primary-key-font .b-font:before { + content: "\e740"; + color: inherit; +} +.primary-key-font:hover .b-font:before, +.primary-key-font.hover .b-font:before { + content: "\e740"; + color: inherit; +} +.primary-key-font.disabled .b-font:before { + content: "\e740"; + color: inherit; +} +.drag-tag-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.drag-tag-font .b-font:before { + content: "\e6d0"; + color: #faaa39; +} +.drag-tag-font.disabled .b-font:before { + content: "\e6d0"; + color: #faaa39; +} +.less-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.less-font .b-font:before { + content: "\e75e"; + color: inherit; +} +.less-font.disabled .b-font:before { + content: "\e75e"; + color: inherit; +} +.less-equal-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.less-equal-font .b-font:before { + content: "\e761"; + color: inherit; +} +.less-equal-font.disabled .b-font:before { + content: "\e761"; + color: inherit; +} +.text-bold-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-bold-font .b-font:before { + content: "\e697"; + color: inherit; +} +.text-bold-font.disabled .b-font:before { + content: "\e697"; + color: inherit; +} +.text-italic-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-italic-font .b-font:before { + content: "\e69d"; + color: inherit; +} +.text-italic-font.disabled .b-font:before { + content: "\e69d"; + color: inherit; +} +.text-underline-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-underline-font .b-font:before { + content: "\e69c"; + color: inherit; +} +.text-underline-font.disabled .b-font:before { + content: "\e69c"; + color: inherit; +} +.text-color-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-color-font .b-font:before { + content: "\e698"; + color: inherit; +} +.text-color-font.disabled .b-font:before { + content: "\e698"; + color: inherit; +} +.text-background-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-background-font .b-font:before { + content: "\e699"; + color: inherit; +} +.text-background-font.disabled .b-font:before { + content: "\e699"; + color: inherit; +} +.text-color-underline-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-color-underline-font .b-font:before { + content: "\e69a"; + color: inherit; +} +.text-color-underline-font.disabled .b-font:before { + content: "\e69a"; + color: inherit; +} +.text-align-left-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-align-left-font .b-font:before { + content: "\e6ca"; + color: inherit; +} +.text-align-left-font.disabled .b-font:before { + content: "\e6ca"; + color: inherit; +} +.text-align-center-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-align-center-font .b-font:before { + content: "\e6bf"; + color: inherit; +} +.text-align-center-font.disabled .b-font:before { + content: "\e6bf"; + color: inherit; +} +.text-align-right-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-align-right-font .b-font:before { + content: "\e6c8"; + color: inherit; +} +.text-align-right-font.disabled .b-font:before { + content: "\e6c8"; + color: inherit; +} +.toast-error-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-error-font .b-font:before { + content: "\e757"; + color: inherit; +} +.toast-error-font.disabled .b-font:before { + content: "\e757"; + color: inherit; +} +.toast-success-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-success-font .b-font:before { + content: "\e756"; + color: inherit; +} +.toast-success-font.disabled .b-font:before { + content: "\e756"; + color: inherit; +} +.toast-warning-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-warning-font .b-font:before { + content: "\e755"; + color: inherit; +} +.toast-warning-font.disabled .b-font:before { + content: "\e755"; + color: inherit; +} +.toast-message-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.toast-message-font .b-font:before { + content: "\e74b"; + color: inherit; +} +.toast-message-font.disabled .b-font:before { + content: "\e74b"; + color: inherit; +} +.text-add-tip-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.text-add-tip-font .b-font:before { + content: "\e6dd"; + color: #13cd66; +} +.text-add-tip-font.disabled .b-font:before { + content: "\e6dd"; + color: #13cd66; +} +.add-up-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.add-up-font .b-font:before { + content: "\e70a"; + color: inherit; +} +.add-up-font.disabled .b-font:before { + content: "\e70a"; + color: inherit; +} +.minus-down-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.minus-down-font .b-font:before { + content: "\e70b"; + color: inherit; +} +.minus-down-font.disabled .b-font:before { + content: "\e70b"; + color: inherit; +} +.redis-refresh-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-refresh-font .b-font:before { + content: "\e6ef"; + color: inherit; +} +.redis-refresh-font.disabled .b-font:before { + content: "\e6ef"; + color: inherit; +} +.input-string-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-string-font .b-font:before { + content: "\e6e9"; + color: inherit; +} +.input-string-font.disabled .b-font:before { + content: "\e6e9"; + color: inherit; +} +.input-formula-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-formula-font .b-font:before { + content: "\e6c6"; + color: inherit; +} +.input-formula-font.disabled .b-font:before { + content: "\e6c6"; + color: inherit; +} +.input-date-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-date-font .b-font:before { + content: "\e733"; + color: inherit; +} +.input-date-font.disabled .b-font:before { + content: "\e733"; + color: inherit; +} +.input-boolean-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-boolean-font .b-font:before { + content: "\e656"; + color: inherit; +} +.input-boolean-font.disabled .b-font:before { + content: "\e656"; + color: inherit; +} +.input-int-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-int-font .b-font:before { + content: "\e7c2"; + color: inherit; +} +.input-int-font.disabled .b-font:before { + content: "\e7c2"; + color: inherit; +} +.input-number-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.input-number-font .b-font:before { + content: "\e60b"; + color: inherit; +} +.input-number-font.disabled .b-font:before { + content: "\e60b"; + color: inherit; +} +.redis-site-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-site-font .b-font:before { + content: "\e7c5"; + color: inherit; +} +.redis-site-font.disabled .b-font:before { + content: "\e7c5"; + color: inherit; +} +.redis-column-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-column-font .b-font:before { + content: "\e76f"; + color: inherit; +} +.redis-column-font.disabled .b-font:before { + content: "\e76f"; + color: inherit; +} +.redis-preview-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.redis-preview-font .b-font:before { + content: "\e6f2"; + color: inherit; +} +.redis-preview-font.disabled .b-font:before { + content: "\e6f2"; + color: inherit; +} +.param-table .dec-dynamic-date-combo .even-row { + background-color: #ffffff; +} + diff --git a/src/main/resources/com/fr/plugin/db/redis/web/redis.js b/src/main/resources/com/fr/plugin/db/redis/web/redis.js index a273367..2c0e9b6 100644 --- a/src/main/resources/com/fr/plugin/db/redis/web/redis.js +++ b/src/main/resources/com/fr/plugin/db/redis/web/redis.js @@ -1 +1,15 @@ -/*! time: 2019-9-4 13:44:09 */!function(e){var t={};function o(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)o.d(n,r,function(t){return e[t]}.bind(null,r));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){e.exports=o(1)},function(e,t,o){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:{};return function(o){return function(n){function r(){return i(this,r),c(this,p(r).apply(this,arguments))}return l(r,o),u(r,[{key:"_store",value:function(){var o=t.props?t.props.apply(this):void 0;return BI.Models.getModel(e.xtype,o)}}]),r}()}}(Te)((Ie=Be=function(e){function t(){var e,o,n,r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var i=arguments.length,a=new Array(i),u=0;u=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){c.headers[e]=r.merge(i)})),e.exports=c}).call(this,n(2))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var c,s=[],l=!1,f=-1;function p(){l&&c&&(l=!1,c.length?s=c.concat(s):f=-1,s.length&&y())}function y(){if(!l){var e=u(p);l=!0;for(var t=s.length;t;){for(c=s,s=[];++f1)for(var n=1;n + * @license MIT + */ +e.exports=function(e){return null!=e&&(n(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&n(e.slice(0,0))}(e)||!!e._isBuffer)}},function(e,t,n){"use strict";var r=n(1),o=n(0),i=n(26),a=n(27);function u(e){this.defaults=e,this.interceptors={request:new i,response:new i}}u.prototype.request=function(e){"string"==typeof e&&(e=o.merge({url:arguments[0]},arguments[1])),(e=o.merge(r,{method:"get"},this.defaults,e)).method=e.method.toLowerCase();var t=[a,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)n=n.then(t.shift(),t.shift());return n},o.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,n){return this.request(o.merge(n||{},{method:e,url:t}))}})),o.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,n,r){return this.request(o.merge(r||{},{method:e,url:t,data:n}))}})),e.exports=u},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},function(e,t,n){"use strict";var r=n(5);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e}},function(e,t,n){"use strict";var r=n(0);function o(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(r.isURLSearchParams(t))i=t.toString();else{var a=[];r.forEach(t,(function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+"="+o(e))})))})),i=a.join("&")}return i&&(e+=(-1===e.indexOf("?")?"?":"&")+i),e}},function(e,t,n){"use strict";var r=n(0),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,a={};return e?(r.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(a[t]&&o.indexOf(t)>=0)return;a[t]="set-cookie"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+", "+n:n}})),a):a}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function o(){this.message="String contains an invalid character"}o.prototype=new Error,o.prototype.code=5,o.prototype.name="InvalidCharacterError",e.exports=function(e){for(var t,n,i=String(e),a="",u=0,c=r;i.charAt(0|u)||(c="=",u%1);a+=c.charAt(63&t>>8-u%1*8)){if((n=i.charCodeAt(u+=.75))>255)throw new o;t=t<<8|n}return a}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,a){var u=[];u.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&u.push("expires="+new Date(n).toGMTString()),r.isString(o)&&u.push("path="+o),r.isString(i)&&u.push("domain="+i),!0===a&&u.push("secure"),document.cookie=u.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";var r=n(0);function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(28),i=n(6),a=n(1),u=n(29),c=n(30);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.baseURL&&!u(e.url)&&(e.url=c(e.baseURL,e.url)),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||a.adapter)(e).then((function(t){return s(e),t.data=o(t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(s(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t,n){return r.forEach(n,(function(n){e=n(e,t)})),e}},function(e,t,n){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t,n){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(7);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return function(n){return function(n){function r(){return i(this,r),c(this,l(r).apply(this,arguments))}return f(r,n),u(r,[{key:"_store",value:function(){var n=t.props?t.props.apply(this):void 0;return BI.Models.getModel(e.xtype,n)}}]),r}(n)}}n.r(t);var b,h,g,v=function(e){function t(){var e,n;i(this,t);for(var r=arguments.length,a=new Array(r),u=0;u0&&void 0!==u[0]?u[0]:{},n=t.url,r=t.type,o=t.headers,i=t.data,a=t.params,e.abrupt("return",vt.a.request({url:n,baseURL:Tt,method:r,headers:Et({},At,{},o,{Authorization:"Bearer ".concat(Pt("fine_auth_token")),"Content-Type":"application/json;charset=UTF-8"}),params:a,paramsSerializer:wt,data:i}).then(It).catch((function(e){console.log(e)})));case 3:case"end":return e.stop()}}),e)})),(Rt=function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){xt(i,r,o,a,u,"next",e)}function u(e){xt(i,r,o,a,u,"throw",e)}a(void 0)}))}).apply(this,arguments)}function Dt(e){return St({url:e,type:"GET",params:Et({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{_:(new Date).getTime()})})}var Nt,Ct,jt,Bt={vars:[{text:"$$page_number",value:"$$page_number",type:"VARS",def:"当前的页数。"},{text:"$$totalPage_number",value:"$$totalPage_number",type:"VARS",def:"总页数。"}],JSONs:[{def:"ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。",name:"ABS",type:"MATH"},{def:"ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。",name:"ABS",type:"COMMON"},{def:"acc_sum(x_agg(array),range)根据横纵轴或行列维度添加的字段对指标进行跨行累计的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行累计,1为对组内所有行进行累计示例:acc_sum(sum_agg(array),0)用户横轴轴拖拽销售日期(年分组),则该指标计算结果为,根据销售日期(年)对销量进行分组汇总,然后根据对所有行从上到下进行累加,获得每年的累计销量",name:"ACC_SUM",type:"TABLE_CAL"},{def:"ACOS(number): 返回指定数值的反余弦值。反余弦值为一个角度,返回角度以弧度形式表示。Number:需要返回角度的余弦值。备注: 函数的参数必须在-1和1之间,包括-1和1。 返回的角度值在0和Pi之间。 如果要把返回的角度用度数来表示,用180/PI()乘返回值即可。示例:ACOS(1)等于0(弧度)。ACOS(0.5)等于1.047197551(Pi/3弧度)。ACOS(0.5)*180/PI()等于60(度)。",name:"ACOS",type:"MATH"},{def:"AND(logical1,logical2,…): 当所有参数的值为真时,返回TRUE;当任意参数的值为假时,返回FALSE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:AND(1+7=8,5+7=12)等于TRUE。AND(1+7=8,5+7=11)等于FALSE。如果单元格A1到A4的值分别为TRUE、TRUE、FALSE和TRUE,则:AND(A1:A4)等于FALSE。如果单元格A5的值在0~50之间,则: AND(0 0,b > 0 or a > 0, b < 0时,公式直接成立;a < 0,b > 0, ATAN2(a,b)=PI()-ABS(ATAN(b/a))a < 0,b < 0, ATAN2(a,b)=ABS(ATAN(b/a))-PI() 当x_num与y_num都为0时,ATAN2返回错误信息*DIV/0!。 用角度制显示返回数值时,把返回数值乘以180/PI()。 返回值以弧度表示(返回值大于-pi且小于等于pi)。示例:ATAN2(-2,2)等于2.356194490192345(弧度制的3*pi/4)。ATAN2(2,2)等于0.785398163(弧度制的pi/4)。ATAN2(-2,2)*180/PI()等于135(角度制)。",name:"ATAN2",type:"MATH"},{def:"AVG_AGG(array): 根据当前分析维度,动态返回指标字段的汇总平均值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。 \n 示例:用户横轴为维度字段'日'时,纵轴的计算字段AVG_AGG(销量)返回的值为每日的平均销量;当用户横轴为维度字段'月'时,AVG_AGG(销量)返回的值为每月的平均销量。",name:"AVG_AGG",type:"AGG"},{def:"CEILING(number): 将参数number沿绝对值增大的方向,舍入为最接近的整数Number:指待舍入的数值。CEILING(-2.5)等于-3。CEILING(0.5)等于1。",name:"CEILING",type:"MATH"},{def:"CHAR(number): 根据指定数字返回对应的字符。CHAR函数可将计算机其他类型的数字代码转换为字符。Number:用于指定字符的数字,介于1~65535之间(包括1和65535)。示例:CHAR(88)等于“X”。CHAR(45)等于“-”。",name:"CHAR",type:"TEXT"},{def:'CODE(text): 计算文本串中第一个字符的数字代码。返回的代码对应于计算机使用的字符集。Text:需要计算第一个字符代码的文本或单元格引用。示例:CODE("S")等于83。CODE("Spreadsheet")等于83。',name:"CODE",type:"TEXT"},{def:'CONCATENATE(text1,text2,...): 将数个字符串合并成一个字符串。Text1,text2,...:需要合并成单个文本的文本项,可以是字符,数字或是单元格引用。示例:CONCATENATE("Average ","Price")等于“Average Price”。CONCATENATE("1","2")等于12。',name:"CONCATENATE",type:"TEXT"},{def:"COS(number): 返回一个角度的余弦值。Number:以弧度表示的需要求余弦值的角度。备注: 要把一个角度转换成弧度值,将角度乘于PI()/180。 COS(n*2*PI()+number)=COS(number)(其中n为整数,number从-pi到pi)。示例:COS(0.5)等于0.877582562。COS(30*PI()/180)等于0.866025404。",name:"COS",type:"MATH"},{def:"COUNTD_AGG(array): 根据当前分析维度,动态返回某字段的去重计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段COUNTD_AGG(销量)返回的值为每日的销量的去重个数;当用户横轴为维度字段'月'时,COUNTD_AGG(销量)返回的值为每月的销量的去重个数。\"",name:"COUNTD_AGG",type:"AGG"},{def:"COUNT_AGG(array): 根据当前分析维度,动态返回某字段的计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段'日'时,纵轴的计算字段COUNT_AGG(销量)返回的值为每日的销量的个数;当用户横轴为维度字段'月'时,COUNT_AGG(销量)返回的值为每月的销量的个数。",name:"COUNT_AGG",type:"AGG"},{def:"DATE(year,month,day): 返回一个表示某一特定日期的系列数。Year:代表年,可为一到四位数。Month:代表月份。若1 month 12,则函数把参数值作为月。若month>12,则函数从年的一月份开始往上累加。例如: DATE(2000,25,2)等于2002年1月2日的系列数。Day:代表日。若日期小于等于某指定月的天数,则函数将此参数值作为日。若日期大于某指定月的天数,则函数从指定月份的第一天开始往上累加。若日期大于两个或多个月的总天数,则函数把减去两个月或多个月的余数加到第三或第四个月上,依此类推。例如:DATE(2000,3,35)等于2000年4月4日的系列数。备注: 若需要处理公式中日期的一部分,如年或月等,则可用此公式。 若年,月和日是函数而不是函数中的常量,则此公式最能体现其作用。示例:DATE(1978, 9, 19) 等于1978-09-19.DATE(1211, 12, 1) 等于1211-12-01. ",name:"DATE",type:"DATETIME"},{def:'DATEDELTA(date, deltadays):返回一个日期date后deltadays的日期。deltaDays可以为正值,负值,零。示例:DATEDELTA("2008-08-08", -10)等于2008-07-29。DATEDELTA("2008-08-08", 10)等于2008-08-18。',name:"DATEDELTA",type:"DATETIME"},{def:'DATEDIF(start_date,end_date,unit):返回两个指定日期间的天数、月数或年数。Start_date:代表所指定时间段的初始日期。End_date:代表所指定时间段的终止日期。Unit:函数返回信息的类型。若unit=“Y”,则DATEDIF返回指定时间段的年差数。若unit=“M”,则DATEDIF返回指定时间段的月差数。若unit=“D”,则DATEDIF返回指定时间段的日差数。若unit=“MD”,则DATEDIF忽略年和月,返回指定时间段的日差数。若unit=“YM”,则DATEDIF忽略年和日,返回指定时间段的月差数。若unit=“YD”,则DATEDIF忽略年,返回指定时间段的日差数。示例:DATEDIF("2001/2/28","2004/3/20","Y")等于3,即在2001年2月28日与2004年3月20日之间有3个整年。DATEDIF("2001/2/28","2004/3/20","M")等于37,即在2001年2月28日与2004年3月20日之间有36个整月。DATEDIF("2001/2/28","2004/3/20","D")等于1116,即在2001年2月28日与2004年3月20日之间有1116个整天。DATEDIF("2001/2/28","2004/3/20","MD")等于8,即忽略月和年后,2001年2月28日与2004年3月20日的差为8天。DATEDIF("2001/1/28","2004/3/20","YM")等于2,即忽略日和年后,2001年1月28日与2004年3月20日的差为2个月。DATEDIF("2001/2/28","2004/3/20","YD")等于21,即忽略年后,2001年2月28日与2004年3月20日的差为21天。',name:"DATEDIF",type:"DATETIME"},{def:'DATESUBDATE(date1, date2, op):返回两个日期之间的时间差。op表示返回的时间单位:"s",以秒为单位。"m",以分钟为单位。"h",以小时为单位。"d",以天为单位。"w",以周为单位。示例:DATESUBDATE("2008-08-08", "2008-06-06","h")等于1512。',name:"DATESUBDATE",type:"DATETIME"},{def:'DATETONUMBER(date):返回自 1970 年 1 月 1 日 00:00:00 GMT 经过的毫秒数。示例:DATETONUMBER("2008-08-08")等于1218124800000。',name:"DATETONUMBER",type:"DATETIME"},{def:'DAY:(serial_number)返回日期中的日。DAY是介于1和31之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAY("2000/1/1")等于1。DAY("2006/05/05")等于5。DAY("1997/04/20")等于20。DAY("2000-1-1", "yyyy-MM-dd")等于1。DAY("2006-05-05", "yyyy-MM-dd")等于5。DAY("1997-04-20", "yyyy-MM-dd")等于20。DAY(35796)等于1。',name:"DAY",type:"DATETIME"},{def:'DAYS360(start_date,end_date,method):按照一年 360 天的算法(每个月以 30 天计,一年共计 12 个月),返回两日期间相差的天数,这在会计计算中将会用到。如果财务系统是基于一年 12 个月,每月 30 天,可用此函数帮助计算支付款项。Start_date 和 end_date :是用于计算期间天数的起止日期。Method : 它指定了在计算中是采用欧洲方法还是美国方法。Method 定义 :FALSE或忽略 美国方法 (NASD)。如果起始日期是一个月的 31 号,则等于同月的 30 号。如果终止日期是一个月的31号,并且起始日期早于 30 号,则终止日期等于下一个月的 1 号,否则,终止日期等于本月的 30 号。TRUE 欧洲方法。无论是起始日期还是终止日期为一个月的 31 号,都将等于本月的 30 号。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAYS360("1998/1/30", "1998/2/1") 等于 1',name:"DAYS360",type:"DATETIME"},{def:'DAYSOFMONTH(date):返回从1900年1月后某年某月包含的天数。示例:DAYSOFMONTH("1900-02-01")等于28。DAYSOFMONTH("2008/04/04")等于30。',name:"DAYSOFMONTH",type:"DATETIME"},{def:'DAYSOFQUARTER(date): 返回从1900年1月后某年某季度的天数。示例:DAYSOFQUARTER("2009-02-01")等于90。DAYSOFQUARTER("2009/05/05")等于91。',name:"DAYSOFQUARTER",type:"DATETIME"},{def:'DAYSOFYEAR(year):返回某年包含的天数。示例:DAYSOFYEAR(2008)等于365,等价于DAYSOFYEAR("2008-01-01")。',name:"DAYSOFYEAR",type:"DATETIME"},{def:'DAYVALUE(date):返回1900年至 date日期所经历的天数。示例:DAYVALUE("2008/08/08")等于39669。',name:"DAYVALUE",type:"DATETIME"},{def:"DEGREES(angle): 将弧度转化为度。angle:待转换的弧度角。示例:DEGREES(PI()/2)等于90。DEGREES(3.1415926)等于179.9999969。",name:"DEGREES",type:"MATH"},{def:'ENDWITH(str1,str2):判断字符串str1是否以str2结束。备注: str1和str2都是大小写敏感的。示例:ENDWITH("FineReport","Report")等于true。ENDWITH("FineReport","Fine")等于false。ENDWITH("FineReport","report")等于false。',name:"ENDWITH",type:"TEXT"},{def:'EXACT(text1,text2): 检测两组文本是否相同。如果完全相同,EXACT函数返回TRUE;否则,返回FALSE。EXACT函数可以区分大小写,但忽略格式的不同。同时也可以利用EXACT函数来检测输入文档的文字。Text1:需要比较的第一组文本。Text2:需要比较的第二组文本。示例:EXACT("Spreadsheet","Spreadsheet")等于TRUE。EXACT("Spreadsheet","S preadsheet")等于FALSE。EXACT("Spreadsheet","spreadsheet")等于FALSE。',name:"EXACT",type:"TEXT"},{def:"EXP(number): 返回e的n次幂。常数e为自然对数的底数,等于2.71828182845904。Number:为任意实数,作为常数e的指数。备注: 如果要返回其他常数作为底数的幂,可以使用指数运算符(^)。例如: 在4^2中,4是底数,而2是指数。 EXP函数与LN函数互为反函数。示例:EXP(0)等于1。EXP(3)等于20.08553692。EXP(LN(2))等于2。",name:"EXP",type:"MATH"},{def:"FACT(number):返回数的阶乘,一个数的阶乘等于 1*2*3*...*该数。number:要计算其阶乘的非负数。如果输入的 number 不是整数,则截尾取整。示例:FACT(1) 等于 1FACT(1.9) 等于 FACT(1) 等于 1FACT(0) 等于 1FACT(5) 等于 1*2*3*4*5 等于 120",name:"FACT",type:"MATH"},{def:'FIND(find_text,within_text,start_num):从指定的索引(start_num)处开始,返回第一次出现的指定子字符串(find_text)在此字符串(within_text)中的索引。Find_text:需要查找的文本或包含文本的单元格引用。Within_text:包含需要查找文本的文本或单元格引用。Start_num:指定进行查找字符的索引位置。within_text里的索引从1开始。如果省略start_num,则假设值为1。备注: 如果find_text不在within_text中,FIND函数返回值为0。 如果start_num不大于0,FIND函数返回错误信息*VALUE!。 如果start_num大于within_text的长度,FIND函数返回值为0。 如果find_text是空白文本,FIND函数将在搜索串中匹配第一个字符(即编号为start_num或1的字符)。示例:FIND("I","Information")等于1。FIND("i","Information")等于9。FIND("o","Information",2)等于4。FIND("o","Information",12)等于0。FIND("o","Information",-1)等于*VALUE!。',name:"FIND",type:"TEXT"},{def:"FLOOR(number): 将参数number沿绝对值减小的方向去尾舍入。Number:待舍入的数值。示例:FLOOR(-2.5)等于-2。FLOOR(2.5)等于2。",name:"FLOOR",type:"MATH"},{def:'FORMAT(object,format) : 返回object的format格式。object 需要被格式化对象,可以是String,数字,Object(常用的有Date, Time)。format 格式化的样式。示例FORMAT(1234.5, "#,##0.00") => 1234.50FORMAT(1234.5, "#,##0") => 1234FORMAT(1234.5, "¥#,##0.00") => ¥1234.50FORMAT(1.5, "0%") => 150%FORMAT(1.5, "0.000%") => 150.000%FORMAT(6789, "##0.0E0") => 6.789E3FORMAT(6789, "0.00E00") => 6.79E03FORMAT(date(2007,1,1), "EEEEE, MMMMM dd, yyyy") => 星期一,一月 01,2007FORMAT(date(2007,1,13), "MM/dd/yyyy") => 01/13/2007FORMAT(date(2007,1,13), "M-d-yy") => 1-13-07FORMAT(time(16,23,56), "h:mm:ss a") => 4:23:56 下午',name:"FORMAT",type:"TEXT"},{def:'HOUR(serial_number):返回某一指定时间的小时数。函数指定HOUR为0(0:00)到23(23:00)之间的一个整数。Serial_number:包含所求小时的时间。示例:HOUR("11:32:40")等于11。HOUR("11:32:40", "HH:mm:ss")等于11。',name:"HOUR",type:"DATETIME"},{def:'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first',name:"IF",type:"LOGIC"},{def:'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first',name:"IF",type:"COMMON"},{def:'INDEXOF(str1,index):返回字符串str1在index位置上的字符。备注: index是从0开始计数的。示例:INDEXOF("FineReport",0)等于\'F\'。INDEXOF("FineReport",2)等于\'n\'。INDEXOF("FineReport",9)等于\'t\'。INDEXOF(array, index):返回数组在index位置上的元素。备注: index是从1开始计数的。示例:String[] array = {"a", "b", "c"}INDEXOF(array, 1)等于"a".',name:"INDEXOF",type:"TEXT"},{def:"INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。",name:"INT",type:"MATH"},{def:"INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。",name:"INT",type:"COMMON"},{def:"ISNULL(object):判断对象中所有的值是否全部都是NULL或者为空字符串。",name:"ISNULL",type:"OTHER"},{def:'LEFT(text,num_chars): 根据指定的字符数返回文本串中的第一个或前几个字符。Text:包含需要选取字符的文本串或单元格引用。Num_chars:指定返回的字符串长度。备注: Num_chars的值必须等于或大于0。 如果num_chars大于整个文本的长度,LEFT函数将返回所有的文本。 如果省略num_chars,则默认值为1。示例:LEFT("Fine software",8)等于“Fine sof”。LEFT("Fine software")等于“F”。如果单元格A3中含有“China”,则LEFT(A3,2)等于“Ch”。',name:"LEFT",type:"TEXT"},{def:"LEN(args): 返回文本串中的字符数或者数组的长度。需要注意的是:参数args为文本串时,空格也计为字符。参数args为数组时,直接返回数组长度。示例:LEN(\"Evermore software\")等于17。LEN(\" \")等于1。LEN(['a','b'])等于2。",name:"LEN",type:"TEXT"},{def:"LN(number):返回一个数的自然对数。自然对数以常数项 e(2.71828182845904)为底。number:是用于计算其自然对数的正实数。示例:LN(86) 等于 4.45437LN(2.7182818) 等于 1LN(EXP(3)) 等于 3EXP(LN(4)) 等于 4",name:"LN",type:"MATH"},{def:"LOG(number,base): 按指定的任意底数,返回数值的对数。Number:需要求对数的正实数。Base:对数的底数。如果省略底数,默认值为10。示例:LOG(16,2)等于4。LOG(10)等于1。LOG(24,3)等于2.892789261。",name:"LOG",type:"MATH"},{def:"LOG10(number):返回以 10 为底的对数。number: 用于常用对数计算的正实数。示例:LOG10(86) 等于 1.934498451LOG10(10) 等于 1LOG10(1E5) 等于 5",name:"LOG10",type:"MATH"},{def:'LOWER(text): 将所有的大写字母转化为小写字母。Text:需要转化为小写字母的文本串。LOWER函数不转化文本串中非字母的字符。示例:LOWER("A.M.10:30")等于“a.m.10:30”。LOWER("China")等于“china”。',name:"LOWER",type:"TEXT"},{def:"LUNAR(year,day,month): 返回当前日期对应的农历时间。year,month,day:分别对应年月日。示例:如果需要查询2011年7月21日对应的农历时间,则只需输入LUNAR(2011,7,21)结果将显示为:辛卯年六月廿一同样,如输入LUNAR(2001,7,21),则显示:辛巳年六月初一 。本公式支持的时间段为1900-2100年。",name:"LUNAR",type:"DATETIME"},{def:"MAX(number1,number2,…): 返回参数列表中的最大值。Number1,number2,…:1到30个需要找出最大值的参数。备注: 参数可以是数字、空白单元格、逻辑值或数字的文本表达式。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。 如果参数中没有任何数字,MAX将返回0。示例:MAX(0.1,0,1.2)等于1.2。",name:"MAX",type:"MATH"},{def:"MAX_AGG(array): 根据当前分析维度,动态返回指标字段的最大值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MAX_AGG(销量)返回的值为每日的最大值销量;当用户横轴为维度字段'月'时,MAX_AGG(销量)返回的值为每月的最大值销量。",name:"MAX_AGG",type:"AGG"},{def:"MEDIAN_AGG(array): 根据当前分析维度,动态返回指标字段的中位数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MEDIAN_AGG(销量)返回的值为每日的中位数销量;当用户横轴为维度字段'月'时,MEDIAN_AGG(销量)返回的值为每月的中位数销量。",name:"MEDIAN_AGG",type:"AGG"},{def:'MID(text,start_num,num_chars): 返回文本串中从指定位置开始的一定数目的字符,该数目由用户指定。Text:包含要提取字符的文本串。Start_num:文本中需要提取字符的起始位置。文本中第一个字符的start_num为1,依此类推。Num_chars:返回字符的长度。备注: 如果start_num大于文本长度,MID函数返回“”(空文本)。 如果start_num小于文本长度,并且start_num加上num_chars大于文本长度,MID函数将从start_num指定的起始字符直至文本末的所有字符。 如果start_num小于1,MID函数返回错误信息*VALUE!。 如果num_chars是负数,MID函数返回错误信息*VALUE!。示例:MID("Finemore software",10,8)返回“software”。MID("Finemore software",30,5)返回“”(空文本)。MID("Finemore software",0,8)返回*VALUE!。MID("Finemore software",5,-1)返回*VALUE!。',name:"MID",type:"TEXT"},{def:"MIN(number1,number2,…): 返回参数列表中的最小值。Number1,number2,…:1到30个需要找出最小值的参数。备注: 若参数中没有数字,函数MIN将返回0。 参数应为数字、空白单元格、逻辑值或是表示数值的文本串。如果参数是错误值时,MIN将返回错误信息。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。示例:如果B1:B4包含3,6,9,12,则:MIN(B1:B4)等于3。MIN(B1:B4,0)等于0。",name:"MIN",type:"MATH"},{def:'MINUTE(serial_number):返回某一指定时间的分钟数,其值是介于0与59之间的一个整数。serial_number:包含所求分钟数的时间。示例:MINUTE("15:36:25")等于36。MINUTE("15:36:25", "HH:mm:ss")等于36。',name:"MINUTE",type:"DATETIME"},{def:"MIN_AGG(array): 根据当前分析维度,动态返回指标字段的最小值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MIN_AGG(销量)返回的值为每日的最小值销量;当用户横轴为维度字段'月'时,MIN_AGG(销量)返回的值为每月的最小值销量。",name:"MIN_AGG",type:"AGG"},{def:"MOD(number,divisor):返回两数相除的余数。结果的正负号与除数相同。number:为被除数。divisor:为除数。示例:MOD(3, 2) 等于 1MOD(-3, 2) 等于 1MOD(3, -2) 等于 -1MOD(-3, -2) 等于 -1",name:"MOD",type:"MATH"},{def:'MONTH:(serial_number)返回日期中的月。月是介于1和12之间的一个数。Serial_number:含有所求的月的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:MONTH("2000/1/1")等于1。MONTH("2006/05/05")等于5。MONTH("1997/04/20")等于4。MONTH("2000-1-1", "yyyy-MM-dd")等于1。MONTH("2006-05-05", "yyyy-MM-dd")等于5。MONTH("1997-04-20", "yyyy-MM-dd")等于4。MONTH(35796)等于1。',name:"MONTH",type:"DATETIME"},{def:'MONTHDELTA(date,delta):返回指定日期date后delta个月的日期。示例:MONTHDELTA("2008-08-08", 4)等于2008-12-08。',name:"MONTHDELTA",type:"DATETIME"},{def:"NOW():获取当前时间。示例:如果系统时间是2012年5月12日 15点18分38秒则NOW()等于2012-05-12 15:18:36。",name:"NOW",type:"DATETIME"},{def:"NUMTO(number,bool)或NUMTO(number):返回number的中文表示。其中bool用于选择中文表示的方式,当没有bool时采用默认方式显示。示例:NUMTO(2345,true)等于二三四五。示例:NUMTO(2345,false)等于二千三百四十五。示例:NUMTO(2345)等于二千三百四十五。",name:"NUMTO",type:"TEXT"},{def:"NVL(value1,value2,value3,...):在所有参数中返回第一个不是null的值value1:可以为任意数,也可以为null。value2:可以为任意数,也可以为null。当字符串长度为0时, 返回也为null示例:NVL(12,20)等于12。NVL(null,12)等于12。NVL(null,null)等于null。NVL(20,null)等于20。NVL(null,null,10)等于10。",name:"NVL",type:"OTHER"},{def:"OR(logical1,logical2,…): 当所有参数的值为假时,返回FALSE;当任意参数的值为真时,返回TRUE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:OR(1+7=9,5+7=11)等于FALSE。OR(1+7=8,5+7=11)等于TRUE。",name:"OR",type:"LOGIC"},{def:'period_anls(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行上期末的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算的上期末为上年期末或者上月期末。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:period_anls(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年年末的销量;如果参数2为“M”,则计算结果为该日销量上月月末的销量。',name:"PERIOD_ANLS",type:"TABLE_CAL"},{def:"PI(number): 是一个数学常量函数,当number为空时,函数返回精确到15位的数值3.141592653589793;当参数不为空时,number表示PI的倍数。示例:SIN(PI()/2)等于1。计算圆的面积的公式: S=PI()*(r^2),其中S为圆的面积,R为圆的半径。PI(3)等于9.42477796076938。",name:"PI",type:"MATH"},{def:"POWER(number,power): 返回指定数字的乘幂。Number:底数,可以为任意实数。Power:指数。参数number按照该指数次幂乘方。备注: 可以使用符号“^”代替POWER,如: POWER(5,2)等于5^2。示例:POWER(6,2)等于36。POWER(14,5)等于537824。POWER(4,2/3)等于2.519842100。POWER(3,-2.3)等于0.079913677。",name:"POWER",type:"MATH"},{def:"previous_period(x_agg(array))根据横纵轴或行列维度添加的日期字段进行环期值的计算。参数为用于计算的指标,该指标必须为聚合函数或聚合指标。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:previous_period(sum_agg(amount)) 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上一日的销量。",name:"PREVIOUS_PERIOD",type:"TABLE_CAL"},{def:"PROMOTION(value1,value2):返回value2在value1上提升的比例。示例:PROMOTION(12, 14)等于0.166666666,即提升了16.6666666%.PROMOTION(-12, 14)等于2.166666666,即提升了216.6666666%.",name:"PROMOTION",type:"MATH"},{def:'PROPER(text): 将文本中的第一个字母和所有非字母字符后的第一个字母转化成大写,其他字母变为小写。Text:需要转化为文本的公式、由双引号引用的文本串或是单元格引用。示例:PROPER("Finemore Integrated Office")等于“Finemore Integrated Office”。PROPER("100 percent")等于“100 Percent”。PROPER("SpreaDSheEt")等于“Spreadsheet”。',name:"PROPER",type:"TEXT"},{def:"RADIANS(angle): 将角度转换成弧度。Angle:需要转换为弧度的角度。示例:RADIANS(90)等于1.570796327。",name:"RADIANS",type:"MATH"},{def:"RAND(): 返回均匀分布的随机数。每计算一次工作表,函数都会返回一个新的随机数值。备注: 要生成一个位于a和b之间的随机数,可以使用以下的公式: C=RAND()*(b-a)+a。 如果要使一个随机产生的数值不随单元格的重计算而改变,可以在编辑框中输入=RAND()并保持编辑状态,然后按F9,将公式永久性地改为随机数。示例:假如需要生成一个大于等于0,小于60的随机数,使用公式: =RAND()*60。假如需要生成一个大于等于0,小于19的随机数,使用公式: =RAND()*19。假如需要生成一个大于等于0,小于50的随机数,使用公式: =RAND()*50。",name:"RAND",type:"MATH"},{def:"RANDBETWEEN(value1,value2):返回value1和value2之间的一个随机整数。示例:RANDBETWEEN(12.333, 13.233)只会返回13。RANDBETWEEN(11.2, 13.3)有可能返回12或者13。",name:"RANDBETWEEN",type:"MATH"},{def:'rank_anls(x_agg(array),range,order)根据横纵轴或行列维度添加的字段对指标进行跨行排名的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行排名,1为对组内所有行进行排名;第三个参数order为排名的计算规则,"asc"为升序排名,"desc"为降序排名。示例:rank_anls(sum_agg(amount),0,"asc")用户横轴轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算每个省份的销量在所有省份中的升序排名情况。',name:"RANK_ANLS",type:"TABLE_CAL"},{def:'REGEXP(str, pattern):字符串str是否与正则表达式pattern相匹配。示例:REGEXP("aaaaac","a*c")等于true。REGEXP("abc","a*c")等于false。REGEXP(str, pattern, intNumber):字符串str是否与具有给定模式 intNumber的正则表达式pattern相匹配。示例:CASE_INSENSITIVE = 0 启用不区分大小写的匹配。 默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指 定 UNICODE_CASE 标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。 MULTILINE = 1 启用多行模式。DOTALL = 2 启用 dotall 模式。在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行 结束符。UNICODE_CASE = 3 启用 Unicode 感知的大小写折叠。指定此标志后,由 CASE_INSENSITIVE 标志启用时,不区分大小写的匹配将以 符合 Unicode Standard 的方式完成。CANON_EQ = 4 启用规范等价。 指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。UNIX_LINES = 5 启用 Unix 行模式。 在此模式中,.、^ 和 $ 的行为中仅识别 \'\n\' 行结束符。LITERAL = 6 启用模式的字面值解析。 指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的 元字符或转义序列不具有任何特殊意义。 标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志一起使用时将 对匹配产生影响。其他标志都变得多余了。COMMENTS = 7 模式中允许空白和注释。 此模式将忽略空白和在结束行之前以 # 开头的嵌入式注释。 REGEXP("Aaaaabbbbc","a*b*c", 3)等于true。REGEXP("Aaaaabbbbc","a*b*c", 1)等于false。',name:"REGEXP",type:"TEXT"},{def:'REPEAT(text,number_times): 根据指定的次数重复显示文本。REPEAT函数可用来显示同一字符串,并对单元格进行填充。Text:需要重复显示的文本或包含文本的单元格引用。Number_times:指定文本重复的次数,且为正数。如果number_times为0,REPEAT函数将返回“”(空文本)。如果number_times不是整数,将被取整。REPEAT函数的最终结果通常不大于32767个字符。备注: 该函数可被用于在工作表中创建简单的直方图。示例:REPEAT("$",4)等于“$$$$”。如果单元格B10的内容为“你好”,REPEAT(B10,3)等于“你好你好你好”。',name:"REPEAT",type:"TEXT"},{def:'REPLACE(text, texttoreplace, replacetext):根据指定字符串,用其他文本来代替原始文本中的内容。text:需要被替换部分字符的文本或单元格引用。texttoreplace:指定的字符串。replacetext:需要替换部分旧文本的文本。示例:REPLACE("abcd", "a", "re")等于"rebcd"。REPLACE("a**d", "**d", "rose")等于"arose"。REPLACE(old_text,start_num,num_chars,new_text): 根据指定的字符数,用其他文本串来替换某个文本串中的部分内容。Old_text:需要被替换部分字符的文本或单元格引用。Start_num:需要用new_text来替换old_text中字符的起始位置。Num_chars:需要用new_text来替换old_text中字符的个数。New_text:需要替换部分旧文本的文本。示例:REPLACE("0123456789",5,4,"*")等于“0123*89”。REPLACE("1980",3,2,"99")等于“1999”。',name:"REPLACE",type:"TEXT"},{def:'RIGHT(text,num_chars): 根据指定的字符数从右开始返回文本串中的最后一个或几个字符。Text:包含需要提取字符的文本串或单元格引用。Num_chars:指定RIGHT函数从文本串中提取的字符数。Num_chars不能小于0。如果num_chars大于文本串长度,RIGHT函数将返回整个文本。如果不指定num_chars,则默认值为1。示例:RIGHT("It is interesting",6)等于“esting”。RIGHT("Share Holder")等于“r”。RIGHT("Huge sale",4)等于“sale”。',name:"RIGHT",type:"TEXT"},{def:"ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.",name:"ROUND",type:"MATH"},{def:"ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.",name:"ROUND",type:"COMMON"},{def:'same_period(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行同期值的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算同期时计算某日的年同期或者某日的月同期。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:same_period(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年同日的销量;如果参数2为“M”,则计算结果为该日销量上月同日的销量。',name:"SAME_PERIOD",type:"TABLE_CAL"},{def:'SECOND(serial_number):返回某一指定时间的秒数,其值是介于0与59之间的一个整数。Serial_number:包含所求秒数的时间。示例:SECOND("15:36:25")等于25。SECOND("15:36:25", "HH:mm:ss")等于25。',name:"SECOND",type:"DATETIME"},{def:"SIGN(number):返回数字的符号。当数字为正数时返回 1,为零时返回 0,为负数时返回 -1。Number:为任意实数。示例:SIGN(10) 等于 1SIGN(4-4) 等于 0SIGN(-0.00001) 等于 -1",name:"SIGN",type:"MATH"},{def:"SIN(number): 计算给定角度的正弦值。Number:待求正弦值的以弧度表示的角度。备注: 如果参数的单位是度,将其乘以PI()/180即可转换成弧度。示例:SIN(10)等于-0.5440211108893698。SIN(45*PI()/180)等于0.707106781。",name:"SIN",type:"MATH"},{def:'SPLIT(String1,String2):返回由String2分割String1组成的字符串数组。String1:以双引号表示的字符串。String2:以双引号表示的分隔符。例如逗号","示例:SPLIT("hello,world,yes",",") = ["hello","world","yes"]。SPLIT("this is very good"," ") = ["this","is","very","good"]。备注:如果只有一个参数,则返回一个错误。如果有多个参数,则只有前两个起作用。',name:"SPLIT",type:"TEXT"},{def:"SQRT(number): 返回一个正数的平方根。Number:要求其平方根的任一正数。备注:Number必须是一个正数,否则函数返回错误信息*NUM!。示例:SQRT(64)等于8。SQRT(-64)返回*NUM!。",name:"SQRT",type:"MATH"},{def:'STARTWITH(str1,str2):判断字符串str1是否以str2开始。备注: str1和str2都是大小写敏感的。示例:STARTWITH("FineReport","Fine")等于true。STARTWITH("FineReport","Report")等于false。STARTWITH("FineReport","fine")等于false。',name:"STARTWITH",type:"TEXT"},{def:"STDEV_AGG(array): 根据当前分析维度,动态返回指标字段的标准差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段STDEV_AGG(销量)返回的值为每日的销量标准差;当用户横轴为维度字段'月'时,STDEV_AGG(销量)返回的值为每月的销量标准差。",name:"STDEV_AGG",type:"AGG"},{def:'SUBSTITUTE(text,old_text,new_text,instance_num): 用new_text替换文本串中的old_text。Text:需要被替换字符的文本,或含有文本的单元格引用。Old_text:需要被替换的部分文本。New_text:用于替换old_text的文本。Instance_num:指定用new_text来替换第几次出现的old_text。如果指定了instance_num,则只有指定位置上的old_text被替换,否则文字串中出现的所有old_text都被new_text替换。备注: 如果需要替换文本串中的指定文本,则使用SUBSTITUTE函数;如果需要替换文本串中指定位置上的任意文本,则使用REPLACE函数。示例:SUBSTITUTE("data base","base","model")等于“data model”。SUBSTITUTE("July 28, 2000","2","1",1)等于“July 18, 2000”。SUBSTITUTE("July 28, 2000","2","1")等于“July 18, 1000”。SUBSTITUTE("July 28, 2000","2","1",2)等于“July 28, 1000”。 ',name:"SUBSTITUTE",type:"TEXT"},{def:"SUM_AGG(array):根据当前分析维度,动态返回指标字段的汇总求和值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段'日'时,纵轴的计算字段SUM_AGG(销量)返回的值为每日的汇总销量;当用户横轴为维度字段'月'时,SUM_AGG(销量)返回的值为每月的汇总销量。",name:"SUM_AGG",type:"AGG"},{def:"switch(表达式, 值1, 结果1, 值2, 结果2, ...)如果表达式的结果是值1,整个函数返回结果1如果表达式的结果是值2,整个函数返回结果2如果表达式的结果是值3,整个函数返回结果3等等",name:"SWITCH",type:"LOGIC"},{def:"TAN(number): 返回指定角度的正切值。Number:待求正切值的角度,以弧度表示。如果参数是以度为单位的,乘以Pi()/180后转换为弧度。示例:TAN(0.8)等于1.029638557。TAN(45*Pi()/180)等于1。",name:"TAN",type:"MATH"},{def:"TIME(hour,minute,second): 返回代表指定时间的小数。介于0:00:00(12:00:00 A.M.)与23:59:59(11:59:59 P.M.)之间的时间可返回0到0.99999999之间的对应数值。Hour:介于0到23之间的数。Minute:介于0到59之间的数。Second:介于0到59之间的数。示例:TIME(14,40,0)等于2:40 PM。TIME(19,43,24)等于7:43 PM。",name:"TIME",type:"DATETIME"},{def:'TODATE()函数可以将各种日期形式的参数转换为日期类型。它有三种参数的形式:1 参数是一个日期型的参数,那么直接将这个参数返回。示例:TODATE(DATE(2007,12,12))返回2007年12月12日组成的日期。2 参数是以从1970年1月1日0时0分0秒开始的毫秒数,返回对应的时间。示例:TODATE(1023542354746)返回2002年6月8日。3 参数是日期格式的文本,那么返回这个文本对应的日期。示例:TODATE("2007/10/15")返回2007年10月5日组成的日期。TODATE("2007-6-8")返回2007年6月8日组成的日期。4 有两个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式。示例:TODATE("1/15/07","mm/dd/yy")返回07年1月15日组成的日期。特别的,"yyyyMMdd"是用来解析形如“20081230”之类的日期格式的。比如TODATE("20110830","yyyyMMdd")返回11年08月30日组成的日期5 有三个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式,第三个参数为解析日期的语言,如:zh(中文),en(英文)。示例:TODATE("星期三 1/15/07","EEE mm/dd/yy", "zh")返回07年1月15日组成的日期,使用“zh(中文)”才能够正常解析“星期三”这个字符串。',name:"TODATE",type:"DATETIME"},{def:"TODAY():获取当前日期。示例:如果系统日期是2005年9月10日则TODAY()等于2005-9-10。",name:"TODAY",type:"DATETIME"},{def:'TODOUBLE(text): 将文本转换成Double对象。Text:需要转换的文本。示例:TODOUBLE("123.21")等于 new Double(123.21)。',name:"TODOUBLE",type:"TEXT"},{def:'TOINTEGER(text): 将文本转换成Integer对象。Text:需要转换的文本。示例:TOINTEGER("123")等于 new Integer(123)。',name:"TOINTEGER",type:"TEXT"},{def:'total(x_agg(array),range,agg)根据横纵轴或行列维度添加的字段对指标进行跨行汇总的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行汇总,1为对组内所有行进行汇总;第三个参数agg为汇总的计算规则,"sum"为求和;"avg"为求平均,"max"为求最大值,"min"为求最小值示例:total(sum_agg(array),0,"avg")用户横纵轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算平均每个省份的销量',name:"TOTAL",type:"TABLE_CAL"},{def:'TRIM(text): 清除文本中所有空格,单词间的单个空格除外,也可用于带有不规则空格的文本。Text:需要清除空格的文本。示例:TRIM(" Monthly Report")等于Monthly Report。',name:"TRIM",type:"TEXT"},{def:"TRUNC(number,num_digits):将数字的小数部分截去,返回整数。number:需要截尾取整的数字。num_digits:用于指定取整精度的数字。示例:TRUNC(8.9) 等于 8TRUNC(-8.9) 等于 -8TRUNC(PI()) 等于 3",name:"TRUNC",type:"MATH"},{def:'UPPER(text): 将文本中所有的字符转化为大写。Text:需要转化为大写字符的文本,或是包含文本的单元格引用。示例:UPPER("notes")等于“NOTES”。如果单元格E5的值为“Examples”,则UPPER(E5)等于“EXAMPLES”。',name:"UPPER",type:"TEXT"},{def:"VAR_AGG(array): 根据当前分析维度,动态返回指标字段的方差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段VAR_AGG(销量)返回的值为每日的销量方差;当用户横轴为维度字段'月'时,VAR_AGG(销量)返回的值为每月的销量方差。",name:"VAR_AGG",type:"AGG"},{def:'WEEK(serial_num):返回一个代表一年中的第几周的数字。Serial_num:表示输入的日期。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:WEEK("2010/1/1")等于52。WEEK("2010/1/6")等于1。WEEK(35796)等于1。',name:"WEEK",type:"DATETIME"},{def:"weekdate(year,month,weekOfMonth,dayOfWeek): 返回指定年月的指定周的周几的具体日期。示例:weekdate(2009,10,2,1)返回的是2009年的10月的第二个周的第一天即星期天的日期,返回的是2009-10-04最后一个参数dayOfWeek为-1时,表示这个周的最后一天示例:weekdate(2009,12,1,-1)返回的是2009年的12月的第一个周的最后一天即星期六的日期,返回的是2009-12-05",name:"WEEKDATE",type:"DATETIME"},{def:'WEEKDAY(Serial_number):获取日期并返回星期数。返回值为介于0到6之间的某一整数,分别代表星期中的某一天(从星期日到星期六)。Serial_number:输入的日期备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。举例:WEEKDAY("2005/9/10")等于6(星期六)。WEEKDAY("2005/9/11")等于0(星期日)。WEEKDAY(35796)等于4(星期四)。',name:"WEEKDAY",type:"DATETIME"},{def:'YEAR:(serial_number)返回日期中的年。Year是介于1900和9999之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:YEAR("2000/1/1")等于2000。YEAR("2006/05/05")等于2006。YEAR("1997/04/20")等于1997。YEAR("2000-1-1", "yyyy-MM-dd")等于2000。YEAR("2006-05-05", "yyyy-MM-dd")等于2006。YEAR("1997-04-20", "yyyy-MM-dd")等于1997。YEAR(35796)等于1998。',name:"YEAR",type:"DATETIME"},{def:'YEARDELTA(date, delta):返回指定日期后delta年的日期。示例:YEARDELTA("2008-10-10",10)等于2018-10-10。',name:"YEARDELTA",type:"DATETIME"}]};function Mt(){return new Promise((function(e){e(Bt)}))}function Lt(e){return(Lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ut(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:""})}(n.model.selectedConnection,n.model.search).then((function(e){n.model.tables=e||[]})):n.model.tables=[]},setSearch:function(e){this.model.search=e},setSelectedConnection:function(e){this.model.selectedConnection=e}}),n}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Vt(e,t)}(t,e),n=t,(r=[{key:"state",value:function(){return{connections:[],tables:[],search:"",selectedConnection:""}}}])&&Ut(n.prototype,r),o&&Ut(n,o),t}(v),kt(Ct,"xtype","dec.model.dcm.connection.plugin.redis.table_list"),Nt=jt))||Nt;function qt(e){return(qt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Kt(e,t){for(var n=0;n0?n.model.connections[0]:"";n.connectionTextValue.setValue(e),n.store.setSelectedConnection(e)},"selectedConnection || search":function(){n.store.initTableList()},tables:function(e){n.buttonGroup.populate(n.renderTableList())}}),n}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&zt(e,t)}(t,BI.Widget),n=t,(r=[{key:"render",value:function(){var e=this;return{type:"bi.vtape",hgap:10,bgap:5,items:[{el:{type:"bi.htape",items:[{type:"bi.text_value_combo",ref:function(t){e.connectionTextValue=t},items:[],listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action:function(){var t=e.connectionTextValue.getValue()[0];e.store.setSelectedConnection(t)}}]},{el:{type:"bi.icon_button",cls:"redis-site-font",title:BI.i18nText("Plugin-Redis_Data_Connection"),handler:function(){window.location.href="".concat(Tt,"#management/connection")}},width:25},{el:{type:"bi.icon_button",cls:"redis-refresh-font",title:BI.i18nText("Plugin-Redis_Refresh"),handler:function(){e.store.initData()}},width:25}]},height:25},{el:{type:"bi.htape",items:[{type:"bi.text_editor",height:24,watermark:BI.i18nText("Plugin-Redis_Keys_Pattern"),ref:function(t){e.searchText=t}},{el:{type:"bi.button",minWidth:50,text:BI.i18nText("Plugin-Redis_Keys_Pattern_Search"),handler:function(){e.store.setSearch(e.searchText.getValue())}},width:50}]},height:25},{type:"bi.vtape",items:[{type:"bi.button_group",chooseType:BI.Selection.None,layouts:[{type:"bi.vertical"}],items:[],ref:function(t){e.buttonGroup=t}}]}]}}},{key:"renderConnectionList",value:function(){return this.model.connections.map((function(e){return{text:e,value:e}}))}},{key:"renderTableList",value:function(){return this.model.tables.map((function(e){return{type:ht.xtype,text:e,value:e}}))}},{key:"mounted",value:function(){this.store.initData()}},{key:"getSelectedDatabase",value:function(){return this.model.selectedConnection}}])&&Kt(n.prototype,r),o&&Kt(n,o),t}(),Qt(Wt,"xtype","dec.dcm.connection.plugin.redis.table_list"),Ht=Xt))||Ht)||Ht;n(8);function rn(e){return(rn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function on(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:BI.RegularFormulaInserter.xtype;return new Promise((function(n,r){var o,i=BI.UUID();BI.Popovers.create(i,{type:_,width:900,height:600,header:BI.i18nText("Plugin-JSON_Function_Definition"),body:{type:BI.FormulaOpeartingPanel.xtype,configLoader:Mt,ref:function(e){o=e},inserterType:t,value:e},listeners:[{eventName:BI.Popover.EVENT_CANCEL,action:function(){r(),BI.Popovers.remove(i)}},{eventName:BI.Popover.EVENT_CONFIRM,action:function(){n(o.getValue()),BI.Popovers.remove(i)}}]}).open(i)}))}({formula:0===this.model.inputValue?"":this.model.inputValue},BI.ComplexFormulaInserter.xtype).then((function(e){t.store.setInpueValue(e.formula),t.formulaPane.setValue(e.formula)}))}},{key:"getValue",value:function(){return"int"===this.model.inputType?parseInt("".concat(this.model.inputValue),10):this.model.inputValue}}])&&mn(n.prototype,r),o&&mn(n,o),t}(),vn(fn,"xtype","plugin.report.redis.components.database_index"),ln=pn))||ln)||ln,xn=[{text:BI.i18nText("Plugin-Redis_Set_Parameter_Name")},{text:BI.i18nText("Plugin-Redis_Set_Parameter_Type")},{text:BI.i18nText("Plugin-Redis_Set_Parameter_Value")}],An=[{text:BI.i18nText("Dec-Basic_String"),value:DecCst.Schedule.Parameter.Type.STRING,iconCls:"string-field-font"},{text:BI.i18nText("Dec-Basic_Integer"),value:DecCst.Schedule.Parameter.Type.INTEGER,iconCls:"number-field-font"},{text:BI.i18nText("Dec-Basic_Double"),value:DecCst.Schedule.Parameter.Type.DOUBLE,iconCls:"number-field-font"},{text:BI.i18nText("Dec-Basic_Date"),value:DecCst.Schedule.Parameter.Type.DATE,iconCls:"date-field-font"},{text:BI.i18nText("Dec-Basic_Boolean"),value:DecCst.Schedule.Parameter.Type.BOOLEAN,iconCls:"string-field-font"},{text:BI.i18nText("Dec-Basic_Formula"),value:DecCst.Schedule.Parameter.Type.FORMULA,iconCls:"string-field-font"}];function wn(e){return(wn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Pn(e,t){for(var n=0;n Date: Tue, 12 Nov 2019 14:40:10 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/plugin/db/redis/bean/ParameterBean.java | 7 +++---- .../java/com/fr/plugin/db/redis/util/RedisUtils.java | 11 +++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java b/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java index adabb39..53614ca 100644 --- a/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java +++ b/src/main/java/com/fr/plugin/db/redis/bean/ParameterBean.java @@ -1,7 +1,6 @@ package com.fr.plugin.db.redis.bean; import com.fanruan.api.util.StringKit; -import com.fr.base.ParameterTypeHandler; import com.fr.stable.ParameterProvider; import java.util.ArrayList; @@ -12,12 +11,12 @@ import java.util.List; * @version 10.0.4 * Created by Elijah on 2019/10/30 */ -public class ParameterBean{ +public class ParameterBean { public static final String TYPE = "type"; public static final String NAME = "name"; public static final String VALUE = "value"; - private String type = ParameterTypeHandler.String.name(); + private String type = "String"; private String name; private String value; @@ -69,7 +68,7 @@ public class ParameterBean{ public static List createParameterBeans(ParameterProvider[] parameterProviders) { List parameterBeans = new ArrayList(); - for (ParameterProvider parameterProvider: parameterProviders) { + for (ParameterProvider parameterProvider : parameterProviders) { parameterBeans.add(ParameterBean.createBean(parameterProvider)); } return parameterBeans; diff --git a/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java b/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java index 8a52b93..15257fa 100644 --- a/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java +++ b/src/main/java/com/fr/plugin/db/redis/util/RedisUtils.java @@ -6,7 +6,6 @@ import com.fanruan.api.util.ArrayKit; import com.fanruan.api.util.GeneralKit; import com.fanruan.api.util.RenderKit; import com.fanruan.api.util.StringKit; -import com.fr.base.Parameter; import com.fr.json.JSONArray; import com.fr.plugin.db.redis.core.order.OrderValue; import com.fr.plugin.db.redis.help.ScriptBridge; @@ -74,18 +73,18 @@ public class RedisUtils { } } - public static ParameterProvider[] analyzeParameter(JSONArray existParameters, OrderValue orderValue, String ...parameterTexts) { - Parameter[] oldParameters = new Parameter[existParameters.size()]; + public static ParameterProvider[] analyzeParameter(JSONArray existParameters, OrderValue orderValue, String... parameterTexts) { + ParameterProvider[] oldParameters = new ParameterProvider[existParameters.size()]; for (int i = 0; i < existParameters.size(); i++) { - oldParameters[i] = Parameter.getParameterFromJson(existParameters.getJSONObject(i)); + oldParameters[i] = ParameterKit.json2Parameter(existParameters.getJSONObject(i)); } ParameterProvider[] newParameters = ParameterKit.analyzeAndUnionSameParameters(parameterTexts, oldParameters); ParameterProvider[] newOrderParameters = orderValue.analyze4Parameters(); Map parameterProviderMap = new HashMap(); - for (ParameterProvider parameterProvider: oldParameters) { + for (ParameterProvider parameterProvider : oldParameters) { parameterProviderMap.put(parameterProvider.getName(), parameterProvider); } - for (ParameterProvider parameterProvider: newOrderParameters) { + for (ParameterProvider parameterProvider : newOrderParameters) { if (parameterProviderMap.containsKey(parameterProvider.getName())) { parameterProvider.setValue(parameterProviderMap.get(parameterProvider.getName()).getValue()); } From 004a4da48b7259e21fdf7732a5bd90ac07464654 Mon Sep 17 00:00:00 2001 From: richie Date: Tue, 12 Nov 2019 18:29:44 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=E5=BC=95=E7=94=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/finekit-10.0.jar | Bin 368000 -> 368800 bytes .../plugin/db/redis/bean/ParameterBean.java | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/finekit-10.0.jar b/lib/finekit-10.0.jar index 4b0a0203b3d34cca63b0b5a9c185eb103d87a67a..160d56e27ca4d91d68b3c4a1e4f202c9d8b4ea06 100644 GIT binary patch delta 21379 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 Tfy2%mXS_DTUp4y;`pf(ujZopc delta 19909 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 Date: Wed, 13 Nov 2019 09:24:04 +0800 Subject: [PATCH 10/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E7=9A=84zip=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/redis/web/demo-tabledate-redis-web.zip | Bin 173435 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/com/fr/plugin/db/redis/web/demo-tabledate-redis-web.zip diff --git a/src/main/resources/com/fr/plugin/db/redis/web/demo-tabledate-redis-web.zip b/src/main/resources/com/fr/plugin/db/redis/web/demo-tabledate-redis-web.zip deleted file mode 100644 index 8049dd94aa554065b416ca194635e03583eb298f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173435 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 KSU>xrRP-NS>WZ!a From 3891cf53b45bdb251c990112b1c435b1c4e8037a Mon Sep 17 00:00:00 2001 From: Elijah Date: Fri, 29 Nov 2019 09:29:40 +0800 Subject: [PATCH 11/14] DEC-11133 fix --- .../com/fr/plugin/db/redis/RedisConnectionComponent.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java b/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java index 4452ec9..a70aa84 100644 --- a/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java +++ b/src/main/java/com/fr/plugin/db/redis/RedisConnectionComponent.java @@ -2,6 +2,7 @@ package com.fr.plugin.db.redis; import com.fr.web.struct.Component; import com.fr.web.struct.browser.RequestClient; +import com.fr.web.struct.category.ParserType; import com.fr.web.struct.category.ScriptPath; import com.fr.web.struct.category.StylePath; @@ -9,11 +10,11 @@ public class RedisConnectionComponent extends Component { public static final RedisConnectionComponent KEY = new RedisConnectionComponent(); @Override public ScriptPath script(RequestClient req) { - return ScriptPath.build("com/fr/plugin/db/redis/web/redis.js"); + return ScriptPath.build("com/fr/plugin/db/redis/web/redis.js", ParserType.DYNAMIC); } @Override public StylePath style(RequestClient req) { - return StylePath.build("com/fr/plugin/db/redis/web/redis.css"); + return StylePath.build("com/fr/plugin/db/redis/web/redis.css", ParserType.DYNAMIC); } } \ No newline at end of file From a704a6c452d48dd50392b5fbe546af56889d7dc5 Mon Sep 17 00:00:00 2001 From: "Jimmy.Chai" Date: Mon, 29 Jun 2020 13:38:12 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/web/.npmrc | 1 + src/web/index.html | 7 +- src/web/package.json | 6 +- src/web/private/i18n.ts | 189 ++++++++++++++++++++++++++++++++++++++++ src/web/yarn.lock | 43 +++++++-- 5 files changed, 231 insertions(+), 15 deletions(-) create mode 100644 src/web/.npmrc diff --git a/src/web/.npmrc b/src/web/.npmrc new file mode 100644 index 0000000..21e56c3 --- /dev/null +++ b/src/web/.npmrc @@ -0,0 +1 @@ +@fui:registry=https://npm.fineres.com/ \ No newline at end of file diff --git a/src/web/index.html b/src/web/index.html index ae111f5..bb28e86 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -14,12 +14,12 @@ - - + diff --git a/src/web/package.json b/src/web/package.json index 439f620..e0512a3 100644 --- a/src/web/package.json +++ b/src/web/package.json @@ -7,9 +7,11 @@ "author": "alan", "license": "MIT", "dependencies": { + "@fui/materials": "^10.0.0", "@types/jss": "9.5.8", "autoprefixer": "^9.6.1", "es6-promise": "4.2.6", + "fineui": "^2.0.20200628140334", "fork-ts-checker-webpack-plugin": "^1.5.1", "jss": "9.8.7", "jss-plugin-global": "10.0.0-alpha.7", @@ -58,10 +60,6 @@ "webpack-dev-server": "3.7.2", "webpack-merge": "4.2.1" }, - "optionalDependencies": { - "fineui": "git+ssh://git@cloud.finedevelop.com:7999/visual/fineui.git", - "fineui-materials": "git+ssh://git@cloud.finedevelop.com:7999/fui/fineui-materials.git#release/10.0" - }, "scripts": { "dev": "cross-env NODE_ENV=mock webpack-dev-server -p --progress --config=webpack/webpack.dev.js --mode development --open", "build": "webpack -p --progress --config=webpack/webpack.prod.js --mode production", diff --git a/src/web/private/i18n.ts b/src/web/private/i18n.ts index 995b7a3..6249504 100644 --- a/src/web/private/i18n.ts +++ b/src/web/private/i18n.ts @@ -60,4 +60,193 @@ export const i18n = { 'Plugin-Redis_Parameter_Delete_Alert': '当前列表为空或者你没有选中任何项', 'Plugin-Redis_View': '视图', 'Plugin-Redis_Table': '表', + 'BI-Multi_Date_Quarter_End': '季度末', + 'BI-Multi_Date_Month_Begin': '月初', + 'BI-Multi_Date_YMD': '年月日', + 'BI-Custom_Color': '自定义颜色', + 'BI-Numerical_Interval_Input_Data': '请输入数值', + 'BI-Please_Input_Natural_Number': '请输入非负整数', + 'BI-No_More_Data': '无更多数据', + 'BI-Basic_Altogether': '共', + 'BI-Basic_Sunday': '星期日', + 'BI-Widget_Background_Colour': '组件背景', + 'BI-Color_Picker_Error_Text': '请输入0~255的正整数', + 'BI-Multi_Date_Month': '月', + 'BI-No_Selected_Item': '没有可选项', + 'BI-Multi_Date_Year_Begin': '年初', + 'BI-Quarter_1': '第1季度', + 'BI-Quarter_2': '第2季度', + 'BI-Quarter_3': '第3季度', + 'BI-Quarter_4': '第4季度', + 'BI-Multi_Date_Year_Next': '年后', + 'BI-Multi_Date_Month_Prev': '个月前', + 'BI-Month_Trigger_Error_Text': '请输入1~12的正整数', + 'BI-Less_And_Equal': '小于等于', + 'BI-Year_Trigger_Invalid_Text': '请输入有效时间', + 'BI-Multi_Date_Week_Next': '周后', + 'BI-Font_Size': '字号', + 'BI-Basic_Total': '共', + 'BI-Already_Selected': '已选择', + 'BI-Formula_Insert': '插入', + 'BI-Select_All': '全选', + 'BI-Basic_Tuesday': '星期二', + 'BI-Multi_Date_Month_End': '月末', + 'BI-Load_More': '点击加载更多数据', + 'BI-Basic_September': '九月', + 'BI-Current_Is_Last_Page': '当前已是最后一页', + 'BI-Basic_Auto': '自动', + 'BI-Basic_Count': '个', + 'BI-Basic_Value': '值', + 'BI-Basic_Unrestricted': '无限制', + 'BI-Quarter_Trigger_Error_Text': '请输入1~4的正整数', + 'BI-Basic_More': '更多', + 'BI-Basic_Wednesday': '星期三', + 'BI-Basic_Bold': '加粗', + 'BI-Basic_Simple_Saturday': '六', + 'BI-Multi_Date_Month_Next': '个月后', + 'BI-Basic_March': '三月', + 'BI-Current_Is_First_Page': '当前已是第一页', + 'BI-Basic_Thursday': '星期四', + 'BI-Basic_Prompt': '提示', + 'BI-Multi_Date_Today': '今天', + 'BI-Multi_Date_Quarter_Prev': '个季度前', + 'BI-Row_Header': '行表头', + 'BI-Date_Trigger_Error_Text': '日期格式示例:2015-3-11', + 'BI-Basic_Cancel': '取消', + 'BI-Basic_January': '一月', + 'BI-Basic_June': '六月', + 'BI-Basic_July': '七月', + 'BI-Basic_April': '四月', + 'BI-Multi_Date_Quarter_Begin': '季度初', + 'BI-Multi_Date_Week': '周', + 'BI-Click_Blank_To_Select': '点击\\空格键\\选中完全匹配项', + 'BI-Basic_August': '八月', + 'BI-Word_Align_Left': '文字居左', + 'BI-Basic_November': '十一月', + 'BI-Font_Colour': '字体颜色', + 'BI-Multi_Date_Day_Prev': '天前', + 'BI-Select_Part': '部分选择', + 'BI-Multi_Date_Day_Next': '天后', + 'BI-Less_Than': '小于', + 'BI-Basic_February': '二月', + 'BI-Multi_Date_Year': '年', + 'BI-Number_Index': '序号', + 'BI-Multi_Date_Week_Prev': '周前', + 'BI-Next_Page': '下一页', + 'BI-Right_Page': '向右翻页', + 'BI-Numerical_Interval_Signal_Value': '前后值相等,请将操作符改为“≤”', + 'BI-Basic_December': '十二月', + 'BI-Basic_Saturday': '星期六', + 'BI-Basic_Simple_Wednesday': '三', + 'BI-Multi_Date_Quarter_Next': '个季度后', + 'BI-Basic_October': '十月', + 'BI-Basic_Simple_Friday': '五', + 'BI-Basic_Save': '保存', + 'BI-Numerical_Interval_Number_Value': '请保证前面的数值小于/等于后面的数值', + 'BI-Previous_Page': '上一页', + 'BI-No_Select': '搜索结果为空', + 'BI-Basic_Clears': '清空', + 'BI-Created_By_Me': '我创建的', + 'BI-Basic_Simple_Tuesday': '二', + 'BI-Word_Align_Right': '文字居右', + 'BI-Summary_Values': '汇总', + 'BI-Basic_Clear': '清除', + 'BI-Upload_File_Size_Error': '文件大小不支持', + 'BI-Up_Page': '向上翻页', + 'BI-Basic_Simple_Sunday': '日', + 'BI-Multi_Date_Relative_Current_Time': '相对当前时间', + 'BI-Selected_Data': '已选数据:', + 'BI-Multi_Date_Quarter': '季度', + 'BI-Check_Selected': '查看已选', + 'BI-Basic_Search': '搜索', + 'BI-Basic_May': '五月', + 'BI-Continue_Select': '继续选择', + 'BI-Please_Input_Positive_Integer': '请输入正整数', + 'BI-Upload_File_Type_Error': '文件类型不支持', + 'BI-Upload_File_Error': '文件上传失败', + 'BI-Basic_Friday': '星期五', + 'BI-Down_Page': '向下翻页', + 'BI-Basic_Monday': '星期一', + 'BI-Left_Page': '向左翻页', + 'BI-Transparent_Color': '透明', + 'BI-Basic_Simple_Monday': '一', + 'BI-Multi_Date_Year_End': '年末', + 'BI-Time_Interval_Error_Text': '请保证开始时间早于/等于结束时间', + 'BI-Basic_Time': '时间', + 'BI-Basic_OK': '确定', + 'BI-Basic_Sure': '确定', + 'BI-Basic_Simple_Thursday': '四', + 'BI-Multi_Date_Year_Prev': '年前', + 'BI-Tiao_Data': '条数据', + 'BI-Basic_Italic': '斜体', + 'BI-Basic_Dynamic_Title': '动态时间', + 'BI-Basic_Year': '年', + 'BI-Basic_Single_Quarter': '季', + 'BI-Basic_Month': '月', + 'BI-Basic_Week': '周', + 'BI-Basic_Day': '天', + 'BI-Basic_Work_Day': '工作日', + 'BI-Basic_Front': '前', + 'BI-Basic_Behind': '后', + 'BI-Basic_Empty': '空', + 'BI-Basic_Month_End': '月末', + 'BI-Basic_Month_Begin': '月初', + 'BI-Basic_Year_End': '年末', + 'BI-Basic_Year_Begin': '年初', + 'BI-Basic_Quarter_End': '季末', + 'BI-Basic_Quarter_Begin': '季初', + 'BI-Basic_Week_End': '周末', + 'BI-Basic_Week_Begin': '周初', + 'BI-Basic_Current_Day': '当天', + 'BI-Basic_Begin_Start': '初', + 'BI-Basic_End_Stop': '末', + 'BI-Basic_Current_Year': '今年', + 'BI-Basic_Year_Fen': '年份', + 'BI-Basic_Current_Month': '本月', + 'BI-Basic_Current_Quarter': '本季度', + 'BI-Basic_Year_Month': '年月', + 'BI-Basic_Year_Quarter': '年季度', + 'BI-Basic_Input_Can_Not_Null': '输入框不能为空', + 'BI-Basic_Date_Time_Error_Text': '日期格式示例:2015-3-11 00:00:00', + 'BI-Basic_Input_From_To_Number': '请输入{R1}的数值', + 'BI-Basic_Or': '或', + 'BI-Basic_And': '且', + 'BI-Conf_Add_Formula': '添加公式', + 'BI-Conf_Add_Condition': '添加条件', + 'BI-Conf_Formula_And': '且公式条件', + 'BI-Conf_Formula_Or': '或公式条件', + 'BI-Conf_Condition_And': '且条件', + 'BI-Conf_Condition_Or': '或条件', + 'BI-Microsoft_YaHei': '微软雅黑', + 'BI-Apple_Light': '苹方-light', + 'BI-Font_Family': '字体', + 'BI-Basic_Please_Input_Content': '请输入内容', + 'BI-Word_Align_Center': '文字居中', + 'BI-Basic_Please_Enter_Number_Between': '请输入{R1}-{R2}的值', + 'BI-More_Than': '大于', + 'BI-More_And_Equal': '大于等于', + 'BI-Please_Enter_SQL': '请输入SQL', + 'BI-Basic_Click_To_Add_Text': '+点击新增\\{R1}\\', + 'BI-Basic_Please_Select': '请选择', + 'BI-Basic_Font_Color': '文字颜色', + 'BI-Basic_Background_Color': '背景色', + 'BI-Basic_Underline': '下划线', + 'BI-Basic_Param_Month': '{R1}月', + 'BI-Basic_Param_Day': '{R1}日', + 'BI-Basic_Param_Quarter': '{R1}季度', + 'BI-Basic_Param_Week_Count': '第{R1}周', + 'BI-Basic_Param_Hour': '{R1}时', + 'BI-Basic_Param_Minute': '{R1}分', + 'BI-Basic_Param_Second': '{R1}秒', + 'BI-Basic_Param_Year': '{R1}年', + 'BI-Basic_Date_Day': '日', + 'BI-Basic_Hour_Sin': '时', + 'BI-Basic_Seconds': '秒', + 'BI-Basic_Minute': '分', + 'BI-Basic_Wan': '万', + 'BI-Basic_Million': '百万', + 'BI-Basic_Billion': '亿', + 'BI-Basic_Quarter': '季度', + 'BI-Basic_No_Select': '不选', + 'BI-Basic_Now': '此刻', }; diff --git a/src/web/yarn.lock b/src/web/yarn.lock index c31b713..c8e97e6 100644 --- a/src/web/yarn.lock +++ b/src/web/yarn.lock @@ -724,6 +724,14 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@fui/materials@^10.0.0": + version "10.0.0" + resolved "https://npm.fineres.com/@fui%2fmaterials/-/materials-10.0.0.tgz#816187a3c287f59e4f7e404f3b9f7f041aa424a4" + integrity sha512-yQvAR8yfnnnFPu9UEdlfx15bO/GVtrppOvbp/kJPPFW+MnW8fQ60WYAnIPjzLLu0LxNRsucvsKDAiYAUFWVwIA== + dependencies: + "@types/codemirror" "0.0.77" + codemirror "5.42.2" + "@jest/console@^24.7.1": version "24.7.1" resolved "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" @@ -903,6 +911,18 @@ dependencies: "@babel/types" "^7.3.0" +"@types/codemirror@0.0.77": + version "0.0.77" + resolved "https://registry.npm.taobao.org/@types/codemirror/download/@types/codemirror-0.0.77.tgz#6785a0183b4aea147de650530259ebf2a511bde9" + integrity sha1-Z4WgGDtK6hR95lBTAlnr8qURvek= + dependencies: + "@types/tern" "*" + +"@types/estree@*": + version "0.0.45" + resolved "https://registry.npm.taobao.org/@types/estree/download/@types/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" + integrity sha1-6Th1cpmOXs2sIhlQ2rPow7Fq+IQ= + "@types/events@*": version "3.0.0" resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -977,6 +997,13 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/tern@*": + version "0.23.3" + resolved "https://registry.npm.taobao.org/@types/tern/download/@types/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460" + integrity sha1-S1RTjwSojJ/3neH2+U9XWn8zlGA= + dependencies: + "@types/estree" "*" + "@types/yargs@^12.0.2", "@types/yargs@^12.0.9": version "12.0.12" resolved "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" @@ -2099,6 +2126,11 @@ code-point-at@^1.0.0: resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codemirror@5.42.2: + version "5.42.2" + resolved "https://registry.npm.taobao.org/codemirror/download/codemirror-5.42.2.tgz?cache=0&sync_timestamp=1592745428423&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcodemirror%2Fdownload%2Fcodemirror-5.42.2.tgz#801ab715a7a7e1c7ed4162b78e9d8138b98de8f0" + integrity sha1-gBq3Faen4cftQWK3jp2BOLmN6PA= + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3449,13 +3481,10 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -"fineui-materials@git+ssh://git@cloud.finedevelop.com:7999/fui/fineui-materials.git#release/10.0": - version "1.0.0" - resolved "git+ssh://git@cloud.finedevelop.com:7999/fui/fineui-materials.git#1a5c8beb09f741ff24758b6f4fb64107f643015f" - -"fineui@git+ssh://git@cloud.finedevelop.com:7999/visual/fineui.git": - version "1.1.2" - resolved "git+ssh://git@cloud.finedevelop.com:7999/visual/fineui.git#3e28b67ed0fb06e5754c3cba46b1c14d55df6436" +fineui@^2.0.20200628140334: + version "2.0.20200628140334" + resolved "https://registry.npm.taobao.org/fineui/download/fineui-2.0.20200628140334.tgz#9280889789402c8f731792279eeb6e43d95e6bdb" + integrity sha1-koCIl4lALI9zF5InnutuQ9lea9s= flat-cache@^2.0.1: version "2.0.1" From 0d7c7f6deb6cb02c057068535dc4d22bd186c48a Mon Sep 17 00:00:00 2001 From: "Jimmy.Chai" Date: Tue, 30 Jun 2020 17:47:25 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=94=AE=E5=80=BC=E6=8C=89=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/web/private/i18n.ts | 5 +++ src/web/src/index.edit.ts | 4 +-- src/web/src/modules/crud/crud.request.ts | 3 +- .../modules/table_list/table_list.model.ts | 6 ++-- src/web/src/modules/table_list/table_list.ts | 32 +++++++++++++++++-- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/web/private/i18n.ts b/src/web/private/i18n.ts index b619fe3..c47cf86 100644 --- a/src/web/private/i18n.ts +++ b/src/web/private/i18n.ts @@ -9,7 +9,12 @@ export const i18n = { 'Plugin-Redis_Help': '帮助文档', 'Plugin-Redis_Keys_Pattern': '键值的正则表达式', 'Plugin-Redis_Keys_Pattern_Search': '搜索', + 'Plugin-Redis_Set_Parameter': '参数', + 'Plugin-Redis_Set_Parameter_Name': '参数名', + 'Plugin-Redis_Set_Parameter_Type': '参数类型', + 'Plugin-Redis_Set_Parameter_Value': '参数值', 'Plugin-Redis_DB_Index': '数据库编号', + 'Plugin-Redis_Index': '编号', 'Plugin-Redis_Preview': '预览', 'Plugin-Redis_Refresh': '刷新', 'Plugin-Redis_Formula': '公式', diff --git a/src/web/src/index.edit.ts b/src/web/src/index.edit.ts index 0f8a090..a57adf0 100644 --- a/src/web/src/index.edit.ts +++ b/src/web/src/index.edit.ts @@ -1,6 +1,6 @@ -import { RedisEdit } from './modules/app.edit'; +import { TableList } from './modules/table_list/table_list'; BI.createWidget({ - type: RedisEdit.xtype, + type: TableList.xtype, element: '#wrapper', }); diff --git a/src/web/src/modules/crud/crud.request.ts b/src/web/src/modules/crud/crud.request.ts index cfa4471..6860d2a 100644 --- a/src/web/src/modules/crud/crud.request.ts +++ b/src/web/src/modules/crud/crud.request.ts @@ -4,10 +4,11 @@ export function getConnectionlist(): Promise<{data?: Connection[]}> { return requestGet('/v10/config/connection/list'); } -export function getTableList(database: string, pattern = ''): Promise { +export function getTableList(database: string, pattern = '', orderValue: string | number): Promise { return requestGet('plugin/private/com.fr.solution.plugin.db.redis.v10/redis/keys', { database, pattern, + orderValue, }); } diff --git a/src/web/src/modules/table_list/table_list.model.ts b/src/web/src/modules/table_list/table_list.model.ts index d69a462..963d360 100644 --- a/src/web/src/modules/table_list/table_list.model.ts +++ b/src/web/src/modules/table_list/table_list.model.ts @@ -9,6 +9,7 @@ export class TableModelModel extends Model { connections: [] as string[], tables: [] as string[], search: '', + orderValue: '', selectedConnection: '', }; } @@ -21,15 +22,16 @@ export class TableModelModel extends Model { }, initTableList: () => { if (this.model.selectedConnection) { - getTableList(this.model.selectedConnection, this.model.search).then(re => { + getTableList(this.model.selectedConnection, this.model.search, this.model.orderValue).then(re => { this.model.tables = re ? re : []; }); } else { this.model.tables = []; } }, - setSearch(value: string) { + setSearch(value: string, orderValue: string | number) { this.model.search = value; + this.model.orderValue = orderValue; }, setSelectedConnection(name: string) { this.model.selectedConnection = name; diff --git a/src/web/src/modules/table_list/table_list.ts b/src/web/src/modules/table_list/table_list.ts index af4b383..5d8bcc0 100644 --- a/src/web/src/modules/table_list/table_list.ts +++ b/src/web/src/modules/table_list/table_list.ts @@ -1,8 +1,9 @@ import { shortcut, store } from '@core/core'; -import { VtapeXtype, HtapeXtype, IconButtonXtype, TextValueComboXtype, ButtonXtype, TextEditorXtype, ButtonGroupXtype, VerticalXtype } from 'ui'; +import { VtapeXtype, HtapeXtype, LabelXtype, IconButtonXtype, TextValueComboXtype, ButtonXtype, TextEditorXtype, ButtonGroupXtype, VerticalXtype } from 'ui'; import { ListItem } from './list_item'; import { TableModelModel } from './table_list.model'; import { fineServletURL } from '@constants/env'; +import { DatabaseIndex } from '../components/database_index/database_index'; @shortcut() @store(TableModelModel) @@ -12,12 +13,18 @@ export class TableList extends BI.Widget { store: TableModelModel['store'] model: TableModelModel['model'] + databaseIndex: DatabaseIndex; buttonGroup: any; connectionTextValue: any; searchText: any; props = { database: '', + value: { + datasetData: { + orderValue: 0, + }, + }, } watch = { @@ -27,7 +34,7 @@ export class TableList extends BI.Widget { this.connectionTextValue.setValue(name); this.store.setSelectedConnection(name); }, - 'selectedConnection || search': () => { + 'selectedConnection || search || orderValue': () => { this.store.initTableList(); }, tables: (tables: string[]) => { @@ -36,6 +43,9 @@ export class TableList extends BI.Widget { } render() { + const { orderValue = 0 } = this.options.value.datasetData || {}; + const inputType = typeof orderValue === 'string' ? 'formula' : 'int'; + return { type: VtapeXtype, hgap: 10, @@ -83,6 +93,22 @@ export class TableList extends BI.Widget { el: { type: HtapeXtype, items: [{ + el: { + type: LabelXtype, + text: BI.i18nText('Plugin-Redis_Index'), + textAlign: 'left', + }, + width: 24, + }, { + type: DatabaseIndex.xtype, + value: orderValue, + inputType, + ref: (_ref: any) => { + this.databaseIndex = _ref; + }, + width: 24, + height: 22, + }, { type: TextEditorXtype, height: 24, watermark: BI.i18nText('Plugin-Redis_Keys_Pattern'), @@ -95,7 +121,7 @@ export class TableList extends BI.Widget { minWidth: 50, text: BI.i18nText('Plugin-Redis_Keys_Pattern_Search'), handler: () => { - this.store.setSearch(this.searchText.getValue()); + this.store.setSearch(this.searchText.getValue(), this.databaseIndex.getValue()); }, }, width: 50, From f85211619d427da8a9d049c2e50bcf683799a99f Mon Sep 17 00:00:00 2001 From: "Jimmy.Chai" Date: Tue, 30 Jun 2020 17:49:04 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=94=AE=E5=80=BC=E6=8C=89=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/db/redis/action/SearchKeysAction.java | 5 +++-- .../plugin/db/redis/locale/redis_en_US.properties | 5 +++++ .../plugin/db/redis/locale/redis_zh_CN.properties | 5 +++++ .../resources/com/fr/plugin/db/redis/web/redis.js | 14 +++++++++++--- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/fr/plugin/db/redis/action/SearchKeysAction.java b/src/main/java/com/fr/plugin/db/redis/action/SearchKeysAction.java index 29e13da..876c269 100644 --- a/src/main/java/com/fr/plugin/db/redis/action/SearchKeysAction.java +++ b/src/main/java/com/fr/plugin/db/redis/action/SearchKeysAction.java @@ -40,10 +40,11 @@ public class SearchKeysAction extends BaseHttpHandler { String[] keys = new String[0]; String pattern = request.getParameter("pattern"); String connectionName = request.getParameter("database"); - if (StringKit.isNotEmpty(pattern) && StringKit.isNotEmpty(connectionName)) { + String orderValue = request.getParameter("orderValue"); + if (StringKit.isNotEmpty(pattern) && StringKit.isNotEmpty(connectionName) && StringKit.isNotEmpty(orderValue)) { Connection connection = ConnectionKit.getConnection(connectionName); if (connection instanceof RedisDatabaseConnection) { - keys = connection.summary(pattern); + keys = connection.summary(pattern, orderValue); } } FlushKit.printAsJSON(response, JSONFactory.createJSON(Arrays.asList(keys))); diff --git a/src/main/resources/com/fr/plugin/db/redis/locale/redis_en_US.properties b/src/main/resources/com/fr/plugin/db/redis/locale/redis_en_US.properties index 9267e27..c41c0c8 100755 --- a/src/main/resources/com/fr/plugin/db/redis/locale/redis_en_US.properties +++ b/src/main/resources/com/fr/plugin/db/redis/locale/redis_en_US.properties @@ -39,3 +39,8 @@ Plugin-Redis_Cluster_Config_Description=Input multiple hosts with commas separat Plugin-Redis_Script_Engine_Type=Script Engine Type Plugin-Redis_Script_Engine_Type_Default=Default Plugin-Redis_Script_Engine_Type_V8=V8 +Plugin-Redis_Index=Index +Plugin-Redis_Set_Parameter=Parameter +Plugin-Redis_Set_Parameter_Name=Parameter Name +Plugin-Redis_Set_Parameter_Type=Parameter Type +Plugin-Redis_Set_Parameter_Value=Parameter Value \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties b/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties index 0bdca1f..72177b7 100755 --- a/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties +++ b/src/main/resources/com/fr/plugin/db/redis/locale/redis_zh_CN.properties @@ -60,3 +60,8 @@ Plugin-Redis_Parameter_Delete_Confirm=\u4F60\u786E\u5B9A\u51B3\u5B9A\u5220\u9664 Plugin-Redis_Parameter_Delete_Alert=\u5F53\u524D\u5217\u8868\u4E3A\u7A7A\u6216\u8005\u4F60\u6CA1\u6709\u9009\u4E2D\u4EFB\u4F55\u9879 Plugin-Redis_View=\u89C6\u56FE Plugin-Redis_Table=\u8868 +Plugin-Redis_Index=\u7f16\u53f7 +Plugin-Redis_Set_Parameter=\u53c2\u6570 +Plugin-Redis_Set_Parameter_Name=\u53c2\u6570\u540d +Plugin-Redis_Set_Parameter_Type=\u53c2\u6570\u7c7b\u578b +Plugin-Redis_Set_Parameter_Value=\u53c2\u6570\u503c \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/db/redis/web/redis.js b/src/main/resources/com/fr/plugin/db/redis/web/redis.js index 2c0e9b6..38ec51b 100644 --- a/src/main/resources/com/fr/plugin/db/redis/web/redis.js +++ b/src/main/resources/com/fr/plugin/db/redis/web/redis.js @@ -1,15 +1,23 @@ -/*! time: 2019-11-12 11:24:08 */!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var o=n(3),i=n(16),a=Object.prototype.toString;function u(e){return"[object Array]"===a.call(e)}function c(e){return null!==e&&"object"===r(e)}function s(e){return"[object Function]"===a.call(e)}function l(e,t){if(null!=e)if("object"!==r(e)&&(e=[e]),u(e))for(var n=0,o=e.length;n=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){c.headers[e]=r.merge(i)})),e.exports=c}).call(this,n(2))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var c,s=[],l=!1,f=-1;function p(){l&&c&&(l=!1,c.length?s=c.concat(s):f=-1,s.length&&y())}function y(){if(!l){var e=u(p);l=!0;for(var t=s.length;t;){for(c=s,s=[];++f1)for(var n=1;n=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],function(e){c.headers[e]={}}),r.forEach(["post","put","patch"],function(e){c.headers[e]=r.merge(i)}),e.exports=c}).call(this,n(2))},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var c,s=[],l=!1,f=-1;function p(){l&&c&&(l=!1,c.length?s=c.concat(s):f=-1,s.length&&y())}function y(){if(!l){var e=u(p);l=!0;for(var t=s.length;t;){for(c=s,s=[];++f1)for(var n=1;n * @license MIT */ -e.exports=function(e){return null!=e&&(n(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&n(e.slice(0,0))}(e)||!!e._isBuffer)}},function(e,t,n){"use strict";var r=n(1),o=n(0),i=n(26),a=n(27);function u(e){this.defaults=e,this.interceptors={request:new i,response:new i}}u.prototype.request=function(e){"string"==typeof e&&(e=o.merge({url:arguments[0]},arguments[1])),(e=o.merge(r,{method:"get"},this.defaults,e)).method=e.method.toLowerCase();var t=[a,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)n=n.then(t.shift(),t.shift());return n},o.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,n){return this.request(o.merge(n||{},{method:e,url:t}))}})),o.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,n,r){return this.request(o.merge(r||{},{method:e,url:t,data:n}))}})),e.exports=u},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},function(e,t,n){"use strict";var r=n(5);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e}},function(e,t,n){"use strict";var r=n(0);function o(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(r.isURLSearchParams(t))i=t.toString();else{var a=[];r.forEach(t,(function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+"="+o(e))})))})),i=a.join("&")}return i&&(e+=(-1===e.indexOf("?")?"?":"&")+i),e}},function(e,t,n){"use strict";var r=n(0),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,a={};return e?(r.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(a[t]&&o.indexOf(t)>=0)return;a[t]="set-cookie"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+", "+n:n}})),a):a}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function o(){this.message="String contains an invalid character"}o.prototype=new Error,o.prototype.code=5,o.prototype.name="InvalidCharacterError",e.exports=function(e){for(var t,n,i=String(e),a="",u=0,c=r;i.charAt(0|u)||(c="=",u%1);a+=c.charAt(63&t>>8-u%1*8)){if((n=i.charCodeAt(u+=.75))>255)throw new o;t=t<<8|n}return a}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,a){var u=[];u.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&u.push("expires="+new Date(n).toGMTString()),r.isString(o)&&u.push("path="+o),r.isString(i)&&u.push("domain="+i),!0===a&&u.push("secure"),document.cookie=u.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";var r=n(0);function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(28),i=n(6),a=n(1),u=n(29),c=n(30);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.baseURL&&!u(e.url)&&(e.url=c(e.baseURL,e.url)),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||a.adapter)(e).then((function(t){return s(e),t.data=o(t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(s(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t,n){return r.forEach(n,(function(n){e=n(e,t)})),e}},function(e,t,n){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t,n){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(7);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return function(n){return function(n){function r(){return i(this,r),c(this,l(r).apply(this,arguments))}return f(r,n),u(r,[{key:"_store",value:function(){var n=t.props?t.props.apply(this):void 0;return BI.Models.getModel(e.xtype,n)}}]),r}(n)}}n.r(t);var b,h,g,v=function(e){function t(){var e,n;i(this,t);for(var r=arguments.length,a=new Array(r),u=0;u0&&void 0!==u[0]?u[0]:{},n=t.url,r=t.type,o=t.headers,i=t.data,a=t.params,e.abrupt("return",vt.a.request({url:n,baseURL:Tt,method:r,headers:Et({},At,{},o,{Authorization:"Bearer ".concat(Pt("fine_auth_token")),"Content-Type":"application/json;charset=UTF-8"}),params:a,paramsSerializer:wt,data:i}).then(It).catch((function(e){console.log(e)})));case 3:case"end":return e.stop()}}),e)})),(Rt=function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){xt(i,r,o,a,u,"next",e)}function u(e){xt(i,r,o,a,u,"throw",e)}a(void 0)}))}).apply(this,arguments)}function Dt(e){return St({url:e,type:"GET",params:Et({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{_:(new Date).getTime()})})}var Nt,Ct,jt,Bt={vars:[{text:"$$page_number",value:"$$page_number",type:"VARS",def:"当前的页数。"},{text:"$$totalPage_number",value:"$$totalPage_number",type:"VARS",def:"总页数。"}],JSONs:[{def:"ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。",name:"ABS",type:"MATH"},{def:"ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。",name:"ABS",type:"COMMON"},{def:"acc_sum(x_agg(array),range)根据横纵轴或行列维度添加的字段对指标进行跨行累计的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行累计,1为对组内所有行进行累计示例:acc_sum(sum_agg(array),0)用户横轴轴拖拽销售日期(年分组),则该指标计算结果为,根据销售日期(年)对销量进行分组汇总,然后根据对所有行从上到下进行累加,获得每年的累计销量",name:"ACC_SUM",type:"TABLE_CAL"},{def:"ACOS(number): 返回指定数值的反余弦值。反余弦值为一个角度,返回角度以弧度形式表示。Number:需要返回角度的余弦值。备注: 函数的参数必须在-1和1之间,包括-1和1。 返回的角度值在0和Pi之间。 如果要把返回的角度用度数来表示,用180/PI()乘返回值即可。示例:ACOS(1)等于0(弧度)。ACOS(0.5)等于1.047197551(Pi/3弧度)。ACOS(0.5)*180/PI()等于60(度)。",name:"ACOS",type:"MATH"},{def:"AND(logical1,logical2,…): 当所有参数的值为真时,返回TRUE;当任意参数的值为假时,返回FALSE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:AND(1+7=8,5+7=12)等于TRUE。AND(1+7=8,5+7=11)等于FALSE。如果单元格A1到A4的值分别为TRUE、TRUE、FALSE和TRUE,则:AND(A1:A4)等于FALSE。如果单元格A5的值在0~50之间,则: AND(0 0,b > 0 or a > 0, b < 0时,公式直接成立;a < 0,b > 0, ATAN2(a,b)=PI()-ABS(ATAN(b/a))a < 0,b < 0, ATAN2(a,b)=ABS(ATAN(b/a))-PI() 当x_num与y_num都为0时,ATAN2返回错误信息*DIV/0!。 用角度制显示返回数值时,把返回数值乘以180/PI()。 返回值以弧度表示(返回值大于-pi且小于等于pi)。示例:ATAN2(-2,2)等于2.356194490192345(弧度制的3*pi/4)。ATAN2(2,2)等于0.785398163(弧度制的pi/4)。ATAN2(-2,2)*180/PI()等于135(角度制)。",name:"ATAN2",type:"MATH"},{def:"AVG_AGG(array): 根据当前分析维度,动态返回指标字段的汇总平均值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。 \n 示例:用户横轴为维度字段'日'时,纵轴的计算字段AVG_AGG(销量)返回的值为每日的平均销量;当用户横轴为维度字段'月'时,AVG_AGG(销量)返回的值为每月的平均销量。",name:"AVG_AGG",type:"AGG"},{def:"CEILING(number): 将参数number沿绝对值增大的方向,舍入为最接近的整数Number:指待舍入的数值。CEILING(-2.5)等于-3。CEILING(0.5)等于1。",name:"CEILING",type:"MATH"},{def:"CHAR(number): 根据指定数字返回对应的字符。CHAR函数可将计算机其他类型的数字代码转换为字符。Number:用于指定字符的数字,介于1~65535之间(包括1和65535)。示例:CHAR(88)等于“X”。CHAR(45)等于“-”。",name:"CHAR",type:"TEXT"},{def:'CODE(text): 计算文本串中第一个字符的数字代码。返回的代码对应于计算机使用的字符集。Text:需要计算第一个字符代码的文本或单元格引用。示例:CODE("S")等于83。CODE("Spreadsheet")等于83。',name:"CODE",type:"TEXT"},{def:'CONCATENATE(text1,text2,...): 将数个字符串合并成一个字符串。Text1,text2,...:需要合并成单个文本的文本项,可以是字符,数字或是单元格引用。示例:CONCATENATE("Average ","Price")等于“Average Price”。CONCATENATE("1","2")等于12。',name:"CONCATENATE",type:"TEXT"},{def:"COS(number): 返回一个角度的余弦值。Number:以弧度表示的需要求余弦值的角度。备注: 要把一个角度转换成弧度值,将角度乘于PI()/180。 COS(n*2*PI()+number)=COS(number)(其中n为整数,number从-pi到pi)。示例:COS(0.5)等于0.877582562。COS(30*PI()/180)等于0.866025404。",name:"COS",type:"MATH"},{def:"COUNTD_AGG(array): 根据当前分析维度,动态返回某字段的去重计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段COUNTD_AGG(销量)返回的值为每日的销量的去重个数;当用户横轴为维度字段'月'时,COUNTD_AGG(销量)返回的值为每月的销量的去重个数。\"",name:"COUNTD_AGG",type:"AGG"},{def:"COUNT_AGG(array): 根据当前分析维度,动态返回某字段的计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段'日'时,纵轴的计算字段COUNT_AGG(销量)返回的值为每日的销量的个数;当用户横轴为维度字段'月'时,COUNT_AGG(销量)返回的值为每月的销量的个数。",name:"COUNT_AGG",type:"AGG"},{def:"DATE(year,month,day): 返回一个表示某一特定日期的系列数。Year:代表年,可为一到四位数。Month:代表月份。若1 month 12,则函数把参数值作为月。若month>12,则函数从年的一月份开始往上累加。例如: DATE(2000,25,2)等于2002年1月2日的系列数。Day:代表日。若日期小于等于某指定月的天数,则函数将此参数值作为日。若日期大于某指定月的天数,则函数从指定月份的第一天开始往上累加。若日期大于两个或多个月的总天数,则函数把减去两个月或多个月的余数加到第三或第四个月上,依此类推。例如:DATE(2000,3,35)等于2000年4月4日的系列数。备注: 若需要处理公式中日期的一部分,如年或月等,则可用此公式。 若年,月和日是函数而不是函数中的常量,则此公式最能体现其作用。示例:DATE(1978, 9, 19) 等于1978-09-19.DATE(1211, 12, 1) 等于1211-12-01. ",name:"DATE",type:"DATETIME"},{def:'DATEDELTA(date, deltadays):返回一个日期date后deltadays的日期。deltaDays可以为正值,负值,零。示例:DATEDELTA("2008-08-08", -10)等于2008-07-29。DATEDELTA("2008-08-08", 10)等于2008-08-18。',name:"DATEDELTA",type:"DATETIME"},{def:'DATEDIF(start_date,end_date,unit):返回两个指定日期间的天数、月数或年数。Start_date:代表所指定时间段的初始日期。End_date:代表所指定时间段的终止日期。Unit:函数返回信息的类型。若unit=“Y”,则DATEDIF返回指定时间段的年差数。若unit=“M”,则DATEDIF返回指定时间段的月差数。若unit=“D”,则DATEDIF返回指定时间段的日差数。若unit=“MD”,则DATEDIF忽略年和月,返回指定时间段的日差数。若unit=“YM”,则DATEDIF忽略年和日,返回指定时间段的月差数。若unit=“YD”,则DATEDIF忽略年,返回指定时间段的日差数。示例:DATEDIF("2001/2/28","2004/3/20","Y")等于3,即在2001年2月28日与2004年3月20日之间有3个整年。DATEDIF("2001/2/28","2004/3/20","M")等于37,即在2001年2月28日与2004年3月20日之间有36个整月。DATEDIF("2001/2/28","2004/3/20","D")等于1116,即在2001年2月28日与2004年3月20日之间有1116个整天。DATEDIF("2001/2/28","2004/3/20","MD")等于8,即忽略月和年后,2001年2月28日与2004年3月20日的差为8天。DATEDIF("2001/1/28","2004/3/20","YM")等于2,即忽略日和年后,2001年1月28日与2004年3月20日的差为2个月。DATEDIF("2001/2/28","2004/3/20","YD")等于21,即忽略年后,2001年2月28日与2004年3月20日的差为21天。',name:"DATEDIF",type:"DATETIME"},{def:'DATESUBDATE(date1, date2, op):返回两个日期之间的时间差。op表示返回的时间单位:"s",以秒为单位。"m",以分钟为单位。"h",以小时为单位。"d",以天为单位。"w",以周为单位。示例:DATESUBDATE("2008-08-08", "2008-06-06","h")等于1512。',name:"DATESUBDATE",type:"DATETIME"},{def:'DATETONUMBER(date):返回自 1970 年 1 月 1 日 00:00:00 GMT 经过的毫秒数。示例:DATETONUMBER("2008-08-08")等于1218124800000。',name:"DATETONUMBER",type:"DATETIME"},{def:'DAY:(serial_number)返回日期中的日。DAY是介于1和31之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAY("2000/1/1")等于1。DAY("2006/05/05")等于5。DAY("1997/04/20")等于20。DAY("2000-1-1", "yyyy-MM-dd")等于1。DAY("2006-05-05", "yyyy-MM-dd")等于5。DAY("1997-04-20", "yyyy-MM-dd")等于20。DAY(35796)等于1。',name:"DAY",type:"DATETIME"},{def:'DAYS360(start_date,end_date,method):按照一年 360 天的算法(每个月以 30 天计,一年共计 12 个月),返回两日期间相差的天数,这在会计计算中将会用到。如果财务系统是基于一年 12 个月,每月 30 天,可用此函数帮助计算支付款项。Start_date 和 end_date :是用于计算期间天数的起止日期。Method : 它指定了在计算中是采用欧洲方法还是美国方法。Method 定义 :FALSE或忽略 美国方法 (NASD)。如果起始日期是一个月的 31 号,则等于同月的 30 号。如果终止日期是一个月的31号,并且起始日期早于 30 号,则终止日期等于下一个月的 1 号,否则,终止日期等于本月的 30 号。TRUE 欧洲方法。无论是起始日期还是终止日期为一个月的 31 号,都将等于本月的 30 号。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAYS360("1998/1/30", "1998/2/1") 等于 1',name:"DAYS360",type:"DATETIME"},{def:'DAYSOFMONTH(date):返回从1900年1月后某年某月包含的天数。示例:DAYSOFMONTH("1900-02-01")等于28。DAYSOFMONTH("2008/04/04")等于30。',name:"DAYSOFMONTH",type:"DATETIME"},{def:'DAYSOFQUARTER(date): 返回从1900年1月后某年某季度的天数。示例:DAYSOFQUARTER("2009-02-01")等于90。DAYSOFQUARTER("2009/05/05")等于91。',name:"DAYSOFQUARTER",type:"DATETIME"},{def:'DAYSOFYEAR(year):返回某年包含的天数。示例:DAYSOFYEAR(2008)等于365,等价于DAYSOFYEAR("2008-01-01")。',name:"DAYSOFYEAR",type:"DATETIME"},{def:'DAYVALUE(date):返回1900年至 date日期所经历的天数。示例:DAYVALUE("2008/08/08")等于39669。',name:"DAYVALUE",type:"DATETIME"},{def:"DEGREES(angle): 将弧度转化为度。angle:待转换的弧度角。示例:DEGREES(PI()/2)等于90。DEGREES(3.1415926)等于179.9999969。",name:"DEGREES",type:"MATH"},{def:'ENDWITH(str1,str2):判断字符串str1是否以str2结束。备注: str1和str2都是大小写敏感的。示例:ENDWITH("FineReport","Report")等于true。ENDWITH("FineReport","Fine")等于false。ENDWITH("FineReport","report")等于false。',name:"ENDWITH",type:"TEXT"},{def:'EXACT(text1,text2): 检测两组文本是否相同。如果完全相同,EXACT函数返回TRUE;否则,返回FALSE。EXACT函数可以区分大小写,但忽略格式的不同。同时也可以利用EXACT函数来检测输入文档的文字。Text1:需要比较的第一组文本。Text2:需要比较的第二组文本。示例:EXACT("Spreadsheet","Spreadsheet")等于TRUE。EXACT("Spreadsheet","S preadsheet")等于FALSE。EXACT("Spreadsheet","spreadsheet")等于FALSE。',name:"EXACT",type:"TEXT"},{def:"EXP(number): 返回e的n次幂。常数e为自然对数的底数,等于2.71828182845904。Number:为任意实数,作为常数e的指数。备注: 如果要返回其他常数作为底数的幂,可以使用指数运算符(^)。例如: 在4^2中,4是底数,而2是指数。 EXP函数与LN函数互为反函数。示例:EXP(0)等于1。EXP(3)等于20.08553692。EXP(LN(2))等于2。",name:"EXP",type:"MATH"},{def:"FACT(number):返回数的阶乘,一个数的阶乘等于 1*2*3*...*该数。number:要计算其阶乘的非负数。如果输入的 number 不是整数,则截尾取整。示例:FACT(1) 等于 1FACT(1.9) 等于 FACT(1) 等于 1FACT(0) 等于 1FACT(5) 等于 1*2*3*4*5 等于 120",name:"FACT",type:"MATH"},{def:'FIND(find_text,within_text,start_num):从指定的索引(start_num)处开始,返回第一次出现的指定子字符串(find_text)在此字符串(within_text)中的索引。Find_text:需要查找的文本或包含文本的单元格引用。Within_text:包含需要查找文本的文本或单元格引用。Start_num:指定进行查找字符的索引位置。within_text里的索引从1开始。如果省略start_num,则假设值为1。备注: 如果find_text不在within_text中,FIND函数返回值为0。 如果start_num不大于0,FIND函数返回错误信息*VALUE!。 如果start_num大于within_text的长度,FIND函数返回值为0。 如果find_text是空白文本,FIND函数将在搜索串中匹配第一个字符(即编号为start_num或1的字符)。示例:FIND("I","Information")等于1。FIND("i","Information")等于9。FIND("o","Information",2)等于4。FIND("o","Information",12)等于0。FIND("o","Information",-1)等于*VALUE!。',name:"FIND",type:"TEXT"},{def:"FLOOR(number): 将参数number沿绝对值减小的方向去尾舍入。Number:待舍入的数值。示例:FLOOR(-2.5)等于-2。FLOOR(2.5)等于2。",name:"FLOOR",type:"MATH"},{def:'FORMAT(object,format) : 返回object的format格式。object 需要被格式化对象,可以是String,数字,Object(常用的有Date, Time)。format 格式化的样式。示例FORMAT(1234.5, "#,##0.00") => 1234.50FORMAT(1234.5, "#,##0") => 1234FORMAT(1234.5, "¥#,##0.00") => ¥1234.50FORMAT(1.5, "0%") => 150%FORMAT(1.5, "0.000%") => 150.000%FORMAT(6789, "##0.0E0") => 6.789E3FORMAT(6789, "0.00E00") => 6.79E03FORMAT(date(2007,1,1), "EEEEE, MMMMM dd, yyyy") => 星期一,一月 01,2007FORMAT(date(2007,1,13), "MM/dd/yyyy") => 01/13/2007FORMAT(date(2007,1,13), "M-d-yy") => 1-13-07FORMAT(time(16,23,56), "h:mm:ss a") => 4:23:56 下午',name:"FORMAT",type:"TEXT"},{def:'HOUR(serial_number):返回某一指定时间的小时数。函数指定HOUR为0(0:00)到23(23:00)之间的一个整数。Serial_number:包含所求小时的时间。示例:HOUR("11:32:40")等于11。HOUR("11:32:40", "HH:mm:ss")等于11。',name:"HOUR",type:"DATETIME"},{def:'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first',name:"IF",type:"LOGIC"},{def:'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first',name:"IF",type:"COMMON"},{def:'INDEXOF(str1,index):返回字符串str1在index位置上的字符。备注: index是从0开始计数的。示例:INDEXOF("FineReport",0)等于\'F\'。INDEXOF("FineReport",2)等于\'n\'。INDEXOF("FineReport",9)等于\'t\'。INDEXOF(array, index):返回数组在index位置上的元素。备注: index是从1开始计数的。示例:String[] array = {"a", "b", "c"}INDEXOF(array, 1)等于"a".',name:"INDEXOF",type:"TEXT"},{def:"INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。",name:"INT",type:"MATH"},{def:"INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。",name:"INT",type:"COMMON"},{def:"ISNULL(object):判断对象中所有的值是否全部都是NULL或者为空字符串。",name:"ISNULL",type:"OTHER"},{def:'LEFT(text,num_chars): 根据指定的字符数返回文本串中的第一个或前几个字符。Text:包含需要选取字符的文本串或单元格引用。Num_chars:指定返回的字符串长度。备注: Num_chars的值必须等于或大于0。 如果num_chars大于整个文本的长度,LEFT函数将返回所有的文本。 如果省略num_chars,则默认值为1。示例:LEFT("Fine software",8)等于“Fine sof”。LEFT("Fine software")等于“F”。如果单元格A3中含有“China”,则LEFT(A3,2)等于“Ch”。',name:"LEFT",type:"TEXT"},{def:"LEN(args): 返回文本串中的字符数或者数组的长度。需要注意的是:参数args为文本串时,空格也计为字符。参数args为数组时,直接返回数组长度。示例:LEN(\"Evermore software\")等于17。LEN(\" \")等于1。LEN(['a','b'])等于2。",name:"LEN",type:"TEXT"},{def:"LN(number):返回一个数的自然对数。自然对数以常数项 e(2.71828182845904)为底。number:是用于计算其自然对数的正实数。示例:LN(86) 等于 4.45437LN(2.7182818) 等于 1LN(EXP(3)) 等于 3EXP(LN(4)) 等于 4",name:"LN",type:"MATH"},{def:"LOG(number,base): 按指定的任意底数,返回数值的对数。Number:需要求对数的正实数。Base:对数的底数。如果省略底数,默认值为10。示例:LOG(16,2)等于4。LOG(10)等于1。LOG(24,3)等于2.892789261。",name:"LOG",type:"MATH"},{def:"LOG10(number):返回以 10 为底的对数。number: 用于常用对数计算的正实数。示例:LOG10(86) 等于 1.934498451LOG10(10) 等于 1LOG10(1E5) 等于 5",name:"LOG10",type:"MATH"},{def:'LOWER(text): 将所有的大写字母转化为小写字母。Text:需要转化为小写字母的文本串。LOWER函数不转化文本串中非字母的字符。示例:LOWER("A.M.10:30")等于“a.m.10:30”。LOWER("China")等于“china”。',name:"LOWER",type:"TEXT"},{def:"LUNAR(year,day,month): 返回当前日期对应的农历时间。year,month,day:分别对应年月日。示例:如果需要查询2011年7月21日对应的农历时间,则只需输入LUNAR(2011,7,21)结果将显示为:辛卯年六月廿一同样,如输入LUNAR(2001,7,21),则显示:辛巳年六月初一 。本公式支持的时间段为1900-2100年。",name:"LUNAR",type:"DATETIME"},{def:"MAX(number1,number2,…): 返回参数列表中的最大值。Number1,number2,…:1到30个需要找出最大值的参数。备注: 参数可以是数字、空白单元格、逻辑值或数字的文本表达式。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。 如果参数中没有任何数字,MAX将返回0。示例:MAX(0.1,0,1.2)等于1.2。",name:"MAX",type:"MATH"},{def:"MAX_AGG(array): 根据当前分析维度,动态返回指标字段的最大值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MAX_AGG(销量)返回的值为每日的最大值销量;当用户横轴为维度字段'月'时,MAX_AGG(销量)返回的值为每月的最大值销量。",name:"MAX_AGG",type:"AGG"},{def:"MEDIAN_AGG(array): 根据当前分析维度,动态返回指标字段的中位数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MEDIAN_AGG(销量)返回的值为每日的中位数销量;当用户横轴为维度字段'月'时,MEDIAN_AGG(销量)返回的值为每月的中位数销量。",name:"MEDIAN_AGG",type:"AGG"},{def:'MID(text,start_num,num_chars): 返回文本串中从指定位置开始的一定数目的字符,该数目由用户指定。Text:包含要提取字符的文本串。Start_num:文本中需要提取字符的起始位置。文本中第一个字符的start_num为1,依此类推。Num_chars:返回字符的长度。备注: 如果start_num大于文本长度,MID函数返回“”(空文本)。 如果start_num小于文本长度,并且start_num加上num_chars大于文本长度,MID函数将从start_num指定的起始字符直至文本末的所有字符。 如果start_num小于1,MID函数返回错误信息*VALUE!。 如果num_chars是负数,MID函数返回错误信息*VALUE!。示例:MID("Finemore software",10,8)返回“software”。MID("Finemore software",30,5)返回“”(空文本)。MID("Finemore software",0,8)返回*VALUE!。MID("Finemore software",5,-1)返回*VALUE!。',name:"MID",type:"TEXT"},{def:"MIN(number1,number2,…): 返回参数列表中的最小值。Number1,number2,…:1到30个需要找出最小值的参数。备注: 若参数中没有数字,函数MIN将返回0。 参数应为数字、空白单元格、逻辑值或是表示数值的文本串。如果参数是错误值时,MIN将返回错误信息。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。示例:如果B1:B4包含3,6,9,12,则:MIN(B1:B4)等于3。MIN(B1:B4,0)等于0。",name:"MIN",type:"MATH"},{def:'MINUTE(serial_number):返回某一指定时间的分钟数,其值是介于0与59之间的一个整数。serial_number:包含所求分钟数的时间。示例:MINUTE("15:36:25")等于36。MINUTE("15:36:25", "HH:mm:ss")等于36。',name:"MINUTE",type:"DATETIME"},{def:"MIN_AGG(array): 根据当前分析维度,动态返回指标字段的最小值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MIN_AGG(销量)返回的值为每日的最小值销量;当用户横轴为维度字段'月'时,MIN_AGG(销量)返回的值为每月的最小值销量。",name:"MIN_AGG",type:"AGG"},{def:"MOD(number,divisor):返回两数相除的余数。结果的正负号与除数相同。number:为被除数。divisor:为除数。示例:MOD(3, 2) 等于 1MOD(-3, 2) 等于 1MOD(3, -2) 等于 -1MOD(-3, -2) 等于 -1",name:"MOD",type:"MATH"},{def:'MONTH:(serial_number)返回日期中的月。月是介于1和12之间的一个数。Serial_number:含有所求的月的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:MONTH("2000/1/1")等于1。MONTH("2006/05/05")等于5。MONTH("1997/04/20")等于4。MONTH("2000-1-1", "yyyy-MM-dd")等于1。MONTH("2006-05-05", "yyyy-MM-dd")等于5。MONTH("1997-04-20", "yyyy-MM-dd")等于4。MONTH(35796)等于1。',name:"MONTH",type:"DATETIME"},{def:'MONTHDELTA(date,delta):返回指定日期date后delta个月的日期。示例:MONTHDELTA("2008-08-08", 4)等于2008-12-08。',name:"MONTHDELTA",type:"DATETIME"},{def:"NOW():获取当前时间。示例:如果系统时间是2012年5月12日 15点18分38秒则NOW()等于2012-05-12 15:18:36。",name:"NOW",type:"DATETIME"},{def:"NUMTO(number,bool)或NUMTO(number):返回number的中文表示。其中bool用于选择中文表示的方式,当没有bool时采用默认方式显示。示例:NUMTO(2345,true)等于二三四五。示例:NUMTO(2345,false)等于二千三百四十五。示例:NUMTO(2345)等于二千三百四十五。",name:"NUMTO",type:"TEXT"},{def:"NVL(value1,value2,value3,...):在所有参数中返回第一个不是null的值value1:可以为任意数,也可以为null。value2:可以为任意数,也可以为null。当字符串长度为0时, 返回也为null示例:NVL(12,20)等于12。NVL(null,12)等于12。NVL(null,null)等于null。NVL(20,null)等于20。NVL(null,null,10)等于10。",name:"NVL",type:"OTHER"},{def:"OR(logical1,logical2,…): 当所有参数的值为假时,返回FALSE;当任意参数的值为真时,返回TRUE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:OR(1+7=9,5+7=11)等于FALSE。OR(1+7=8,5+7=11)等于TRUE。",name:"OR",type:"LOGIC"},{def:'period_anls(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行上期末的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算的上期末为上年期末或者上月期末。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:period_anls(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年年末的销量;如果参数2为“M”,则计算结果为该日销量上月月末的销量。',name:"PERIOD_ANLS",type:"TABLE_CAL"},{def:"PI(number): 是一个数学常量函数,当number为空时,函数返回精确到15位的数值3.141592653589793;当参数不为空时,number表示PI的倍数。示例:SIN(PI()/2)等于1。计算圆的面积的公式: S=PI()*(r^2),其中S为圆的面积,R为圆的半径。PI(3)等于9.42477796076938。",name:"PI",type:"MATH"},{def:"POWER(number,power): 返回指定数字的乘幂。Number:底数,可以为任意实数。Power:指数。参数number按照该指数次幂乘方。备注: 可以使用符号“^”代替POWER,如: POWER(5,2)等于5^2。示例:POWER(6,2)等于36。POWER(14,5)等于537824。POWER(4,2/3)等于2.519842100。POWER(3,-2.3)等于0.079913677。",name:"POWER",type:"MATH"},{def:"previous_period(x_agg(array))根据横纵轴或行列维度添加的日期字段进行环期值的计算。参数为用于计算的指标,该指标必须为聚合函数或聚合指标。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:previous_period(sum_agg(amount)) 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上一日的销量。",name:"PREVIOUS_PERIOD",type:"TABLE_CAL"},{def:"PROMOTION(value1,value2):返回value2在value1上提升的比例。示例:PROMOTION(12, 14)等于0.166666666,即提升了16.6666666%.PROMOTION(-12, 14)等于2.166666666,即提升了216.6666666%.",name:"PROMOTION",type:"MATH"},{def:'PROPER(text): 将文本中的第一个字母和所有非字母字符后的第一个字母转化成大写,其他字母变为小写。Text:需要转化为文本的公式、由双引号引用的文本串或是单元格引用。示例:PROPER("Finemore Integrated Office")等于“Finemore Integrated Office”。PROPER("100 percent")等于“100 Percent”。PROPER("SpreaDSheEt")等于“Spreadsheet”。',name:"PROPER",type:"TEXT"},{def:"RADIANS(angle): 将角度转换成弧度。Angle:需要转换为弧度的角度。示例:RADIANS(90)等于1.570796327。",name:"RADIANS",type:"MATH"},{def:"RAND(): 返回均匀分布的随机数。每计算一次工作表,函数都会返回一个新的随机数值。备注: 要生成一个位于a和b之间的随机数,可以使用以下的公式: C=RAND()*(b-a)+a。 如果要使一个随机产生的数值不随单元格的重计算而改变,可以在编辑框中输入=RAND()并保持编辑状态,然后按F9,将公式永久性地改为随机数。示例:假如需要生成一个大于等于0,小于60的随机数,使用公式: =RAND()*60。假如需要生成一个大于等于0,小于19的随机数,使用公式: =RAND()*19。假如需要生成一个大于等于0,小于50的随机数,使用公式: =RAND()*50。",name:"RAND",type:"MATH"},{def:"RANDBETWEEN(value1,value2):返回value1和value2之间的一个随机整数。示例:RANDBETWEEN(12.333, 13.233)只会返回13。RANDBETWEEN(11.2, 13.3)有可能返回12或者13。",name:"RANDBETWEEN",type:"MATH"},{def:'rank_anls(x_agg(array),range,order)根据横纵轴或行列维度添加的字段对指标进行跨行排名的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行排名,1为对组内所有行进行排名;第三个参数order为排名的计算规则,"asc"为升序排名,"desc"为降序排名。示例:rank_anls(sum_agg(amount),0,"asc")用户横轴轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算每个省份的销量在所有省份中的升序排名情况。',name:"RANK_ANLS",type:"TABLE_CAL"},{def:'REGEXP(str, pattern):字符串str是否与正则表达式pattern相匹配。示例:REGEXP("aaaaac","a*c")等于true。REGEXP("abc","a*c")等于false。REGEXP(str, pattern, intNumber):字符串str是否与具有给定模式 intNumber的正则表达式pattern相匹配。示例:CASE_INSENSITIVE = 0 启用不区分大小写的匹配。 默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指 定 UNICODE_CASE 标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。 MULTILINE = 1 启用多行模式。DOTALL = 2 启用 dotall 模式。在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行 结束符。UNICODE_CASE = 3 启用 Unicode 感知的大小写折叠。指定此标志后,由 CASE_INSENSITIVE 标志启用时,不区分大小写的匹配将以 符合 Unicode Standard 的方式完成。CANON_EQ = 4 启用规范等价。 指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。UNIX_LINES = 5 启用 Unix 行模式。 在此模式中,.、^ 和 $ 的行为中仅识别 \'\n\' 行结束符。LITERAL = 6 启用模式的字面值解析。 指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的 元字符或转义序列不具有任何特殊意义。 标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志一起使用时将 对匹配产生影响。其他标志都变得多余了。COMMENTS = 7 模式中允许空白和注释。 此模式将忽略空白和在结束行之前以 # 开头的嵌入式注释。 REGEXP("Aaaaabbbbc","a*b*c", 3)等于true。REGEXP("Aaaaabbbbc","a*b*c", 1)等于false。',name:"REGEXP",type:"TEXT"},{def:'REPEAT(text,number_times): 根据指定的次数重复显示文本。REPEAT函数可用来显示同一字符串,并对单元格进行填充。Text:需要重复显示的文本或包含文本的单元格引用。Number_times:指定文本重复的次数,且为正数。如果number_times为0,REPEAT函数将返回“”(空文本)。如果number_times不是整数,将被取整。REPEAT函数的最终结果通常不大于32767个字符。备注: 该函数可被用于在工作表中创建简单的直方图。示例:REPEAT("$",4)等于“$$$$”。如果单元格B10的内容为“你好”,REPEAT(B10,3)等于“你好你好你好”。',name:"REPEAT",type:"TEXT"},{def:'REPLACE(text, texttoreplace, replacetext):根据指定字符串,用其他文本来代替原始文本中的内容。text:需要被替换部分字符的文本或单元格引用。texttoreplace:指定的字符串。replacetext:需要替换部分旧文本的文本。示例:REPLACE("abcd", "a", "re")等于"rebcd"。REPLACE("a**d", "**d", "rose")等于"arose"。REPLACE(old_text,start_num,num_chars,new_text): 根据指定的字符数,用其他文本串来替换某个文本串中的部分内容。Old_text:需要被替换部分字符的文本或单元格引用。Start_num:需要用new_text来替换old_text中字符的起始位置。Num_chars:需要用new_text来替换old_text中字符的个数。New_text:需要替换部分旧文本的文本。示例:REPLACE("0123456789",5,4,"*")等于“0123*89”。REPLACE("1980",3,2,"99")等于“1999”。',name:"REPLACE",type:"TEXT"},{def:'RIGHT(text,num_chars): 根据指定的字符数从右开始返回文本串中的最后一个或几个字符。Text:包含需要提取字符的文本串或单元格引用。Num_chars:指定RIGHT函数从文本串中提取的字符数。Num_chars不能小于0。如果num_chars大于文本串长度,RIGHT函数将返回整个文本。如果不指定num_chars,则默认值为1。示例:RIGHT("It is interesting",6)等于“esting”。RIGHT("Share Holder")等于“r”。RIGHT("Huge sale",4)等于“sale”。',name:"RIGHT",type:"TEXT"},{def:"ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.",name:"ROUND",type:"MATH"},{def:"ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.",name:"ROUND",type:"COMMON"},{def:'same_period(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行同期值的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算同期时计算某日的年同期或者某日的月同期。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:same_period(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年同日的销量;如果参数2为“M”,则计算结果为该日销量上月同日的销量。',name:"SAME_PERIOD",type:"TABLE_CAL"},{def:'SECOND(serial_number):返回某一指定时间的秒数,其值是介于0与59之间的一个整数。Serial_number:包含所求秒数的时间。示例:SECOND("15:36:25")等于25。SECOND("15:36:25", "HH:mm:ss")等于25。',name:"SECOND",type:"DATETIME"},{def:"SIGN(number):返回数字的符号。当数字为正数时返回 1,为零时返回 0,为负数时返回 -1。Number:为任意实数。示例:SIGN(10) 等于 1SIGN(4-4) 等于 0SIGN(-0.00001) 等于 -1",name:"SIGN",type:"MATH"},{def:"SIN(number): 计算给定角度的正弦值。Number:待求正弦值的以弧度表示的角度。备注: 如果参数的单位是度,将其乘以PI()/180即可转换成弧度。示例:SIN(10)等于-0.5440211108893698。SIN(45*PI()/180)等于0.707106781。",name:"SIN",type:"MATH"},{def:'SPLIT(String1,String2):返回由String2分割String1组成的字符串数组。String1:以双引号表示的字符串。String2:以双引号表示的分隔符。例如逗号","示例:SPLIT("hello,world,yes",",") = ["hello","world","yes"]。SPLIT("this is very good"," ") = ["this","is","very","good"]。备注:如果只有一个参数,则返回一个错误。如果有多个参数,则只有前两个起作用。',name:"SPLIT",type:"TEXT"},{def:"SQRT(number): 返回一个正数的平方根。Number:要求其平方根的任一正数。备注:Number必须是一个正数,否则函数返回错误信息*NUM!。示例:SQRT(64)等于8。SQRT(-64)返回*NUM!。",name:"SQRT",type:"MATH"},{def:'STARTWITH(str1,str2):判断字符串str1是否以str2开始。备注: str1和str2都是大小写敏感的。示例:STARTWITH("FineReport","Fine")等于true。STARTWITH("FineReport","Report")等于false。STARTWITH("FineReport","fine")等于false。',name:"STARTWITH",type:"TEXT"},{def:"STDEV_AGG(array): 根据当前分析维度,动态返回指标字段的标准差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段STDEV_AGG(销量)返回的值为每日的销量标准差;当用户横轴为维度字段'月'时,STDEV_AGG(销量)返回的值为每月的销量标准差。",name:"STDEV_AGG",type:"AGG"},{def:'SUBSTITUTE(text,old_text,new_text,instance_num): 用new_text替换文本串中的old_text。Text:需要被替换字符的文本,或含有文本的单元格引用。Old_text:需要被替换的部分文本。New_text:用于替换old_text的文本。Instance_num:指定用new_text来替换第几次出现的old_text。如果指定了instance_num,则只有指定位置上的old_text被替换,否则文字串中出现的所有old_text都被new_text替换。备注: 如果需要替换文本串中的指定文本,则使用SUBSTITUTE函数;如果需要替换文本串中指定位置上的任意文本,则使用REPLACE函数。示例:SUBSTITUTE("data base","base","model")等于“data model”。SUBSTITUTE("July 28, 2000","2","1",1)等于“July 18, 2000”。SUBSTITUTE("July 28, 2000","2","1")等于“July 18, 1000”。SUBSTITUTE("July 28, 2000","2","1",2)等于“July 28, 1000”。 ',name:"SUBSTITUTE",type:"TEXT"},{def:"SUM_AGG(array):根据当前分析维度,动态返回指标字段的汇总求和值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段'日'时,纵轴的计算字段SUM_AGG(销量)返回的值为每日的汇总销量;当用户横轴为维度字段'月'时,SUM_AGG(销量)返回的值为每月的汇总销量。",name:"SUM_AGG",type:"AGG"},{def:"switch(表达式, 值1, 结果1, 值2, 结果2, ...)如果表达式的结果是值1,整个函数返回结果1如果表达式的结果是值2,整个函数返回结果2如果表达式的结果是值3,整个函数返回结果3等等",name:"SWITCH",type:"LOGIC"},{def:"TAN(number): 返回指定角度的正切值。Number:待求正切值的角度,以弧度表示。如果参数是以度为单位的,乘以Pi()/180后转换为弧度。示例:TAN(0.8)等于1.029638557。TAN(45*Pi()/180)等于1。",name:"TAN",type:"MATH"},{def:"TIME(hour,minute,second): 返回代表指定时间的小数。介于0:00:00(12:00:00 A.M.)与23:59:59(11:59:59 P.M.)之间的时间可返回0到0.99999999之间的对应数值。Hour:介于0到23之间的数。Minute:介于0到59之间的数。Second:介于0到59之间的数。示例:TIME(14,40,0)等于2:40 PM。TIME(19,43,24)等于7:43 PM。",name:"TIME",type:"DATETIME"},{def:'TODATE()函数可以将各种日期形式的参数转换为日期类型。它有三种参数的形式:1 参数是一个日期型的参数,那么直接将这个参数返回。示例:TODATE(DATE(2007,12,12))返回2007年12月12日组成的日期。2 参数是以从1970年1月1日0时0分0秒开始的毫秒数,返回对应的时间。示例:TODATE(1023542354746)返回2002年6月8日。3 参数是日期格式的文本,那么返回这个文本对应的日期。示例:TODATE("2007/10/15")返回2007年10月5日组成的日期。TODATE("2007-6-8")返回2007年6月8日组成的日期。4 有两个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式。示例:TODATE("1/15/07","mm/dd/yy")返回07年1月15日组成的日期。特别的,"yyyyMMdd"是用来解析形如“20081230”之类的日期格式的。比如TODATE("20110830","yyyyMMdd")返回11年08月30日组成的日期5 有三个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式,第三个参数为解析日期的语言,如:zh(中文),en(英文)。示例:TODATE("星期三 1/15/07","EEE mm/dd/yy", "zh")返回07年1月15日组成的日期,使用“zh(中文)”才能够正常解析“星期三”这个字符串。',name:"TODATE",type:"DATETIME"},{def:"TODAY():获取当前日期。示例:如果系统日期是2005年9月10日则TODAY()等于2005-9-10。",name:"TODAY",type:"DATETIME"},{def:'TODOUBLE(text): 将文本转换成Double对象。Text:需要转换的文本。示例:TODOUBLE("123.21")等于 new Double(123.21)。',name:"TODOUBLE",type:"TEXT"},{def:'TOINTEGER(text): 将文本转换成Integer对象。Text:需要转换的文本。示例:TOINTEGER("123")等于 new Integer(123)。',name:"TOINTEGER",type:"TEXT"},{def:'total(x_agg(array),range,agg)根据横纵轴或行列维度添加的字段对指标进行跨行汇总的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行汇总,1为对组内所有行进行汇总;第三个参数agg为汇总的计算规则,"sum"为求和;"avg"为求平均,"max"为求最大值,"min"为求最小值示例:total(sum_agg(array),0,"avg")用户横纵轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算平均每个省份的销量',name:"TOTAL",type:"TABLE_CAL"},{def:'TRIM(text): 清除文本中所有空格,单词间的单个空格除外,也可用于带有不规则空格的文本。Text:需要清除空格的文本。示例:TRIM(" Monthly Report")等于Monthly Report。',name:"TRIM",type:"TEXT"},{def:"TRUNC(number,num_digits):将数字的小数部分截去,返回整数。number:需要截尾取整的数字。num_digits:用于指定取整精度的数字。示例:TRUNC(8.9) 等于 8TRUNC(-8.9) 等于 -8TRUNC(PI()) 等于 3",name:"TRUNC",type:"MATH"},{def:'UPPER(text): 将文本中所有的字符转化为大写。Text:需要转化为大写字符的文本,或是包含文本的单元格引用。示例:UPPER("notes")等于“NOTES”。如果单元格E5的值为“Examples”,则UPPER(E5)等于“EXAMPLES”。',name:"UPPER",type:"TEXT"},{def:"VAR_AGG(array): 根据当前分析维度,动态返回指标字段的方差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段VAR_AGG(销量)返回的值为每日的销量方差;当用户横轴为维度字段'月'时,VAR_AGG(销量)返回的值为每月的销量方差。",name:"VAR_AGG",type:"AGG"},{def:'WEEK(serial_num):返回一个代表一年中的第几周的数字。Serial_num:表示输入的日期。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:WEEK("2010/1/1")等于52。WEEK("2010/1/6")等于1。WEEK(35796)等于1。',name:"WEEK",type:"DATETIME"},{def:"weekdate(year,month,weekOfMonth,dayOfWeek): 返回指定年月的指定周的周几的具体日期。示例:weekdate(2009,10,2,1)返回的是2009年的10月的第二个周的第一天即星期天的日期,返回的是2009-10-04最后一个参数dayOfWeek为-1时,表示这个周的最后一天示例:weekdate(2009,12,1,-1)返回的是2009年的12月的第一个周的最后一天即星期六的日期,返回的是2009-12-05",name:"WEEKDATE",type:"DATETIME"},{def:'WEEKDAY(Serial_number):获取日期并返回星期数。返回值为介于0到6之间的某一整数,分别代表星期中的某一天(从星期日到星期六)。Serial_number:输入的日期备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。举例:WEEKDAY("2005/9/10")等于6(星期六)。WEEKDAY("2005/9/11")等于0(星期日)。WEEKDAY(35796)等于4(星期四)。',name:"WEEKDAY",type:"DATETIME"},{def:'YEAR:(serial_number)返回日期中的年。Year是介于1900和9999之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:YEAR("2000/1/1")等于2000。YEAR("2006/05/05")等于2006。YEAR("1997/04/20")等于1997。YEAR("2000-1-1", "yyyy-MM-dd")等于2000。YEAR("2006-05-05", "yyyy-MM-dd")等于2006。YEAR("1997-04-20", "yyyy-MM-dd")等于1997。YEAR(35796)等于1998。',name:"YEAR",type:"DATETIME"},{def:'YEARDELTA(date, delta):返回指定日期后delta年的日期。示例:YEARDELTA("2008-10-10",10)等于2018-10-10。',name:"YEARDELTA",type:"DATETIME"}]};function Mt(){return new Promise((function(e){e(Bt)}))}function Lt(e){return(Lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ut(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:""})}(n.model.selectedConnection,n.model.search).then((function(e){n.model.tables=e||[]})):n.model.tables=[]},setSearch:function(e){this.model.search=e},setSelectedConnection:function(e){this.model.selectedConnection=e}}),n}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Vt(e,t)}(t,e),n=t,(r=[{key:"state",value:function(){return{connections:[],tables:[],search:"",selectedConnection:""}}}])&&Ut(n.prototype,r),o&&Ut(n,o),t}(v),kt(Ct,"xtype","dec.model.dcm.connection.plugin.redis.table_list"),Nt=jt))||Nt;function qt(e){return(qt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Kt(e,t){for(var n=0;n0?n.model.connections[0]:"";n.connectionTextValue.setValue(e),n.store.setSelectedConnection(e)},"selectedConnection || search":function(){n.store.initTableList()},tables:function(e){n.buttonGroup.populate(n.renderTableList())}}),n}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&zt(e,t)}(t,BI.Widget),n=t,(r=[{key:"render",value:function(){var e=this;return{type:"bi.vtape",hgap:10,bgap:5,items:[{el:{type:"bi.htape",items:[{type:"bi.text_value_combo",ref:function(t){e.connectionTextValue=t},items:[],listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action:function(){var t=e.connectionTextValue.getValue()[0];e.store.setSelectedConnection(t)}}]},{el:{type:"bi.icon_button",cls:"redis-site-font",title:BI.i18nText("Plugin-Redis_Data_Connection"),handler:function(){window.location.href="".concat(Tt,"#management/connection")}},width:25},{el:{type:"bi.icon_button",cls:"redis-refresh-font",title:BI.i18nText("Plugin-Redis_Refresh"),handler:function(){e.store.initData()}},width:25}]},height:25},{el:{type:"bi.htape",items:[{type:"bi.text_editor",height:24,watermark:BI.i18nText("Plugin-Redis_Keys_Pattern"),ref:function(t){e.searchText=t}},{el:{type:"bi.button",minWidth:50,text:BI.i18nText("Plugin-Redis_Keys_Pattern_Search"),handler:function(){e.store.setSearch(e.searchText.getValue())}},width:50}]},height:25},{type:"bi.vtape",items:[{type:"bi.button_group",chooseType:BI.Selection.None,layouts:[{type:"bi.vertical"}],items:[],ref:function(t){e.buttonGroup=t}}]}]}}},{key:"renderConnectionList",value:function(){return this.model.connections.map((function(e){return{text:e,value:e}}))}},{key:"renderTableList",value:function(){return this.model.tables.map((function(e){return{type:ht.xtype,text:e,value:e}}))}},{key:"mounted",value:function(){this.store.initData()}},{key:"getSelectedDatabase",value:function(){return this.model.selectedConnection}}])&&Kt(n.prototype,r),o&&Kt(n,o),t}(),Qt(Wt,"xtype","dec.dcm.connection.plugin.redis.table_list"),Ht=Xt))||Ht)||Ht;n(8);function rn(e){return(rn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function on(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:BI.RegularFormulaInserter.xtype;return new Promise((function(n,r){var o,i=BI.UUID();BI.Popovers.create(i,{type:_,width:900,height:600,header:BI.i18nText("Plugin-JSON_Function_Definition"),body:{type:BI.FormulaOpeartingPanel.xtype,configLoader:Mt,ref:function(e){o=e},inserterType:t,value:e},listeners:[{eventName:BI.Popover.EVENT_CANCEL,action:function(){r(),BI.Popovers.remove(i)}},{eventName:BI.Popover.EVENT_CONFIRM,action:function(){n(o.getValue()),BI.Popovers.remove(i)}}]}).open(i)}))}({formula:0===this.model.inputValue?"":this.model.inputValue},BI.ComplexFormulaInserter.xtype).then((function(e){t.store.setInpueValue(e.formula),t.formulaPane.setValue(e.formula)}))}},{key:"getValue",value:function(){return"int"===this.model.inputType?parseInt("".concat(this.model.inputValue),10):this.model.inputValue}}])&&mn(n.prototype,r),o&&mn(n,o),t}(),vn(fn,"xtype","plugin.report.redis.components.database_index"),ln=pn))||ln)||ln,xn=[{text:BI.i18nText("Plugin-Redis_Set_Parameter_Name")},{text:BI.i18nText("Plugin-Redis_Set_Parameter_Type")},{text:BI.i18nText("Plugin-Redis_Set_Parameter_Value")}],An=[{text:BI.i18nText("Dec-Basic_String"),value:DecCst.Schedule.Parameter.Type.STRING,iconCls:"string-field-font"},{text:BI.i18nText("Dec-Basic_Integer"),value:DecCst.Schedule.Parameter.Type.INTEGER,iconCls:"number-field-font"},{text:BI.i18nText("Dec-Basic_Double"),value:DecCst.Schedule.Parameter.Type.DOUBLE,iconCls:"number-field-font"},{text:BI.i18nText("Dec-Basic_Date"),value:DecCst.Schedule.Parameter.Type.DATE,iconCls:"date-field-font"},{text:BI.i18nText("Dec-Basic_Boolean"),value:DecCst.Schedule.Parameter.Type.BOOLEAN,iconCls:"string-field-font"},{text:BI.i18nText("Dec-Basic_Formula"),value:DecCst.Schedule.Parameter.Type.FORMULA,iconCls:"string-field-font"}];function wn(e){return(wn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Pn(e,t){for(var n=0;n=0)return;a[t]="set-cookie"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+", "+n:n}}),a):a}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function o(){this.message="String contains an invalid character"}o.prototype=new Error,o.prototype.code=5,o.prototype.name="InvalidCharacterError",e.exports=function(e){for(var t,n,i=String(e),a="",u=0,c=r;i.charAt(0|u)||(c="=",u%1);a+=c.charAt(63&t>>8-u%1*8)){if((n=i.charCodeAt(u+=.75))>255)throw new o;t=t<<8|n}return a}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,a){var u=[];u.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&u.push("expires="+new Date(n).toGMTString()),r.isString(o)&&u.push("path="+o),r.isString(i)&&u.push("domain="+i),!0===a&&u.push("secure"),document.cookie=u.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";var r=n(0);function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,function(t){null!==t&&e(t)})},e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(28),i=n(6),a=n(1),u=n(29),c=n(30);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.baseURL&&!u(e.url)&&(e.url=c(e.baseURL,e.url)),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],function(t){delete e.headers[t]}),(e.adapter||a.adapter)(e).then(function(t){return s(e),t.data=o(t.data,t.headers,e.transformResponse),t},function(t){return i(t)||(s(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)})}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t,n){return r.forEach(n,function(n){e=n(e,t)}),e}},function(e,t,n){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t,n){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(7);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new r(e),t(n.reason))})}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o(function(t){e=t}),cancel:e}},e.exports=o},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return function(n){return function(r){function o(){return i(this,o),c(this,l(o).apply(this,arguments))}return f(o,n),u(o,[{key:"_store",value:function(){var n=t.props?t.props.apply(this):void 0;return BI.Models.getModel(e.xtype,n)}}]),o}()}}n.r(t);var b,h,g,v=function(e){function t(){var e,n;i(this,t);for(var r=arguments.length,a=new Array(r),u=0;u0&&void 0!==u[0]?u[0]:{},n=t.url,r=t.type,o=t.headers,i=t.data,a=t.params,e.abrupt("return",vt.a.request({url:n,baseURL:Tt,method:r,headers:Et({},At,{},o,{Authorization:"Bearer ".concat(Pt("fine_auth_token")),"Content-Type":"application/json;charset=UTF-8"}),params:a,paramsSerializer:wt,data:i}).then(It).catch(function(e){console.log(e)}));case 3:case"end":return e.stop()}},e)}),(Rt=function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){xt(i,r,o,a,u,"next",e)}function u(e){xt(i,r,o,a,u,"throw",e)}a(void 0)})}).apply(this,arguments)}function Dt(e){return St({url:e,type:"GET",params:Et({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{_:(new Date).getTime()})})}var Nt,Ct,jt,Bt={vars:[{text:"$$page_number",value:"$$page_number",type:"VARS",def:"当前的页数。"},{text:"$$totalPage_number",value:"$$totalPage_number",type:"VARS",def:"总页数。"}],JSONs:[{def:"ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。",name:"ABS",type:"MATH"},{def:"ABS(number): 返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。示例:ABS(-1.5)等于1.5。ABS(0)等于0。ABS(2.5)等于2.5。",name:"ABS",type:"COMMON"},{def:"acc_sum(x_agg(array),range)根据横纵轴或行列维度添加的字段对指标进行跨行累计的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行累计,1为对组内所有行进行累计示例:acc_sum(sum_agg(array),0)用户横轴轴拖拽销售日期(年分组),则该指标计算结果为,根据销售日期(年)对销量进行分组汇总,然后根据对所有行从上到下进行累加,获得每年的累计销量",name:"ACC_SUM",type:"TABLE_CAL"},{def:"ACOS(number): 返回指定数值的反余弦值。反余弦值为一个角度,返回角度以弧度形式表示。Number:需要返回角度的余弦值。备注: 函数的参数必须在-1和1之间,包括-1和1。 返回的角度值在0和Pi之间。 如果要把返回的角度用度数来表示,用180/PI()乘返回值即可。示例:ACOS(1)等于0(弧度)。ACOS(0.5)等于1.047197551(Pi/3弧度)。ACOS(0.5)*180/PI()等于60(度)。",name:"ACOS",type:"MATH"},{def:"AND(logical1,logical2,…): 当所有参数的值为真时,返回TRUE;当任意参数的值为假时,返回FALSE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:AND(1+7=8,5+7=12)等于TRUE。AND(1+7=8,5+7=11)等于FALSE。如果单元格A1到A4的值分别为TRUE、TRUE、FALSE和TRUE,则:AND(A1:A4)等于FALSE。如果单元格A5的值在0~50之间,则: AND(0 0,b > 0 or a > 0, b < 0时,公式直接成立;a < 0,b > 0, ATAN2(a,b)=PI()-ABS(ATAN(b/a))a < 0,b < 0, ATAN2(a,b)=ABS(ATAN(b/a))-PI() 当x_num与y_num都为0时,ATAN2返回错误信息*DIV/0!。 用角度制显示返回数值时,把返回数值乘以180/PI()。 返回值以弧度表示(返回值大于-pi且小于等于pi)。示例:ATAN2(-2,2)等于2.356194490192345(弧度制的3*pi/4)。ATAN2(2,2)等于0.785398163(弧度制的pi/4)。ATAN2(-2,2)*180/PI()等于135(角度制)。",name:"ATAN2",type:"MATH"},{def:"AVG_AGG(array): 根据当前分析维度,动态返回指标字段的汇总平均值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。 \n 示例:用户横轴为维度字段'日'时,纵轴的计算字段AVG_AGG(销量)返回的值为每日的平均销量;当用户横轴为维度字段'月'时,AVG_AGG(销量)返回的值为每月的平均销量。",name:"AVG_AGG",type:"AGG"},{def:"CEILING(number): 将参数number沿绝对值增大的方向,舍入为最接近的整数Number:指待舍入的数值。CEILING(-2.5)等于-3。CEILING(0.5)等于1。",name:"CEILING",type:"MATH"},{def:"CHAR(number): 根据指定数字返回对应的字符。CHAR函数可将计算机其他类型的数字代码转换为字符。Number:用于指定字符的数字,介于1~65535之间(包括1和65535)。示例:CHAR(88)等于“X”。CHAR(45)等于“-”。",name:"CHAR",type:"TEXT"},{def:'CODE(text): 计算文本串中第一个字符的数字代码。返回的代码对应于计算机使用的字符集。Text:需要计算第一个字符代码的文本或单元格引用。示例:CODE("S")等于83。CODE("Spreadsheet")等于83。',name:"CODE",type:"TEXT"},{def:'CONCATENATE(text1,text2,...): 将数个字符串合并成一个字符串。Text1,text2,...:需要合并成单个文本的文本项,可以是字符,数字或是单元格引用。示例:CONCATENATE("Average ","Price")等于“Average Price”。CONCATENATE("1","2")等于12。',name:"CONCATENATE",type:"TEXT"},{def:"COS(number): 返回一个角度的余弦值。Number:以弧度表示的需要求余弦值的角度。备注: 要把一个角度转换成弧度值,将角度乘于PI()/180。 COS(n*2*PI()+number)=COS(number)(其中n为整数,number从-pi到pi)。示例:COS(0.5)等于0.877582562。COS(30*PI()/180)等于0.866025404。",name:"COS",type:"MATH"},{def:"COUNTD_AGG(array): 根据当前分析维度,动态返回某字段的去重计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段COUNTD_AGG(销量)返回的值为每日的销量的去重个数;当用户横轴为维度字段'月'时,COUNTD_AGG(销量)返回的值为每月的销量的去重个数。\"",name:"COUNTD_AGG",type:"AGG"},{def:"COUNT_AGG(array): 根据当前分析维度,动态返回某字段的计数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段'日'时,纵轴的计算字段COUNT_AGG(销量)返回的值为每日的销量的个数;当用户横轴为维度字段'月'时,COUNT_AGG(销量)返回的值为每月的销量的个数。",name:"COUNT_AGG",type:"AGG"},{def:"DATE(year,month,day): 返回一个表示某一特定日期的系列数。Year:代表年,可为一到四位数。Month:代表月份。若1 month 12,则函数把参数值作为月。若month>12,则函数从年的一月份开始往上累加。例如: DATE(2000,25,2)等于2002年1月2日的系列数。Day:代表日。若日期小于等于某指定月的天数,则函数将此参数值作为日。若日期大于某指定月的天数,则函数从指定月份的第一天开始往上累加。若日期大于两个或多个月的总天数,则函数把减去两个月或多个月的余数加到第三或第四个月上,依此类推。例如:DATE(2000,3,35)等于2000年4月4日的系列数。备注: 若需要处理公式中日期的一部分,如年或月等,则可用此公式。 若年,月和日是函数而不是函数中的常量,则此公式最能体现其作用。示例:DATE(1978, 9, 19) 等于1978-09-19.DATE(1211, 12, 1) 等于1211-12-01. ",name:"DATE",type:"DATETIME"},{def:'DATEDELTA(date, deltadays):返回一个日期date后deltadays的日期。deltaDays可以为正值,负值,零。示例:DATEDELTA("2008-08-08", -10)等于2008-07-29。DATEDELTA("2008-08-08", 10)等于2008-08-18。',name:"DATEDELTA",type:"DATETIME"},{def:'DATEDIF(start_date,end_date,unit):返回两个指定日期间的天数、月数或年数。Start_date:代表所指定时间段的初始日期。End_date:代表所指定时间段的终止日期。Unit:函数返回信息的类型。若unit=“Y”,则DATEDIF返回指定时间段的年差数。若unit=“M”,则DATEDIF返回指定时间段的月差数。若unit=“D”,则DATEDIF返回指定时间段的日差数。若unit=“MD”,则DATEDIF忽略年和月,返回指定时间段的日差数。若unit=“YM”,则DATEDIF忽略年和日,返回指定时间段的月差数。若unit=“YD”,则DATEDIF忽略年,返回指定时间段的日差数。示例:DATEDIF("2001/2/28","2004/3/20","Y")等于3,即在2001年2月28日与2004年3月20日之间有3个整年。DATEDIF("2001/2/28","2004/3/20","M")等于37,即在2001年2月28日与2004年3月20日之间有36个整月。DATEDIF("2001/2/28","2004/3/20","D")等于1116,即在2001年2月28日与2004年3月20日之间有1116个整天。DATEDIF("2001/2/28","2004/3/20","MD")等于8,即忽略月和年后,2001年2月28日与2004年3月20日的差为8天。DATEDIF("2001/1/28","2004/3/20","YM")等于2,即忽略日和年后,2001年1月28日与2004年3月20日的差为2个月。DATEDIF("2001/2/28","2004/3/20","YD")等于21,即忽略年后,2001年2月28日与2004年3月20日的差为21天。',name:"DATEDIF",type:"DATETIME"},{def:'DATESUBDATE(date1, date2, op):返回两个日期之间的时间差。op表示返回的时间单位:"s",以秒为单位。"m",以分钟为单位。"h",以小时为单位。"d",以天为单位。"w",以周为单位。示例:DATESUBDATE("2008-08-08", "2008-06-06","h")等于1512。',name:"DATESUBDATE",type:"DATETIME"},{def:'DATETONUMBER(date):返回自 1970 年 1 月 1 日 00:00:00 GMT 经过的毫秒数。示例:DATETONUMBER("2008-08-08")等于1218124800000。',name:"DATETONUMBER",type:"DATETIME"},{def:'DAY:(serial_number)返回日期中的日。DAY是介于1和31之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAY("2000/1/1")等于1。DAY("2006/05/05")等于5。DAY("1997/04/20")等于20。DAY("2000-1-1", "yyyy-MM-dd")等于1。DAY("2006-05-05", "yyyy-MM-dd")等于5。DAY("1997-04-20", "yyyy-MM-dd")等于20。DAY(35796)等于1。',name:"DAY",type:"DATETIME"},{def:'DAYS360(start_date,end_date,method):按照一年 360 天的算法(每个月以 30 天计,一年共计 12 个月),返回两日期间相差的天数,这在会计计算中将会用到。如果财务系统是基于一年 12 个月,每月 30 天,可用此函数帮助计算支付款项。Start_date 和 end_date :是用于计算期间天数的起止日期。Method : 它指定了在计算中是采用欧洲方法还是美国方法。Method 定义 :FALSE或忽略 美国方法 (NASD)。如果起始日期是一个月的 31 号,则等于同月的 30 号。如果终止日期是一个月的31号,并且起始日期早于 30 号,则终止日期等于下一个月的 1 号,否则,终止日期等于本月的 30 号。TRUE 欧洲方法。无论是起始日期还是终止日期为一个月的 31 号,都将等于本月的 30 号。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:DAYS360("1998/1/30", "1998/2/1") 等于 1',name:"DAYS360",type:"DATETIME"},{def:'DAYSOFMONTH(date):返回从1900年1月后某年某月包含的天数。示例:DAYSOFMONTH("1900-02-01")等于28。DAYSOFMONTH("2008/04/04")等于30。',name:"DAYSOFMONTH",type:"DATETIME"},{def:'DAYSOFQUARTER(date): 返回从1900年1月后某年某季度的天数。示例:DAYSOFQUARTER("2009-02-01")等于90。DAYSOFQUARTER("2009/05/05")等于91。',name:"DAYSOFQUARTER",type:"DATETIME"},{def:'DAYSOFYEAR(year):返回某年包含的天数。示例:DAYSOFYEAR(2008)等于365,等价于DAYSOFYEAR("2008-01-01")。',name:"DAYSOFYEAR",type:"DATETIME"},{def:'DAYVALUE(date):返回1900年至 date日期所经历的天数。示例:DAYVALUE("2008/08/08")等于39669。',name:"DAYVALUE",type:"DATETIME"},{def:"DEGREES(angle): 将弧度转化为度。angle:待转换的弧度角。示例:DEGREES(PI()/2)等于90。DEGREES(3.1415926)等于179.9999969。",name:"DEGREES",type:"MATH"},{def:'ENDWITH(str1,str2):判断字符串str1是否以str2结束。备注: str1和str2都是大小写敏感的。示例:ENDWITH("FineReport","Report")等于true。ENDWITH("FineReport","Fine")等于false。ENDWITH("FineReport","report")等于false。',name:"ENDWITH",type:"TEXT"},{def:'EXACT(text1,text2): 检测两组文本是否相同。如果完全相同,EXACT函数返回TRUE;否则,返回FALSE。EXACT函数可以区分大小写,但忽略格式的不同。同时也可以利用EXACT函数来检测输入文档的文字。Text1:需要比较的第一组文本。Text2:需要比较的第二组文本。示例:EXACT("Spreadsheet","Spreadsheet")等于TRUE。EXACT("Spreadsheet","S preadsheet")等于FALSE。EXACT("Spreadsheet","spreadsheet")等于FALSE。',name:"EXACT",type:"TEXT"},{def:"EXP(number): 返回e的n次幂。常数e为自然对数的底数,等于2.71828182845904。Number:为任意实数,作为常数e的指数。备注: 如果要返回其他常数作为底数的幂,可以使用指数运算符(^)。例如: 在4^2中,4是底数,而2是指数。 EXP函数与LN函数互为反函数。示例:EXP(0)等于1。EXP(3)等于20.08553692。EXP(LN(2))等于2。",name:"EXP",type:"MATH"},{def:"FACT(number):返回数的阶乘,一个数的阶乘等于 1*2*3*...*该数。number:要计算其阶乘的非负数。如果输入的 number 不是整数,则截尾取整。示例:FACT(1) 等于 1FACT(1.9) 等于 FACT(1) 等于 1FACT(0) 等于 1FACT(5) 等于 1*2*3*4*5 等于 120",name:"FACT",type:"MATH"},{def:'FIND(find_text,within_text,start_num):从指定的索引(start_num)处开始,返回第一次出现的指定子字符串(find_text)在此字符串(within_text)中的索引。Find_text:需要查找的文本或包含文本的单元格引用。Within_text:包含需要查找文本的文本或单元格引用。Start_num:指定进行查找字符的索引位置。within_text里的索引从1开始。如果省略start_num,则假设值为1。备注: 如果find_text不在within_text中,FIND函数返回值为0。 如果start_num不大于0,FIND函数返回错误信息*VALUE!。 如果start_num大于within_text的长度,FIND函数返回值为0。 如果find_text是空白文本,FIND函数将在搜索串中匹配第一个字符(即编号为start_num或1的字符)。示例:FIND("I","Information")等于1。FIND("i","Information")等于9。FIND("o","Information",2)等于4。FIND("o","Information",12)等于0。FIND("o","Information",-1)等于*VALUE!。',name:"FIND",type:"TEXT"},{def:"FLOOR(number): 将参数number沿绝对值减小的方向去尾舍入。Number:待舍入的数值。示例:FLOOR(-2.5)等于-2。FLOOR(2.5)等于2。",name:"FLOOR",type:"MATH"},{def:'FORMAT(object,format) : 返回object的format格式。object 需要被格式化对象,可以是String,数字,Object(常用的有Date, Time)。format 格式化的样式。示例FORMAT(1234.5, "#,##0.00") => 1234.50FORMAT(1234.5, "#,##0") => 1234FORMAT(1234.5, "¥#,##0.00") => ¥1234.50FORMAT(1.5, "0%") => 150%FORMAT(1.5, "0.000%") => 150.000%FORMAT(6789, "##0.0E0") => 6.789E3FORMAT(6789, "0.00E00") => 6.79E03FORMAT(date(2007,1,1), "EEEEE, MMMMM dd, yyyy") => 星期一,一月 01,2007FORMAT(date(2007,1,13), "MM/dd/yyyy") => 01/13/2007FORMAT(date(2007,1,13), "M-d-yy") => 1-13-07FORMAT(time(16,23,56), "h:mm:ss a") => 4:23:56 下午',name:"FORMAT",type:"TEXT"},{def:'HOUR(serial_number):返回某一指定时间的小时数。函数指定HOUR为0(0:00)到23(23:00)之间的一个整数。Serial_number:包含所求小时的时间。示例:HOUR("11:32:40")等于11。HOUR("11:32:40", "HH:mm:ss")等于11。',name:"HOUR",type:"DATETIME"},{def:'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first',name:"IF",type:"LOGIC"},{def:'IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。boolean: 用于判断的布尔值,true或者false。number1/string1: 第一个参数,如果boolean为ture,返回这个值。number2/string2: 第二个参数,如果boolean为false,返回这个值。示例:IF(true,2,8)等于2IF(false,"first","second")等于secondIF(true,"first",7)等于first',name:"IF",type:"COMMON"},{def:'INDEXOF(str1,index):返回字符串str1在index位置上的字符。备注: index是从0开始计数的。示例:INDEXOF("FineReport",0)等于\'F\'。INDEXOF("FineReport",2)等于\'n\'。INDEXOF("FineReport",9)等于\'t\'。INDEXOF(array, index):返回数组在index位置上的元素。备注: index是从1开始计数的。示例:String[] array = {"a", "b", "c"}INDEXOF(array, 1)等于"a".',name:"INDEXOF",type:"TEXT"},{def:"INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。",name:"INT",type:"MATH"},{def:"INT(number): 返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。示例:INT(4.8)等于4。INT(-4.8)等于-5。INT(4.3)等于4。INT(-4.3)等于-5。公式INT(A1)将返回A1单元格中的一个正实数的整数数部分。",name:"INT",type:"COMMON"},{def:"ISNULL(object):判断对象中所有的值是否全部都是NULL或者为空字符串。",name:"ISNULL",type:"OTHER"},{def:'LEFT(text,num_chars): 根据指定的字符数返回文本串中的第一个或前几个字符。Text:包含需要选取字符的文本串或单元格引用。Num_chars:指定返回的字符串长度。备注: Num_chars的值必须等于或大于0。 如果num_chars大于整个文本的长度,LEFT函数将返回所有的文本。 如果省略num_chars,则默认值为1。示例:LEFT("Fine software",8)等于“Fine sof”。LEFT("Fine software")等于“F”。如果单元格A3中含有“China”,则LEFT(A3,2)等于“Ch”。',name:"LEFT",type:"TEXT"},{def:"LEN(args): 返回文本串中的字符数或者数组的长度。需要注意的是:参数args为文本串时,空格也计为字符。参数args为数组时,直接返回数组长度。示例:LEN(\"Evermore software\")等于17。LEN(\" \")等于1。LEN(['a','b'])等于2。",name:"LEN",type:"TEXT"},{def:"LN(number):返回一个数的自然对数。自然对数以常数项 e(2.71828182845904)为底。number:是用于计算其自然对数的正实数。示例:LN(86) 等于 4.45437LN(2.7182818) 等于 1LN(EXP(3)) 等于 3EXP(LN(4)) 等于 4",name:"LN",type:"MATH"},{def:"LOG(number,base): 按指定的任意底数,返回数值的对数。Number:需要求对数的正实数。Base:对数的底数。如果省略底数,默认值为10。示例:LOG(16,2)等于4。LOG(10)等于1。LOG(24,3)等于2.892789261。",name:"LOG",type:"MATH"},{def:"LOG10(number):返回以 10 为底的对数。number: 用于常用对数计算的正实数。示例:LOG10(86) 等于 1.934498451LOG10(10) 等于 1LOG10(1E5) 等于 5",name:"LOG10",type:"MATH"},{def:'LOWER(text): 将所有的大写字母转化为小写字母。Text:需要转化为小写字母的文本串。LOWER函数不转化文本串中非字母的字符。示例:LOWER("A.M.10:30")等于“a.m.10:30”。LOWER("China")等于“china”。',name:"LOWER",type:"TEXT"},{def:"LUNAR(year,day,month): 返回当前日期对应的农历时间。year,month,day:分别对应年月日。示例:如果需要查询2011年7月21日对应的农历时间,则只需输入LUNAR(2011,7,21)结果将显示为:辛卯年六月廿一同样,如输入LUNAR(2001,7,21),则显示:辛巳年六月初一 。本公式支持的时间段为1900-2100年。",name:"LUNAR",type:"DATETIME"},{def:"MAX(number1,number2,…): 返回参数列表中的最大值。Number1,number2,…:1到30个需要找出最大值的参数。备注: 参数可以是数字、空白单元格、逻辑值或数字的文本表达式。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。 如果参数中没有任何数字,MAX将返回0。示例:MAX(0.1,0,1.2)等于1.2。",name:"MAX",type:"MATH"},{def:"MAX_AGG(array): 根据当前分析维度,动态返回指标字段的最大值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MAX_AGG(销量)返回的值为每日的最大值销量;当用户横轴为维度字段'月'时,MAX_AGG(销量)返回的值为每月的最大值销量。",name:"MAX_AGG",type:"AGG"},{def:"MEDIAN_AGG(array): 根据当前分析维度,动态返回指标字段的中位数,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MEDIAN_AGG(销量)返回的值为每日的中位数销量;当用户横轴为维度字段'月'时,MEDIAN_AGG(销量)返回的值为每月的中位数销量。",name:"MEDIAN_AGG",type:"AGG"},{def:'MID(text,start_num,num_chars): 返回文本串中从指定位置开始的一定数目的字符,该数目由用户指定。Text:包含要提取字符的文本串。Start_num:文本中需要提取字符的起始位置。文本中第一个字符的start_num为1,依此类推。Num_chars:返回字符的长度。备注: 如果start_num大于文本长度,MID函数返回“”(空文本)。 如果start_num小于文本长度,并且start_num加上num_chars大于文本长度,MID函数将从start_num指定的起始字符直至文本末的所有字符。 如果start_num小于1,MID函数返回错误信息*VALUE!。 如果num_chars是负数,MID函数返回错误信息*VALUE!。示例:MID("Finemore software",10,8)返回“software”。MID("Finemore software",30,5)返回“”(空文本)。MID("Finemore software",0,8)返回*VALUE!。MID("Finemore software",5,-1)返回*VALUE!。',name:"MID",type:"TEXT"},{def:"MIN(number1,number2,…): 返回参数列表中的最小值。Number1,number2,…:1到30个需要找出最小值的参数。备注: 若参数中没有数字,函数MIN将返回0。 参数应为数字、空白单元格、逻辑值或是表示数值的文本串。如果参数是错误值时,MIN将返回错误信息。 如果数组或引用参数中包含可解析文本值,逻辑值,零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。示例:如果B1:B4包含3,6,9,12,则:MIN(B1:B4)等于3。MIN(B1:B4,0)等于0。",name:"MIN",type:"MATH"},{def:'MINUTE(serial_number):返回某一指定时间的分钟数,其值是介于0与59之间的一个整数。serial_number:包含所求分钟数的时间。示例:MINUTE("15:36:25")等于36。MINUTE("15:36:25", "HH:mm:ss")等于36。',name:"MINUTE",type:"DATETIME"},{def:"MIN_AGG(array): 根据当前分析维度,动态返回指标字段的最小值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段MIN_AGG(销量)返回的值为每日的最小值销量;当用户横轴为维度字段'月'时,MIN_AGG(销量)返回的值为每月的最小值销量。",name:"MIN_AGG",type:"AGG"},{def:"MOD(number,divisor):返回两数相除的余数。结果的正负号与除数相同。number:为被除数。divisor:为除数。示例:MOD(3, 2) 等于 1MOD(-3, 2) 等于 1MOD(3, -2) 等于 -1MOD(-3, -2) 等于 -1",name:"MOD",type:"MATH"},{def:'MONTH:(serial_number)返回日期中的月。月是介于1和12之间的一个数。Serial_number:含有所求的月的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:MONTH("2000/1/1")等于1。MONTH("2006/05/05")等于5。MONTH("1997/04/20")等于4。MONTH("2000-1-1", "yyyy-MM-dd")等于1。MONTH("2006-05-05", "yyyy-MM-dd")等于5。MONTH("1997-04-20", "yyyy-MM-dd")等于4。MONTH(35796)等于1。',name:"MONTH",type:"DATETIME"},{def:'MONTHDELTA(date,delta):返回指定日期date后delta个月的日期。示例:MONTHDELTA("2008-08-08", 4)等于2008-12-08。',name:"MONTHDELTA",type:"DATETIME"},{def:"NOW():获取当前时间。示例:如果系统时间是2012年5月12日 15点18分38秒则NOW()等于2012-05-12 15:18:36。",name:"NOW",type:"DATETIME"},{def:"NUMTO(number,bool)或NUMTO(number):返回number的中文表示。其中bool用于选择中文表示的方式,当没有bool时采用默认方式显示。示例:NUMTO(2345,true)等于二三四五。示例:NUMTO(2345,false)等于二千三百四十五。示例:NUMTO(2345)等于二千三百四十五。",name:"NUMTO",type:"TEXT"},{def:"NVL(value1,value2,value3,...):在所有参数中返回第一个不是null的值value1:可以为任意数,也可以为null。value2:可以为任意数,也可以为null。当字符串长度为0时, 返回也为null示例:NVL(12,20)等于12。NVL(null,12)等于12。NVL(null,null)等于null。NVL(20,null)等于20。NVL(null,null,10)等于10。",name:"NVL",type:"OTHER"},{def:"OR(logical1,logical2,…): 当所有参数的值为假时,返回FALSE;当任意参数的值为真时,返回TRUE。Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。示例:OR(1+7=9,5+7=11)等于FALSE。OR(1+7=8,5+7=11)等于TRUE。",name:"OR",type:"LOGIC"},{def:'period_anls(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行上期末的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算的上期末为上年期末或者上月期末。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:period_anls(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年年末的销量;如果参数2为“M”,则计算结果为该日销量上月月末的销量。',name:"PERIOD_ANLS",type:"TABLE_CAL"},{def:"PI(number): 是一个数学常量函数,当number为空时,函数返回精确到15位的数值3.141592653589793;当参数不为空时,number表示PI的倍数。示例:SIN(PI()/2)等于1。计算圆的面积的公式: S=PI()*(r^2),其中S为圆的面积,R为圆的半径。PI(3)等于9.42477796076938。",name:"PI",type:"MATH"},{def:"POWER(number,power): 返回指定数字的乘幂。Number:底数,可以为任意实数。Power:指数。参数number按照该指数次幂乘方。备注: 可以使用符号“^”代替POWER,如: POWER(5,2)等于5^2。示例:POWER(6,2)等于36。POWER(14,5)等于537824。POWER(4,2/3)等于2.519842100。POWER(3,-2.3)等于0.079913677。",name:"POWER",type:"MATH"},{def:"previous_period(x_agg(array))根据横纵轴或行列维度添加的日期字段进行环期值的计算。参数为用于计算的指标,该指标必须为聚合函数或聚合指标。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:previous_period(sum_agg(amount)) 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上一日的销量。",name:"PREVIOUS_PERIOD",type:"TABLE_CAL"},{def:"PROMOTION(value1,value2):返回value2在value1上提升的比例。示例:PROMOTION(12, 14)等于0.166666666,即提升了16.6666666%.PROMOTION(-12, 14)等于2.166666666,即提升了216.6666666%.",name:"PROMOTION",type:"MATH"},{def:'PROPER(text): 将文本中的第一个字母和所有非字母字符后的第一个字母转化成大写,其他字母变为小写。Text:需要转化为文本的公式、由双引号引用的文本串或是单元格引用。示例:PROPER("Finemore Integrated Office")等于“Finemore Integrated Office”。PROPER("100 percent")等于“100 Percent”。PROPER("SpreaDSheEt")等于“Spreadsheet”。',name:"PROPER",type:"TEXT"},{def:"RADIANS(angle): 将角度转换成弧度。Angle:需要转换为弧度的角度。示例:RADIANS(90)等于1.570796327。",name:"RADIANS",type:"MATH"},{def:"RAND(): 返回均匀分布的随机数。每计算一次工作表,函数都会返回一个新的随机数值。备注: 要生成一个位于a和b之间的随机数,可以使用以下的公式: C=RAND()*(b-a)+a。 如果要使一个随机产生的数值不随单元格的重计算而改变,可以在编辑框中输入=RAND()并保持编辑状态,然后按F9,将公式永久性地改为随机数。示例:假如需要生成一个大于等于0,小于60的随机数,使用公式: =RAND()*60。假如需要生成一个大于等于0,小于19的随机数,使用公式: =RAND()*19。假如需要生成一个大于等于0,小于50的随机数,使用公式: =RAND()*50。",name:"RAND",type:"MATH"},{def:"RANDBETWEEN(value1,value2):返回value1和value2之间的一个随机整数。示例:RANDBETWEEN(12.333, 13.233)只会返回13。RANDBETWEEN(11.2, 13.3)有可能返回12或者13。",name:"RANDBETWEEN",type:"MATH"},{def:'rank_anls(x_agg(array),range,order)根据横纵轴或行列维度添加的字段对指标进行跨行排名的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行排名,1为对组内所有行进行排名;第三个参数order为排名的计算规则,"asc"为升序排名,"desc"为降序排名。示例:rank_anls(sum_agg(amount),0,"asc")用户横轴轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算每个省份的销量在所有省份中的升序排名情况。',name:"RANK_ANLS",type:"TABLE_CAL"},{def:'REGEXP(str, pattern):字符串str是否与正则表达式pattern相匹配。示例:REGEXP("aaaaac","a*c")等于true。REGEXP("abc","a*c")等于false。REGEXP(str, pattern, intNumber):字符串str是否与具有给定模式 intNumber的正则表达式pattern相匹配。示例:CASE_INSENSITIVE = 0 启用不区分大小写的匹配。 默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指 定 UNICODE_CASE 标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。 MULTILINE = 1 启用多行模式。DOTALL = 2 启用 dotall 模式。在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行 结束符。UNICODE_CASE = 3 启用 Unicode 感知的大小写折叠。指定此标志后,由 CASE_INSENSITIVE 标志启用时,不区分大小写的匹配将以 符合 Unicode Standard 的方式完成。CANON_EQ = 4 启用规范等价。 指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。UNIX_LINES = 5 启用 Unix 行模式。 在此模式中,.、^ 和 $ 的行为中仅识别 \'\n\' 行结束符。LITERAL = 6 启用模式的字面值解析。 指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的 元字符或转义序列不具有任何特殊意义。 标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志一起使用时将 对匹配产生影响。其他标志都变得多余了。COMMENTS = 7 模式中允许空白和注释。 此模式将忽略空白和在结束行之前以 # 开头的嵌入式注释。 REGEXP("Aaaaabbbbc","a*b*c", 3)等于true。REGEXP("Aaaaabbbbc","a*b*c", 1)等于false。',name:"REGEXP",type:"TEXT"},{def:'REPEAT(text,number_times): 根据指定的次数重复显示文本。REPEAT函数可用来显示同一字符串,并对单元格进行填充。Text:需要重复显示的文本或包含文本的单元格引用。Number_times:指定文本重复的次数,且为正数。如果number_times为0,REPEAT函数将返回“”(空文本)。如果number_times不是整数,将被取整。REPEAT函数的最终结果通常不大于32767个字符。备注: 该函数可被用于在工作表中创建简单的直方图。示例:REPEAT("$",4)等于“$$$$”。如果单元格B10的内容为“你好”,REPEAT(B10,3)等于“你好你好你好”。',name:"REPEAT",type:"TEXT"},{def:'REPLACE(text, texttoreplace, replacetext):根据指定字符串,用其他文本来代替原始文本中的内容。text:需要被替换部分字符的文本或单元格引用。texttoreplace:指定的字符串。replacetext:需要替换部分旧文本的文本。示例:REPLACE("abcd", "a", "re")等于"rebcd"。REPLACE("a**d", "**d", "rose")等于"arose"。REPLACE(old_text,start_num,num_chars,new_text): 根据指定的字符数,用其他文本串来替换某个文本串中的部分内容。Old_text:需要被替换部分字符的文本或单元格引用。Start_num:需要用new_text来替换old_text中字符的起始位置。Num_chars:需要用new_text来替换old_text中字符的个数。New_text:需要替换部分旧文本的文本。示例:REPLACE("0123456789",5,4,"*")等于“0123*89”。REPLACE("1980",3,2,"99")等于“1999”。',name:"REPLACE",type:"TEXT"},{def:'RIGHT(text,num_chars): 根据指定的字符数从右开始返回文本串中的最后一个或几个字符。Text:包含需要提取字符的文本串或单元格引用。Num_chars:指定RIGHT函数从文本串中提取的字符数。Num_chars不能小于0。如果num_chars大于文本串长度,RIGHT函数将返回整个文本。如果不指定num_chars,则默认值为1。示例:RIGHT("It is interesting",6)等于“esting”。RIGHT("Share Holder")等于“r”。RIGHT("Huge sale",4)等于“sale”。',name:"RIGHT",type:"TEXT"},{def:"ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.",name:"ROUND",type:"MATH"},{def:"ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果 num_digits 大于 0,则舍入到指定的小数位。如果 num_digits 等于 0,则舍入到最接近的整数。如果 num_digits 小于 0,则在小数点左侧进行舍入。示例:ROUND(2.15, 1) 等于 2.2ROUND(2.149, 1) 等于 2.1ROUND(-1.475, 2) 等于 -1.48ROUND(21.5, -1) 等于 20因浮点数存在精度计算丢失问题, 导致计算结果里可能带上9999, 0000这些, 因此加入第三个参数来控制是否需要去除9999. true表示需要过滤9999, 0000这些数据.",name:"ROUND",type:"COMMON"},{def:'same_period(x_agg(array),datepart)根据横纵轴或行列维度添加的日期字段进行同期值的计算。第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算同期时计算某日的年同期或者某日的月同期。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。示例:same_period(sum_agg(amount),"Y") 用户横纵轴拖拽销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年同日的销量;如果参数2为“M”,则计算结果为该日销量上月同日的销量。',name:"SAME_PERIOD",type:"TABLE_CAL"},{def:'SECOND(serial_number):返回某一指定时间的秒数,其值是介于0与59之间的一个整数。Serial_number:包含所求秒数的时间。示例:SECOND("15:36:25")等于25。SECOND("15:36:25", "HH:mm:ss")等于25。',name:"SECOND",type:"DATETIME"},{def:"SIGN(number):返回数字的符号。当数字为正数时返回 1,为零时返回 0,为负数时返回 -1。Number:为任意实数。示例:SIGN(10) 等于 1SIGN(4-4) 等于 0SIGN(-0.00001) 等于 -1",name:"SIGN",type:"MATH"},{def:"SIN(number): 计算给定角度的正弦值。Number:待求正弦值的以弧度表示的角度。备注: 如果参数的单位是度,将其乘以PI()/180即可转换成弧度。示例:SIN(10)等于-0.5440211108893698。SIN(45*PI()/180)等于0.707106781。",name:"SIN",type:"MATH"},{def:'SPLIT(String1,String2):返回由String2分割String1组成的字符串数组。String1:以双引号表示的字符串。String2:以双引号表示的分隔符。例如逗号","示例:SPLIT("hello,world,yes",",") = ["hello","world","yes"]。SPLIT("this is very good"," ") = ["this","is","very","good"]。备注:如果只有一个参数,则返回一个错误。如果有多个参数,则只有前两个起作用。',name:"SPLIT",type:"TEXT"},{def:"SQRT(number): 返回一个正数的平方根。Number:要求其平方根的任一正数。备注:Number必须是一个正数,否则函数返回错误信息*NUM!。示例:SQRT(64)等于8。SQRT(-64)返回*NUM!。",name:"SQRT",type:"MATH"},{def:'STARTWITH(str1,str2):判断字符串str1是否以str2开始。备注: str1和str2都是大小写敏感的。示例:STARTWITH("FineReport","Fine")等于true。STARTWITH("FineReport","Report")等于false。STARTWITH("FineReport","fine")等于false。',name:"STARTWITH",type:"TEXT"},{def:"STDEV_AGG(array): 根据当前分析维度,动态返回指标字段的标准差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段STDEV_AGG(销量)返回的值为每日的销量标准差;当用户横轴为维度字段'月'时,STDEV_AGG(销量)返回的值为每月的销量标准差。",name:"STDEV_AGG",type:"AGG"},{def:'SUBSTITUTE(text,old_text,new_text,instance_num): 用new_text替换文本串中的old_text。Text:需要被替换字符的文本,或含有文本的单元格引用。Old_text:需要被替换的部分文本。New_text:用于替换old_text的文本。Instance_num:指定用new_text来替换第几次出现的old_text。如果指定了instance_num,则只有指定位置上的old_text被替换,否则文字串中出现的所有old_text都被new_text替换。备注: 如果需要替换文本串中的指定文本,则使用SUBSTITUTE函数;如果需要替换文本串中指定位置上的任意文本,则使用REPLACE函数。示例:SUBSTITUTE("data base","base","model")等于“data model”。SUBSTITUTE("July 28, 2000","2","1",1)等于“July 18, 2000”。SUBSTITUTE("July 28, 2000","2","1")等于“July 18, 1000”。SUBSTITUTE("July 28, 2000","2","1",2)等于“July 28, 1000”。 ',name:"SUBSTITUTE",type:"TEXT"},{def:"SUM_AGG(array):根据当前分析维度,动态返回指标字段的汇总求和值,生成结果为一动态数据列,行数与当前分析维度行数一致。\n array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n 示例:用户横轴为维度字段'日'时,纵轴的计算字段SUM_AGG(销量)返回的值为每日的汇总销量;当用户横轴为维度字段'月'时,SUM_AGG(销量)返回的值为每月的汇总销量。",name:"SUM_AGG",type:"AGG"},{def:"switch(表达式, 值1, 结果1, 值2, 结果2, ...)如果表达式的结果是值1,整个函数返回结果1如果表达式的结果是值2,整个函数返回结果2如果表达式的结果是值3,整个函数返回结果3等等",name:"SWITCH",type:"LOGIC"},{def:"TAN(number): 返回指定角度的正切值。Number:待求正切值的角度,以弧度表示。如果参数是以度为单位的,乘以Pi()/180后转换为弧度。示例:TAN(0.8)等于1.029638557。TAN(45*Pi()/180)等于1。",name:"TAN",type:"MATH"},{def:"TIME(hour,minute,second): 返回代表指定时间的小数。介于0:00:00(12:00:00 A.M.)与23:59:59(11:59:59 P.M.)之间的时间可返回0到0.99999999之间的对应数值。Hour:介于0到23之间的数。Minute:介于0到59之间的数。Second:介于0到59之间的数。示例:TIME(14,40,0)等于2:40 PM。TIME(19,43,24)等于7:43 PM。",name:"TIME",type:"DATETIME"},{def:'TODATE()函数可以将各种日期形式的参数转换为日期类型。它有三种参数的形式:1 参数是一个日期型的参数,那么直接将这个参数返回。示例:TODATE(DATE(2007,12,12))返回2007年12月12日组成的日期。2 参数是以从1970年1月1日0时0分0秒开始的毫秒数,返回对应的时间。示例:TODATE(1023542354746)返回2002年6月8日。3 参数是日期格式的文本,那么返回这个文本对应的日期。示例:TODATE("2007/10/15")返回2007年10月5日组成的日期。TODATE("2007-6-8")返回2007年6月8日组成的日期。4 有两个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式。示例:TODATE("1/15/07","mm/dd/yy")返回07年1月15日组成的日期。特别的,"yyyyMMdd"是用来解析形如“20081230”之类的日期格式的。比如TODATE("20110830","yyyyMMdd")返回11年08月30日组成的日期5 有三个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式,第三个参数为解析日期的语言,如:zh(中文),en(英文)。示例:TODATE("星期三 1/15/07","EEE mm/dd/yy", "zh")返回07年1月15日组成的日期,使用“zh(中文)”才能够正常解析“星期三”这个字符串。',name:"TODATE",type:"DATETIME"},{def:"TODAY():获取当前日期。示例:如果系统日期是2005年9月10日则TODAY()等于2005-9-10。",name:"TODAY",type:"DATETIME"},{def:'TODOUBLE(text): 将文本转换成Double对象。Text:需要转换的文本。示例:TODOUBLE("123.21")等于 new Double(123.21)。',name:"TODOUBLE",type:"TEXT"},{def:'TOINTEGER(text): 将文本转换成Integer对象。Text:需要转换的文本。示例:TOINTEGER("123")等于 new Integer(123)。',name:"TOINTEGER",type:"TEXT"},{def:'total(x_agg(array),range,agg)根据横纵轴或行列维度添加的字段对指标进行跨行汇总的计算。第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行汇总,1为对组内所有行进行汇总;第三个参数agg为汇总的计算规则,"sum"为求和;"avg"为求平均,"max"为求最大值,"min"为求最小值示例:total(sum_agg(array),0,"avg")用户横纵轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算平均每个省份的销量',name:"TOTAL",type:"TABLE_CAL"},{def:'TRIM(text): 清除文本中所有空格,单词间的单个空格除外,也可用于带有不规则空格的文本。Text:需要清除空格的文本。示例:TRIM(" Monthly Report")等于Monthly Report。',name:"TRIM",type:"TEXT"},{def:"TRUNC(number,num_digits):将数字的小数部分截去,返回整数。number:需要截尾取整的数字。num_digits:用于指定取整精度的数字。示例:TRUNC(8.9) 等于 8TRUNC(-8.9) 等于 -8TRUNC(PI()) 等于 3",name:"TRUNC",type:"MATH"},{def:'UPPER(text): 将文本中所有的字符转化为大写。Text:需要转化为大写字符的文本,或是包含文本的单元格引用。示例:UPPER("notes")等于“NOTES”。如果单元格E5的值为“Examples”,则UPPER(E5)等于“EXAMPLES”。',name:"UPPER",type:"TEXT"},{def:"VAR_AGG(array): 根据当前分析维度,动态返回指标字段的方差,生成结果为一动态数据列,行数与当前分析维度行数一致。\n \"array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。\n \"示例:用户横轴为维度字段'日'时,纵轴的计算字段VAR_AGG(销量)返回的值为每日的销量方差;当用户横轴为维度字段'月'时,VAR_AGG(销量)返回的值为每月的销量方差。",name:"VAR_AGG",type:"AGG"},{def:'WEEK(serial_num):返回一个代表一年中的第几周的数字。Serial_num:表示输入的日期。备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:WEEK("2010/1/1")等于52。WEEK("2010/1/6")等于1。WEEK(35796)等于1。',name:"WEEK",type:"DATETIME"},{def:"weekdate(year,month,weekOfMonth,dayOfWeek): 返回指定年月的指定周的周几的具体日期。示例:weekdate(2009,10,2,1)返回的是2009年的10月的第二个周的第一天即星期天的日期,返回的是2009-10-04最后一个参数dayOfWeek为-1时,表示这个周的最后一天示例:weekdate(2009,12,1,-1)返回的是2009年的12月的第一个周的最后一天即星期六的日期,返回的是2009-12-05",name:"WEEKDATE",type:"DATETIME"},{def:'WEEKDAY(Serial_number):获取日期并返回星期数。返回值为介于0到6之间的某一整数,分别代表星期中的某一天(从星期日到星期六)。Serial_number:输入的日期备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。举例:WEEKDAY("2005/9/10")等于6(星期六)。WEEKDAY("2005/9/11")等于0(星期日)。WEEKDAY(35796)等于4(星期四)。',name:"WEEKDAY",type:"DATETIME"},{def:'YEAR:(serial_number)返回日期中的年。Year是介于1900和9999之间的一个数。Serial_number:含有所求的年的日期.备注:FineReport将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。在1900年日期系统中,FineReport电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。示例:YEAR("2000/1/1")等于2000。YEAR("2006/05/05")等于2006。YEAR("1997/04/20")等于1997。YEAR("2000-1-1", "yyyy-MM-dd")等于2000。YEAR("2006-05-05", "yyyy-MM-dd")等于2006。YEAR("1997-04-20", "yyyy-MM-dd")等于1997。YEAR(35796)等于1998。',name:"YEAR",type:"DATETIME"},{def:'YEARDELTA(date, delta):返回指定日期后delta年的日期。示例:YEARDELTA("2008-10-10",10)等于2018-10-10。',name:"YEARDELTA",type:"DATETIME"}]};function Mt(){return new Promise(function(e){e(Bt)})}function Lt(e){return(Lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ut(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"",orderValue:arguments.length>2?arguments[2]:void 0})}(n.model.selectedConnection,n.model.search,n.model.orderValue).then(function(e){n.model.tables=e||[]}):n.model.tables=[]},setSearch:function(e,t){this.model.search=e,this.model.orderValue=t},setSelectedConnection:function(e){this.model.selectedConnection=e}}),n}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Vt(e,t)}(t,v),n=t,(r=[{key:"state",value:function(){return{connections:[],tables:[],search:"",orderValue:"",selectedConnection:""}}}])&&Ut(n.prototype,r),o&&Ut(n,o),t}(),kt(Ct,"xtype","dec.model.dcm.connection.plugin.redis.table_list"),Nt=jt))||Nt;function qt(e){return(qt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Kt(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:BI.RegularFormulaInserter.xtype;return new Promise(function(n,r){var o,i=BI.UUID();BI.Popovers.create(i,{type:_,width:900,height:600,header:BI.i18nText("Plugin-JSON_Function_Definition"),body:{type:BI.FormulaOpeartingPanel.xtype,configLoader:Mt,ref:function(e){o=e},inserterType:t,value:e},listeners:[{eventName:BI.Popover.EVENT_CANCEL,action:function(){r(),BI.Popovers.remove(i)}},{eventName:BI.Popover.EVENT_CONFIRM,action:function(){n(o.getValue()),BI.Popovers.remove(i)}}]}).open(i)})}({formula:0===this.model.inputValue?"":this.model.inputValue},BI.ComplexFormulaInserter.xtype).then(function(e){t.store.setInpueValue(e.formula),t.formulaPane.setValue(e.formula)})}},{key:"getValue",value:function(){return"int"===this.model.inputType?parseInt("".concat(this.model.inputValue),10):this.model.inputValue}}])&&on(n.prototype,r),o&&on(n,o),t}(),sn(en,"xtype","plugin.report.redis.components.database_index"),Zt=tn))||Zt)||Zt;function dn(e){return(dn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function mn(e,t){for(var n=0;n0?n.model.connections[0]:"";n.connectionTextValue.setValue(e),n.store.setSelectedConnection(e)},"selectedConnection || search || orderValue":function(){n.store.initTableList()},tables:function(e){n.buttonGroup.populate(n.renderTableList())}}),n}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&gn(e,t)}(t,BI.Widget),n=t,(r=[{key:"render",value:function(){var e=this,t=(this.options.value.datasetData||{}).orderValue,n=void 0===t?0:t,r="string"==typeof n?"formula":"int";return{type:"bi.vtape",hgap:10,bgap:5,items:[{el:{type:"bi.htape",items:[{type:"bi.text_value_combo",ref:function(t){e.connectionTextValue=t},items:[],listeners:[{eventName:BI.TextValueCombo.EVENT_CHANGE,action:function(){var t=e.connectionTextValue.getValue()[0];e.store.setSelectedConnection(t)}}]},{el:{type:"bi.icon_button",cls:"redis-site-font",title:BI.i18nText("Plugin-Redis_Data_Connection"),handler:function(){window.location.href="".concat(Tt,"#management/connection")}},width:25},{el:{type:"bi.icon_button",cls:"redis-refresh-font",title:BI.i18nText("Plugin-Redis_Refresh"),handler:function(){e.store.initData()}},width:25}]},height:25},{el:{type:"bi.htape",items:[{el:{type:T,text:BI.i18nText("Plugin-Redis_Index"),textAlign:"left"},width:24},{type:yn.xtype,value:n,inputType:r,ref:function(t){e.databaseIndex=t},width:24,height:22},{type:"bi.text_editor",height:24,watermark:BI.i18nText("Plugin-Redis_Keys_Pattern"),ref:function(t){e.searchText=t}},{el:{type:"bi.button",minWidth:50,text:BI.i18nText("Plugin-Redis_Keys_Pattern_Search"),handler:function(){e.store.setSearch(e.searchText.getValue(),e.databaseIndex.getValue())}},width:50}]},height:25},{type:"bi.vtape",items:[{type:"bi.button_group",chooseType:BI.Selection.None,layouts:[{type:"bi.vertical"}],items:[],ref:function(t){e.buttonGroup=t}}]}]}}},{key:"renderConnectionList",value:function(){return this.model.connections.map(function(e){return{text:e,value:e}})}},{key:"renderTableList",value:function(){return this.model.tables.map(function(e){return{type:ht.xtype,text:e,value:e}})}},{key:"mounted",value:function(){this.store.initData()}},{key:"getSelectedDatabase",value:function(){return this.model.selectedConnection}}])&&mn(n.prototype,r),o&&mn(n,o),t}(),vn(fn,"xtype","dec.dcm.connection.plugin.redis.table_list"),ln=pn))||ln)||ln,xn=(n(8),[{text:BI.i18nText("Plugin-Redis_Set_Parameter_Name")},{text:BI.i18nText("Plugin-Redis_Set_Parameter_Type")},{text:BI.i18nText("Plugin-Redis_Set_Parameter_Value")}]),An=[{text:BI.i18nText("Dec-Basic_String"),value:DecCst.Schedule.Parameter.Type.STRING,iconCls:"string-field-font"},{text:BI.i18nText("Dec-Basic_Integer"),value:DecCst.Schedule.Parameter.Type.INTEGER,iconCls:"number-field-font"},{text:BI.i18nText("Dec-Basic_Double"),value:DecCst.Schedule.Parameter.Type.DOUBLE,iconCls:"number-field-font"},{text:BI.i18nText("Dec-Basic_Date"),value:DecCst.Schedule.Parameter.Type.DATE,iconCls:"date-field-font"},{text:BI.i18nText("Dec-Basic_Boolean"),value:DecCst.Schedule.Parameter.Type.BOOLEAN,iconCls:"string-field-font"},{text:BI.i18nText("Dec-Basic_Formula"),value:DecCst.Schedule.Parameter.Type.FORMULA,iconCls:"string-field-font"}];function wn(e){return(wn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Pn(e,t){for(var n=0;n