index.js 18 KB

1
  1. (function(l,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("@univerjs/core"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","@univerjs/core","rxjs"],n):(l=typeof globalThis<"u"?globalThis:l||self,n(l.UniverDataValidation={},l.UniverCore,l.rxjs))})(this,function(l,n,_){"use strict";var la=Object.defineProperty;var ua=(l,n,_)=>n in l?la(l,n,{enumerable:!0,configurable:!0,writable:!0,value:_}):l[n]=_;var c=(l,n,_)=>ua(l,typeof n!="symbol"?n+"":n,_);var O;function D(r){return{type:r.type,operator:r.operator,formula1:r.formula1,formula2:r.formula2,allowBlank:r.allowBlank}}function N(r){return{error:r.error,errorStyle:r.errorStyle,errorTitle:r.errorTitle,imeMode:r.imeMode,prompt:r.prompt,promptTitle:r.promptTitle,showDropDown:r.showDropDown,showErrorMessage:r.showErrorMessage,showInputMessage:r.showInputMessage,renderMode:r.renderMode,bizInfo:r.bizInfo}}var h=(r=>(r[r.SETTING=0]="SETTING",r[r.RANGE=1]="RANGE",r[r.OPTIONS=2]="OPTIONS",r[r.ALL=3]="ALL",r))(h||{}),b=Object.defineProperty,w=Object.getOwnPropertyDescriptor,P=(r,a,i,e)=>{for(var t=e>1?void 0:e?w(a,i):a,o=r.length-1,d;o>=0;o--)(d=r[o])&&(t=(e?d(a,i,t):d(t))||t);return e&&t&&b(a,i,t),t},B=(r,a)=>(i,e)=>a(i,e,r);l.DataValidationModel=class extends n.Disposable{constructor(i){super();c(this,"_model",new Map);c(this,"_ruleChange$",new _.Subject);c(this,"ruleChange$",this._ruleChange$.asObservable());c(this,"ruleChangeDebounce$",this.ruleChange$.pipe(_.debounceTime(20)));this._logService=i,this.disposeWithMe({dispose:()=>{this._ruleChange$.complete()}})}_ensureMap(i,e){this._model.has(i)||this._model.set(i,new Map);const t=this._model.get(i);if(t.has(e))return t.get(e);const o={map:new Map,list:[]};return t.set(e,o),o}_addSubUnitRule(i,e,t){const{map:o,list:d}=i,p=(Array.isArray(e)?e:[e]).filter(u=>!o.has(u.uid));typeof t=="number"&&t<d.length?d.splice(t,0,...p):d.push(...p),p.forEach(u=>{o.set(u.uid,u)})}_removeSubUnitRule(i,e){const{map:t,list:o}=i,d=o.findIndex(s=>s.uid===e);d>-1&&(o.splice(d,1),t.delete(e))}_updateSubUnitRule(i,e,t){const{map:o,list:d}=i,s=o.get(e),p=d.findIndex(m=>e===m.uid);if(!s)throw new Error(`Data validation rule is not found, ruleId: ${e}.`);const u={...s};switch(t.type){case h.RANGE:{u.ranges=t.payload;break}case h.SETTING:{Object.assign(u,D(t.payload));break}case h.OPTIONS:{Object.assign(u,N(t.payload));break}case h.ALL:{Object.assign(u,t.payload);break}}return d[p]=u,o.set(e,u),u}_addRuleSideEffect(i,e,t,o){if(!this._ensureMap(i,e).map.get(t.uid))return{rule:t,type:"add",unitId:i,subUnitId:e,source:o}}addRule(i,e,t,o,d){try{const s=this._ensureMap(i,e),u=(Array.isArray(t)?t:[t]).map(m=>this._addRuleSideEffect(i,e,m,o));this._addSubUnitRule(s,t,d),u.forEach(m=>{m&&this._ruleChange$.next(m)})}catch(s){this._logService.error(s)}}updateRule(i,e,t,o,d){try{const s=this._ensureMap(i,e),p=n.Tools.deepClone(s.map.get(t));if(!p)throw new Error(`Data validation rule is not found, ruleId: ${t}.`);const u=this._updateSubUnitRule(s,t,o);this._ruleChange$.next({rule:u,type:"update",unitId:i,subUnitId:e,source:d,updatePayload:o,oldRule:p})}catch(s){this._logService.error(s)}}removeRule(i,e,t,o){try{const d=this._ensureMap(i,e),s=d.map.get(t);s&&(this._removeSubUnitRule(d,t),this._ruleChange$.next({rule:s,type:"remove",unitId:i,subUnitId:e,source:o}))}catch(d){this._logService.error(d)}}getRuleById(i,e,t){return this._ensureMap(i,e).map.get(t)}getRuleIndex(i,e,t){return this._ensureMap(i,e).list.findIndex(d=>d.uid===t)}getRules(i,e){return[...this._ensureMap(i,e).list]}getUnitRules(i){const e=this._model.get(i);if(!e)return[];const t=[];return e.forEach((o,d)=>{t.push([d,o.list])}),t}deleteUnitRules(i){this._model.delete(i)}getSubUnitIds(i){var e,t;return Array.from((t=(e=this._model.get(i))==null?void 0:e.keys())!=null?t:[])}getAll(){return Array.from(this._model.keys()).map(i=>[i,this.getUnitRules(i)])}},l.DataValidationModel=P([B(0,n.ILogService)],l.DataValidationModel);var j=Object.defineProperty,$=Object.getOwnPropertyDescriptor,q=(r,a,i,e)=>{for(var t=e>1?void 0:e?$(a,i):a,o=r.length-1,d;o>=0;o--)(d=r[o])&&(t=(e?d(a,i,t):d(t))||t);return e&&t&&j(a,i,t),t},M=(r,a)=>(i,e)=>a(i,e,r);const G="SHEET_DATA_VALIDATION_PLUGIN";l.DataValidationResourceController=class extends n.Disposable{constructor(a,i,e){super(),this._resourceManagerService=a,this._univerInstanceService=i,this._dataValidationModel=e,this._initSnapshot()}_initSnapshot(){const a=e=>{const t=this._dataValidationModel.getUnitRules(e),o={};return t?(t.forEach(([d,s])=>{o[d]=s}),JSON.stringify(o)):""},i=e=>{if(!e)return{};try{return JSON.parse(e)}catch{return{}}};this.disposeWithMe(this._resourceManagerService.registerPluginResource({pluginName:G,businesses:[n.UniverInstanceType.UNIVER_SHEET],toJson:e=>a(e),parseJson:e=>i(e),onUnLoad:e=>{this._dataValidationModel.deleteUnitRules(e)},onLoad:(e,t)=>{Object.keys(t).forEach(o=>{t[o].forEach(s=>{this._dataValidationModel.addRule(e,o,s,"patched")})})}}))}},l.DataValidationResourceController=q([M(0,n.IResourceManagerService),M(1,n.IUniverInstanceService),M(2,n.Inject(l.DataValidationModel))],l.DataValidationResourceController);var I=(r=>(r.SHEET="sheet",r))(I||{});class R{constructor(){c(this,"_validatorByScopes",new Map);c(this,"_validatorMap",new Map);c(this,"_validatorsChange$",new _.BehaviorSubject(void 0));c(this,"validatorsChange$",this._validatorsChange$.asObservable())}_addValidatorToScope(a,i){this._validatorByScopes.has(i)||this._validatorByScopes.set(i,[]);const e=this._validatorByScopes.get(i);if(e.findIndex(t=>t.id===a.id)>-1)throw new Error(`Validator item with the same id ${a.id} has already been added!`);e.push(a)}_removeValidatorFromScope(a,i){const e=this._validatorByScopes.get(i);if(!e)return;const t=e.findIndex(o=>o.id===a.id);t>-1&&e.splice(t,1)}register(a){return this._validatorMap.set(a.id,a),Array.isArray(a.scopes)?a.scopes.forEach(i=>{this._addValidatorToScope(a,i)}):this._addValidatorToScope(a,a.scopes),this._validatorsChange$.next(),n.toDisposable(()=>{this._validatorMap.delete(a.id),Array.isArray(a.scopes)?a.scopes.forEach(i=>{this._removeValidatorFromScope(a,i)}):this._removeValidatorFromScope(a,a.scopes),this._validatorsChange$.next()})}getValidatorItem(a){return this._validatorMap.get(a)}getValidatorsByScope(a){return this._validatorByScopes.get(a)}}const f={type:n.CommandType.MUTATION,id:"data-validation.mutation.addRule",handler(r,a){if(!a)return!1;const{unitId:i,subUnitId:e,rule:t,index:o,source:d="command"}=a;return r.get(l.DataValidationModel).addRule(i,e,t,d,o),!0}},E={type:n.CommandType.MUTATION,id:"data-validation.mutation.removeRule",handler(r,a){if(!a)return!1;const{unitId:i,subUnitId:e,ruleId:t,source:o="command"}=a,d=r.get(l.DataValidationModel);return Array.isArray(t)?t.forEach(s=>{d.removeRule(i,e,s,o)}):d.removeRule(i,e,t,o),!0}},g={type:n.CommandType.MUTATION,id:"data-validation.mutation.updateRule",handler(r,a){if(!a)return!1;const{unitId:i,subUnitId:e,ruleId:t,payload:o,source:d="command"}=a;return r.get(l.DataValidationModel).updateRule(i,e,t,o,d),!0}},H={type:n.CommandType.COMMAND,id:"data-validation.command.addRule",async handler(r,a){if(r.get(n.ILogService).error("[Deprecated]: `AddDataValidationCommand` is deprecated, please use `AddSheetDataValidationCommand` in `@univerjs/sheets-data-validation` instead!"),!a)return!1;const{rule:e,unitId:t,subUnitId:o}=a,d=r.get(n.ICommandService),s=r.get(n.IUndoRedoService),p={...a,rule:{...a.rule,ranges:[a.rule.range]}},u=[{id:f.id,params:p}],m=[{id:E.id,params:{unitId:t,subUnitId:o,ruleId:e.uid}}];return s.pushUndoRedo({unitID:t,redoMutations:u,undoMutations:m}),await d.executeCommand(f.id,p),!0}},Q={type:n.CommandType.COMMAND,id:"data-validation.command.removeRule",handler(r,a){if(r.get(n.ILogService).error("[Deprecated]: `RemoveDataValidationCommand` is deprecated, please use `RemoveSheetDataValidationCommand` in `@univerjs/sheets-data-validation` instead!"),!a)return!1;const{unitId:e,subUnitId:t,ruleId:o}=a,d=r.get(n.ICommandService),s=r.get(n.IUndoRedoService),p=r.get(l.DataValidationModel),u=[{id:E.id,params:a}],m=[{id:f.id,params:{unitId:e,subUnitId:t,rule:{...p.getRuleById(e,t,o)},index:p.getRuleIndex(e,t,o)}}];return s.pushUndoRedo({undoMutations:m,redoMutations:u,unitID:a.unitId}),d.executeCommand(E.id,a),!0}},F={type:n.CommandType.COMMAND,id:"data-validation.command.updateDataValidationSetting",handler(r,a){if(r.get(n.ILogService).warn("[Deprecated]: `UpdateDataValidationOptionsCommand` is deprecated, please use `UpdateSheetDataValidationOptionsCommand` in `@univerjs/sheets-data-validation` instead!"),!a)return!1;const e=r.get(n.ICommandService),t=r.get(n.IUndoRedoService),o=r.get(l.DataValidationModel),{unitId:d,subUnitId:s,ruleId:p,options:u}=a,m=o.getRuleById(d,s,p);if(!m)return!1;const V={unitId:d,subUnitId:s,ruleId:p,payload:{type:h.OPTIONS,payload:u}},v=[{id:g.id,params:V}],T={unitId:d,subUnitId:s,ruleId:p,payload:{type:h.OPTIONS,payload:N(m)}},S=[{id:g.id,params:T}];return t.pushUndoRedo({unitID:d,redoMutations:v,undoMutations:S}),e.executeCommand(g.id,V),!0}},W={type:n.CommandType.COMMAND,id:"data-validation.command.updateDataValidationOptions",handler(r,a){if(r.get(n.ILogService).error("[Deprecated]: `UpdateDataValidationSettingCommand` is deprecated, please use `UpdateSheetDataValidationSettingCommand` in `@univerjs/sheets-data-validation` instead!"),!a)return!1;const e=r.get(n.ICommandService),t=r.get(n.IUndoRedoService),o=r.get(l.DataValidationModel),d=r.get(R),{unitId:s,subUnitId:p,ruleId:u,setting:m}=a,V=d.getValidatorItem(m.type);if(!V)return!1;const v=o.getRuleById(s,p,u);if(!v)return!1;const T={...v,...m};if(!V.validatorFormula(T,s,p).success)return!1;const S={unitId:s,subUnitId:p,ruleId:u,payload:{type:h.SETTING,payload:{...m,...V.normalizeFormula(T,s,p)}}},oa=[{id:g.id,params:S}],da={unitId:s,subUnitId:p,ruleId:u,payload:{type:h.SETTING,payload:D(v)}},sa=[{id:g.id,params:da}];return t.pushUndoRedo({unitID:s,redoMutations:oa,undoMutations:sa}),e.executeCommand(g.id,S),!0}},x={type:n.CommandType.COMMAND,id:"data-validation.command.removeAll",handler(r,a){if(r.get(n.ILogService).error("[Deprecated]: `RemoveAllDataValidationCommand` is deprecated, please use `RemoveSheetAllDataValidationCommand` in `@univerjs/sheets-data-validation` instead!"),!a)return!1;const{unitId:e,subUnitId:t}=a,o=r.get(n.ICommandService),d=r.get(l.DataValidationModel),s=r.get(n.IUndoRedoService),p=[...d.getRules(e,t)],u={unitId:e,subUnitId:t,ruleId:p.map(v=>v.uid)},m=[{id:E.id,params:u}],V=[{id:f.id,params:{unitId:e,subUnitId:t,rule:p}}];return s.pushUndoRedo({redoMutations:m,undoMutations:V,unitID:e}),o.executeCommand(E.id,u),!0}},J="data-validation.config",y={};var z=Object.defineProperty,K=Object.getOwnPropertyDescriptor,Y=(r,a,i,e)=>{for(var t=e>1?void 0:e?K(a,i):a,o=r.length-1,d;o>=0;o--)(d=r[o])&&(t=(e?d(a,i,t):d(t))||t);return e&&t&&z(a,i,t),t},A=(r,a)=>(i,e)=>a(i,e,r);const X="UNIVER_DATA_VALIDATION_PLUGIN";l.UniverDataValidationPlugin=(O=class extends n.Plugin{constructor(a=y,i,e,t){super(),this._config=a,this._injector=i,this._commandService=e,this._configService=t;const{...o}=n.merge({},y,this._config);this._configService.setConfig(J,o)}onStarting(){[[l.DataValidationModel],[R],[l.DataValidationResourceController]].forEach(a=>this._injector.add(a)),[H,x,F,W,Q,f,g,E].forEach(a=>{this._commandService.registerCommand(a)})}onReady(){this._injector.get(l.DataValidationResourceController)}},c(O,"pluginName",X),c(O,"type",n.UniverInstanceType.UNIVER_SHEET),O),l.UniverDataValidationPlugin=Y([A(1,n.Inject(n.Injector)),A(2,n.ICommandService),A(3,n.IConfigService)],l.UniverDataValidationPlugin),n.DataValidationOperator.BETWEEN+"",n.DataValidationOperator.EQUAL+"",n.DataValidationOperator.GREATER_THAN+"",n.DataValidationOperator.GREATER_THAN_OR_EQUAL+"",n.DataValidationOperator.LESS_THAN+"",n.DataValidationOperator.LESS_THAN_OR_EQUAL+"",n.DataValidationOperator.NOT_BETWEEN+"",n.DataValidationOperator.NOT_EQUAL+"";const Z={[n.DataValidationOperator.BETWEEN]:"dataValidation.ruleName.between",[n.DataValidationOperator.EQUAL]:"dataValidation.ruleName.equal",[n.DataValidationOperator.GREATER_THAN]:"dataValidation.ruleName.greaterThan",[n.DataValidationOperator.GREATER_THAN_OR_EQUAL]:"dataValidation.ruleName.greaterThanOrEqual",[n.DataValidationOperator.LESS_THAN]:"dataValidation.ruleName.lessThan",[n.DataValidationOperator.LESS_THAN_OR_EQUAL]:"dataValidation.ruleName.lessThanOrEqual",[n.DataValidationOperator.NOT_BETWEEN]:"dataValidation.ruleName.notBetween",[n.DataValidationOperator.NOT_EQUAL]:"dataValidation.ruleName.notEqual"},k={[n.DataValidationOperator.BETWEEN]:"dataValidation.errorMsg.between",[n.DataValidationOperator.EQUAL]:"dataValidation.errorMsg.equal",[n.DataValidationOperator.GREATER_THAN]:"dataValidation.errorMsg.greaterThan",[n.DataValidationOperator.GREATER_THAN_OR_EQUAL]:"dataValidation.errorMsg.greaterThanOrEqual",[n.DataValidationOperator.LESS_THAN]:"dataValidation.errorMsg.lessThan",[n.DataValidationOperator.LESS_THAN_OR_EQUAL]:"dataValidation.errorMsg.lessThanOrEqual",[n.DataValidationOperator.NOT_BETWEEN]:"dataValidation.errorMsg.notBetween",[n.DataValidationOperator.NOT_EQUAL]:"dataValidation.errorMsg.notEqual"},aa={[n.DataValidationOperator.BETWEEN]:"dataValidation.textLength.errorMsg.between",[n.DataValidationOperator.EQUAL]:"dataValidation.textLength.errorMsg.equal",[n.DataValidationOperator.GREATER_THAN]:"dataValidation.textLength.errorMsg.greaterThan",[n.DataValidationOperator.GREATER_THAN_OR_EQUAL]:"dataValidation.textLength.errorMsg.greaterThanOrEqual",[n.DataValidationOperator.LESS_THAN]:"dataValidation.textLength.errorMsg.lessThan",[n.DataValidationOperator.LESS_THAN_OR_EQUAL]:"dataValidation.textLength.errorMsg.lessThanOrEqual",[n.DataValidationOperator.NOT_BETWEEN]:"dataValidation.textLength.errorMsg.notBetween",[n.DataValidationOperator.NOT_EQUAL]:"dataValidation.textLength.errorMsg.notEqual"},ta=[n.DataValidationOperator.BETWEEN,n.DataValidationOperator.NOT_BETWEEN];var ea=Object.defineProperty,ia=Object.getOwnPropertyDescriptor,na=(r,a,i,e)=>{for(var t=e>1?void 0:e?ia(a,i):a,o=r.length-1,d;o>=0;o--)(d=r[o])&&(t=(e?d(a,i,t):d(t))||t);return e&&t&&ea(a,i,t),t},U=(r,a)=>(i,e)=>a(i,e,r);const L="{FORMULA1}",C="{FORMULA2}",ra={[n.DataValidationOperator.BETWEEN]:"dataValidation.operators.between",[n.DataValidationOperator.EQUAL]:"dataValidation.operators.equal",[n.DataValidationOperator.GREATER_THAN]:"dataValidation.operators.greaterThan",[n.DataValidationOperator.GREATER_THAN_OR_EQUAL]:"dataValidation.operators.greaterThanOrEqual",[n.DataValidationOperator.LESS_THAN]:"dataValidation.operators.lessThan",[n.DataValidationOperator.LESS_THAN_OR_EQUAL]:"dataValidation.operators.lessThanOrEqual",[n.DataValidationOperator.NOT_BETWEEN]:"dataValidation.operators.notBetween",[n.DataValidationOperator.NOT_EQUAL]:"dataValidation.operators.notEqual"};l.BaseDataValidator=class{constructor(a,i){c(this,"offsetFormulaByRange",!0);c(this,"formulaInput");c(this,"canvasRender",null);c(this,"dropdown");c(this,"optionsInput");c(this,"skipDefaultFontRender");this.localeService=a,this.injector=i}get operatorNames(){return this.operators.map(a=>this.localeService.t(ra[a]))}get titleStr(){return this.localeService.t(this.title)}generateRuleName(a){var e,t;if(!a.operator)return this.titleStr;const i=this.localeService.t(Z[a.operator]).replace(L,(e=a.formula1)!=null?e:"").replace(C,(t=a.formula2)!=null?t:"");return`${this.titleStr} ${i}`}generateRuleErrorMessage(a,i){var t,o;return a.operator?`${this.localeService.t(k[a.operator]).replace(L,(t=a.formula1)!=null?t:"").replace(C,(o=a.formula2)!=null?o:"")}`:this.titleStr}getExtraStyle(a,i,e,t,o){}getRuleFinalError(a,i){return a.showErrorMessage&&a.error?a.error:this.generateRuleErrorMessage(a,i)}isEmptyCellValue(a){return a===""||a===void 0||a===null}normalizeFormula(a,i,e){return{formula1:a.formula1,formula2:a.formula2}}async isValidType(a,i,e){return!0}transform(a,i,e){return a}async validatorIsEqual(a,i,e){const{formula1:t}=i,{value:o}=a;return Number.isNaN(t)?!0:o===t}async validatorIsNotEqual(a,i,e){const{formula1:t}=i;return Number.isNaN(t)?!0:a.value!==t}async validatorIsBetween(a,i,e){const{formula1:t,formula2:o}=i;if(Number.isNaN(t)||Number.isNaN(o))return!0;const d=Math.min(t,o),s=Math.max(t,o);return a.value>=d&&a.value<=s}async validatorIsNotBetween(a,i,e){const{formula1:t,formula2:o}=i;if(Number.isNaN(t)||Number.isNaN(o))return!0;const d=Math.min(t,o),s=Math.max(t,o);return a.value<d||a.value>s}async validatorIsGreaterThan(a,i,e){const{formula1:t}=i;return Number.isNaN(t)?!0:a.value>t}async validatorIsGreaterThanOrEqual(a,i,e){const{formula1:t}=i;return Number.isNaN(t)?!0:a.value>=t}async validatorIsLessThan(a,i,e){const{formula1:t}=i;return Number.isNaN(t)?!0:a.value<t}async validatorIsLessThanOrEqual(a,i,e){const{formula1:t}=i;return Number.isNaN(t)?!0:a.value<=t}async validator(a,i){const{value:e,unitId:t,subUnitId:o}=a,d=this.isEmptyCellValue(e),{allowBlank:s=!0,operator:p}=i;if(d)return s;const u=await this.parseFormula(i,t,o,a.row,a.column);if(!u.isFormulaValid||!await this.isValidType(a,u,i))return!1;if(!n.Tools.isDefine(p))return!0;const m=this.transform(a,u,i);switch(p){case n.DataValidationOperator.BETWEEN:return this.validatorIsBetween(m,u,i);case n.DataValidationOperator.EQUAL:return this.validatorIsEqual(m,u,i);case n.DataValidationOperator.GREATER_THAN:return this.validatorIsGreaterThan(m,u,i);case n.DataValidationOperator.GREATER_THAN_OR_EQUAL:return this.validatorIsGreaterThanOrEqual(m,u,i);case n.DataValidationOperator.LESS_THAN:return this.validatorIsLessThan(m,u,i);case n.DataValidationOperator.LESS_THAN_OR_EQUAL:return this.validatorIsLessThanOrEqual(m,u,i);case n.DataValidationOperator.NOT_BETWEEN:return this.validatorIsNotBetween(m,u,i);case n.DataValidationOperator.NOT_EQUAL:return this.validatorIsNotEqual(m,u,i);default:throw new Error("Unknown operator.")}}},l.BaseDataValidator=na([U(0,n.Inject(n.LocaleService)),U(1,n.Inject(n.Injector))],l.BaseDataValidator),l.AddDataValidationMutation=f,l.DataValidatorRegistryScope=I,l.DataValidatorRegistryService=R,l.RemoveDataValidationMutation=E,l.TWO_FORMULA_OPERATOR_COUNT=ta,l.TextLengthErrorTitleMap=aa,l.UpdateDataValidationMutation=g,l.UpdateRuleType=h,l.getRuleOptions=N,l.getRuleSetting=D,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})});