HEX
Server: Apache/2.4.63 (Unix)
System: Linux Synopilou92 4.4.302+ #72806 SMP Mon Jul 21 23:16:00 CST 2025 x86_64
User: pilou92 (1026)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /volume1/@appstore/Spreadsheet/server/sheet/core/cell_history.js
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CellHistory",{enumerable:true,get:function(){return r}});const e=require("../cell-history");const t=require("@synology-office/logger");const s=require("async");const a=require("../../common/syno-crypto");class r{constructor(t,a,r){this.dbAPI=new e.DatabaseAPI(t,a);this.password=r;this.persistentWorker=(0,s.cargo)(this._worker.bind(this))}isEncrypted(){return!!this.password}destroy(){this.persistentWorker.kill()}getItemCount(){return this.persistentWorker.length()}async query(e,s,r,o){try{const t=await this.dbAPI.query(e,n(s),r,o);const i=e=>{e.numberFormat||="General";if(this.isEncrypted()){e.value=(0,a.decrypt)(e.value,this.password)||""}};if(t){i(t);if(t.previous){i(t.previous)}}return t}catch(e){if(e&&e.message){t.logger.error(e.message)}}return null}async _worker(e){for(const t of e){try{switch(t.type){case"set_data":if(this.isEncrypted()){d(t.changes,this.password)}await this.dbAPI.bulkInsert(t.commandInfo,t.changes);break;case"shift_row":await this.dbAPI.shiftRows(t.sheetId,t.index,t.amount);break;case"shift_column":await this.dbAPI.shiftColumns(t.sheetId,t.index,t.amount);break;case"delete_row":await this.dbAPI.deleteRows(t.sheetId,t.index,t.amount);break;case"delete_column":await this.dbAPI.deleteColumns(t.sheetId,t.index,t.amount);break;case"move_row":await this.dbAPI.moveRows(t.sheetId,t.start,t.amount1,t.amount2);break;case"move_column":await this.dbAPI.moveColumns(t.sheetId,t.start,t.amount1,t.amount2);break;case"sort":await this.dbAPI.sort(t.sheetId,t.range[0],t.range[1],t.range[2],t.range[3],t.rowOrder);break;case"delete_worksheet":await this.dbAPI.deleteWorksheet(t.sheetId);break;case"duplicate_worksheet":await this.dbAPI.duplicateWorksheet(t.sheetId,t.newSheetId,t.editor,t.changedAt);break}}catch(e){console.error(`failed to execute ${t.type}`,e)}}}_addChanges(e,t){const s=e.cmd||"";const a=this.persistentWorker;switch(s){case"value":a.push({type:"set_data",commandInfo:o(t,e.id),changes:i(e.changes,e.nfRefs,e.nfs)});break;case"insert_row":a.push({type:"shift_row",sheetId:n(e.id),index:e.index,amount:e.amount});if(e.data){a.push({type:"set_data",commandInfo:o(t,e.id),changes:i(e.data.changes,e.data.nfRefs,e.data.nfs)})}break;case"insert_col":a.push({type:"shift_column",sheetId:n(e.id),index:e.index,amount:e.amount});if(e.data){a.push({type:"set_data",commandInfo:o(t,e.id),changes:i(e.data.changes,e.data.nfRefs,e.data.nfs)})}break;case"remove_row":a.push({type:"delete_row",sheetId:n(e.id),index:e.index,amount:e.amount});break;case"remove_col":a.push({type:"delete_column",sheetId:n(e.id),index:e.index,amount:e.amount});break;case"move_row":a.push({type:"move_row",sheetId:n(e.id),start:e.start,amount1:e.amount1,amount2:e.amount2});break;case"move_col":a.push({type:"move_column",sheetId:n(e.id),start:e.start,amount1:e.amount1,amount2:e.amount2});break;case"sort":a.push({type:"sort",sheetId:n(e.id),range:e.range,rowOrder:e.rowOrder});break;case"compound":if(Array.isArray(e.actions)){for(const t of e.actions){this._addChanges(t,e.uid)}}break;case"worksheet.delete":a.push({type:"delete_worksheet",sheetId:n(e.id)});break;case"worksheet.create":case"worksheet.undelete":if(e.content){a.push({type:"set_data",commandInfo:o(t,e.id),changes:c(e.content)})}break;case"worksheet.dup":a.push({type:"duplicate_worksheet",sheetId:n(e.id),newSheetId:n(e.newId),editor:e.uid,changedAt:Date.now()});break;default:break}}addChanges(e){return this._addChanges(e,e.uid)}async createDatabaseFromWorksheetContent(e){await this.dbAPI.create();await this.persistentWorker.push({type:"set_data",commandInfo:o(e.uid,e.id),changes:c(e.content)})}}function n(e){return parseInt(e.slice(3),10)}function o(e,t){return{editor:e,sheetId:n(t),changedAt:Date.now(),source:"GENERIC"}}function i(e,t,s){if([e,t,s].some((e=>!Array.isArray(e)))||e.length!==t.length){return[]}return e.map((([e,a,r],n)=>({row:e,col:a,value:JSON.stringify(r),numberFormat:s[t[n]-1]||""})))}function c(e){const t=[];try{const s=new Map([[0,""]]);if(e.style){const t=JSON.parse(e.style);const a=(t.numberFormats??[]).reduce(((e,[t,{fc:s}])=>{e[t]=s;return e}),[]);for(const[e,r]of t.styles){const t=r[5];s.set(e,a[t]||"")}}const a=JSON.parse(e.ws);for(const e in a.cells){if(!Object.prototype.hasOwnProperty.call(a.cells,e)){continue}const r=a.cells[e];for(const a in r){if(!Object.prototype.hasOwnProperty.call(r,a)){continue}const{v:n,s:o}=r[a];if(n===undefined||n===null){continue}t.push({row:parseInt(e,10),col:parseInt(a,10),value:JSON.stringify(n),numberFormat:s.get(o)||""})}}}catch{console.error("failed to parse undelete content",e)}return t}function d(e,t){for(const s of e){s.value=(0,a.encrypt)(s.value,t)||""}}